summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.editorconfig10
-rw-r--r--.gitignore19
-rw-r--r--.gitlab-ci.yml105
-rw-r--r--.gitlab-ci/README.md22
-rwxr-xr-x.gitlab-ci/cache-subprojects.sh11
-rw-r--r--.gitlab-ci/debian-stable.Dockerfile94
-rw-r--r--.gitlab-ci/fedora.Dockerfile96
-rwxr-xr-x.gitlab-ci/meson-junit-report.py114
-rwxr-xr-x.gitlab-ci/run-docker.sh132
-rwxr-xr-x.gitlab-ci/run-tests.sh49
-rw-r--r--.gitlab/issue_templates/Default.md15
-rw-r--r--.gitmodules3
-rw-r--r--AUTHORS6
-rw-r--r--COMMITMENT45
-rw-r--r--COPYING339
-rw-r--r--NEWS2004
-rw-r--r--README.md98
-rw-r--r--RELEASE.md114
-rw-r--r--contrib/deployment-featured.ini4
-rw-r--r--contrib/gnome-software.spec.in190
-rw-r--r--contrib/org.gnome.Software.DeploymentFeatured.xml11
-rw-r--r--contrib/org.gnome.SoftwareDevel.json214
-rw-r--r--data/assets/meson.build11
-rw-r--r--data/assets/org.gnome.Software.Curated.xml121
-rw-r--r--data/assets/org.gnome.Software.Featured.xml262
-rw-r--r--data/assets/up-to-date.svg264
-rw-r--r--data/autostart/org.gnome.Software.desktop.in7
-rw-r--r--data/icons/adaptive-symbolic.svg1
-rw-r--r--data/icons/app-installed-symbolic.svg1
-rw-r--r--data/icons/chat-none-symbolic.svg1
-rw-r--r--data/icons/chat-symbolic.svg1
-rw-r--r--data/icons/cigarette-none-symbolic.svg1
-rw-r--r--data/icons/cigarette-symbolic.svg1
-rw-r--r--data/icons/community-none-symbolic.svg8
-rw-r--r--data/icons/community-symbolic.svg1
-rw-r--r--data/icons/desktop-symbolic.svg1
-rw-r--r--data/icons/emblem-synchronizing-symbolic.svg1
-rw-r--r--data/icons/explore-symbolic.svg1
-rw-r--r--data/icons/external-link-symbolic.svg1
-rw-r--r--data/icons/flag-outline-thin-symbolic.svg1
-rw-r--r--data/icons/flatpak-symbolic.svg4
-rw-r--r--data/icons/graveyard-symbolic.svg1
-rw-r--r--data/icons/hand-open-symbolic.svg2
-rw-r--r--data/icons/heart-filled-symbolic.svg1
-rw-r--r--data/icons/help-link-symbolic.svg1
-rw-r--r--data/icons/hicolor/meson.build6
-rw-r--r--data/icons/hicolor/scalable/org.gnome.Software.svg24
-rw-r--r--data/icons/hicolor/scalable/org.gnome.SoftwareDevel.svg69
-rw-r--r--data/icons/hicolor/symbolic/app-remove-symbolic.svg1
-rw-r--r--data/icons/hicolor/symbolic/org.gnome.Software-symbolic.svg5
-rw-r--r--data/icons/meson.build1
-rw-r--r--data/icons/money-none-symbolic.svg1
-rw-r--r--data/icons/money-symbolic.svg1
-rw-r--r--data/icons/nudity-none-symbolic.svg1
-rw-r--r--data/icons/nudity-symbolic.svg1
-rw-r--r--data/icons/org.gnome.Software.Create.svg70
-rw-r--r--data/icons/org.gnome.Software.Develop.svg44
-rw-r--r--data/icons/org.gnome.Software.Learn.svg10
-rw-r--r--data/icons/org.gnome.Software.Play.svg37
-rw-r--r--data/icons/org.gnome.Software.Socialize.svg23
-rw-r--r--data/icons/org.gnome.Software.Work.svg27
-rw-r--r--data/icons/package-x-generic-symbolic.svg8
-rw-r--r--data/icons/padlock-open-symbolic.svg1
-rw-r--r--data/icons/phone-symbolic.svg1
-rw-r--r--data/icons/pub-symbolic.svg1
-rw-r--r--data/icons/review-symbolic.svg8
-rw-r--r--data/icons/safety-symbolic.svg1
-rw-r--r--data/icons/sign-language-symbolic.svg1
-rw-r--r--data/icons/snap-symbolic.svg8
-rw-r--r--data/icons/strong-language-none-symbolic.svg1
-rw-r--r--data/icons/strong-language-symbolic.svg1
-rw-r--r--data/icons/system-component-addon.svg35
-rw-r--r--data/icons/system-component-application.svg25
-rw-r--r--data/icons/system-component-codecs.svg25
-rw-r--r--data/icons/system-component-driver.svg145
-rw-r--r--data/icons/system-component-firmware.svg145
-rw-r--r--data/icons/system-component-input-sources.svg36
-rw-r--r--data/icons/system-component-language.svg28
-rw-r--r--data/icons/system-component-os-updates.svg28
-rw-r--r--data/icons/system-component-runtime.svg25
-rw-r--r--data/icons/test-symbolic.svg8
-rw-r--r--data/icons/violence-none-symbolic.svg1
-rw-r--r--data/icons/violence-symbolic.svg1
-rw-r--r--data/icons/webpage-symbolic.svg1
-rw-r--r--data/meson.build42
-rw-r--r--data/metainfo/meson.build22
-rw-r--r--data/metainfo/org.gnome.Software.metainfo.xml.in2158
-rw-r--r--data/metainfo/ss-details.pngbin0 -> 85786 bytes
-rw-r--r--data/metainfo/ss-details2.pngbin0 -> 76742 bytes
-rw-r--r--data/metainfo/ss-installed.pngbin0 -> 74175 bytes
-rw-r--r--data/metainfo/ss-overview.pngbin0 -> 93300 bytes
-rw-r--r--data/metainfo/ss-up-to-date.pngbin0 -> 50167 bytes
-rw-r--r--data/metainfo/ss-updates-details.pngbin0 -> 72190 bytes
-rw-r--r--data/metainfo/ss-updates.pngbin0 -> 83230 bytes
-rw-r--r--data/org.gnome.software.external-appstream.policy.in.in20
-rw-r--r--data/org.gnome.software.gschema.xml149
-rw-r--r--data/tests/os-release16
-rw-r--r--doc/api/gnome-software-docs.xml778
-rw-r--r--doc/api/gnome-software.types6
-rw-r--r--doc/api/gs-example-details.pngbin0 -> 53714 bytes
-rw-r--r--doc/api/gs-example-installed.pngbin0 -> 106482 bytes
-rw-r--r--doc/api/gs-example-search.pngbin0 -> 24934 bytes
-rw-r--r--doc/api/meson.build11
-rw-r--r--doc/app-developers.md69
-rw-r--r--doc/design.svg448
-rw-r--r--doc/kudos.md70
-rw-r--r--doc/meson.build3
-rw-r--r--doc/privacy-policy.html31
-rwxr-xr-xdoc/update.sh1
-rw-r--r--doc/use-cases.md38
-rw-r--r--doc/vendor-customisation.md214
-rw-r--r--gnome-software.doap54
-rw-r--r--gs-install-appstream/gs-install-appstream.c227
-rw-r--r--gs-install-appstream/meson.build19
-rw-r--r--lib/README.md7
-rw-r--r--lib/gnome-software-private.h24
-rw-r--r--lib/gnome-software.h41
-rw-r--r--lib/gs-app-collation.h21
-rw-r--r--lib/gs-app-list-private.h51
-rw-r--r--lib/gs-app-list.c1025
-rw-r--r--lib/gs-app-list.h89
-rw-r--r--lib/gs-app-permissions.c430
-rw-r--r--lib/gs-app-permissions.h74
-rw-r--r--lib/gs-app-private.h30
-rw-r--r--lib/gs-app-query.c1173
-rw-r--r--lib/gs-app-query.h108
-rw-r--r--lib/gs-app.c6714
-rw-r--r--lib/gs-app.h524
-rw-r--r--lib/gs-appstream.c2165
-rw-r--r--lib/gs-appstream.h95
-rw-r--r--lib/gs-build-ident.h.in32
-rw-r--r--lib/gs-category-manager.c151
-rw-r--r--lib/gs-category-manager.h32
-rw-r--r--lib/gs-category-private.h21
-rw-r--r--lib/gs-category.c724
-rw-r--r--lib/gs-category.h45
-rw-r--r--lib/gs-cmd.c847
-rw-r--r--lib/gs-debug.c295
-rw-r--r--lib/gs-debug.h27
-rw-r--r--lib/gs-desktop-data.c320
-rw-r--r--lib/gs-desktop-data.h43
-rw-r--r--lib/gs-download-utils.c870
-rw-r--r--lib/gs-download-utils.h88
-rw-r--r--lib/gs-external-appstream-utils.c627
-rw-r--r--lib/gs-external-appstream-utils.h50
-rw-r--r--lib/gs-fedora-third-party.c497
-rw-r--r--lib/gs-fedora-third-party.h93
-rw-r--r--lib/gs-icon.c315
-rw-r--r--lib/gs-icon.h32
-rw-r--r--lib/gs-ioprio.c197
-rw-r--r--lib/gs-ioprio.h31
-rw-r--r--lib/gs-key-colors.c334
-rw-r--r--lib/gs-key-colors.h27
-rw-r--r--lib/gs-metered.c312
-rw-r--r--lib/gs-metered.h35
-rw-r--r--lib/gs-odrs-provider.c1998
-rw-r--r--lib/gs-odrs-provider.h125
-rw-r--r--lib/gs-os-release.c347
-rw-r--r--lib/gs-os-release.h33
-rw-r--r--lib/gs-plugin-event.c453
-rw-r--r--lib/gs-plugin-event.h61
-rw-r--r--lib/gs-plugin-helpers.c338
-rw-r--r--lib/gs-plugin-helpers.h96
-rw-r--r--lib/gs-plugin-job-list-apps.c516
-rw-r--r--lib/gs-plugin-job-list-apps.h31
-rw-r--r--lib/gs-plugin-job-list-categories.c347
-rw-r--r--lib/gs-plugin-job-list-categories.h29
-rw-r--r--lib/gs-plugin-job-list-distro-upgrades.c428
-rw-r--r--lib/gs-plugin-job-list-distro-upgrades.h30
-rw-r--r--lib/gs-plugin-job-manage-repository.c365
-rw-r--r--lib/gs-plugin-job-manage-repository.h26
-rw-r--r--lib/gs-plugin-job-private.h40
-rw-r--r--lib/gs-plugin-job-refine.c860
-rw-r--r--lib/gs-plugin-job-refine.h31
-rw-r--r--lib/gs-plugin-job-refresh-metadata.c531
-rw-r--r--lib/gs-plugin-job-refresh-metadata.h28
-rw-r--r--lib/gs-plugin-job.c502
-rw-r--r--lib/gs-plugin-job.h68
-rw-r--r--lib/gs-plugin-loader-sync.c254
-rw-r--r--lib/gs-plugin-loader-sync.h42
-rw-r--r--lib/gs-plugin-loader.c4172
-rw-r--r--lib/gs-plugin-loader.h122
-rw-r--r--lib/gs-plugin-private.h57
-rw-r--r--lib/gs-plugin-types.h319
-rw-r--r--lib/gs-plugin-vfuncs.h429
-rw-r--r--lib/gs-plugin.c2187
-rw-r--r--lib/gs-plugin.h331
-rw-r--r--lib/gs-remote-icon.c375
-rw-r--r--lib/gs-remote-icon.h37
-rw-r--r--lib/gs-self-test.c786
-rw-r--r--lib/gs-test.c147
-rw-r--r--lib/gs-test.h27
-rw-r--r--lib/gs-utils.c1689
-rw-r--r--lib/gs-utils.h155
-rw-r--r--lib/gs-worker-thread.c425
-rw-r--r--lib/gs-worker-thread.h41
-rw-r--r--lib/meson.build205
-rw-r--r--lib/tools/meson.build24
-rw-r--r--lib/tools/profile-key-colors.c175
-rw-r--r--meson.build328
-rw-r--r--meson_options.txt25
-rwxr-xr-xmeson_post_install.sh14
-rw-r--r--plugins/core/gs-plugin-appstream.c1653
-rw-r--r--plugins/core/gs-plugin-appstream.h22
-rw-r--r--plugins/core/gs-plugin-generic-updates.c148
-rw-r--r--plugins/core/gs-plugin-generic-updates.h22
-rw-r--r--plugins/core/gs-plugin-hardcoded-blocklist.c121
-rw-r--r--plugins/core/gs-plugin-hardcoded-blocklist.h22
-rw-r--r--plugins/core/gs-plugin-icons.c249
-rw-r--r--plugins/core/gs-plugin-icons.h22
-rw-r--r--plugins/core/gs-plugin-os-release.c180
-rw-r--r--plugins/core/gs-plugin-os-release.h22
-rw-r--r--plugins/core/gs-plugin-provenance-license.c199
-rw-r--r--plugins/core/gs-plugin-provenance-license.h22
-rw-r--r--plugins/core/gs-plugin-provenance.c292
-rw-r--r--plugins/core/gs-plugin-provenance.h22
-rw-r--r--plugins/core/gs-plugin-rewrite-resource.c252
-rw-r--r--plugins/core/gs-plugin-rewrite-resource.h22
-rw-r--r--plugins/core/gs-self-test.c277
-rw-r--r--plugins/core/meson.build133
l---------plugins/core/tests/os-release1
-rw-r--r--plugins/dpkg/gs-plugin-dpkg.c133
-rw-r--r--plugins/dpkg/gs-plugin-dpkg.h22
-rw-r--r--plugins/dpkg/gs-self-test.c87
-rw-r--r--plugins/dpkg/meson.build35
-rwxr-xr-xplugins/dpkg/tests/build-deb.sh1
-rw-r--r--plugins/dpkg/tests/chiron-1.1-1.debbin0 -> 806 bytes
-rw-r--r--plugins/dpkg/tests/debian/DEBIAN/control13
-rw-r--r--plugins/dpkg/tests/debian/usr/bin/chiron0
-rw-r--r--plugins/dummy/gs-plugin-dummy.c1104
-rw-r--r--plugins/dummy/gs-plugin-dummy.h22
-rw-r--r--plugins/dummy/gs-self-test.c966
-rw-r--r--plugins/dummy/meson.build35
-rw-r--r--plugins/eos-updater/com.endlessm.Updater.xml292
-rw-r--r--plugins/eos-updater/gs-plugin-eos-updater.c1134
-rw-r--r--plugins/eos-updater/gs-plugin-eos-updater.h22
-rw-r--r--plugins/eos-updater/meson.build25
-rw-r--r--plugins/eos-updater/tests/eos_updater.py414
-rwxr-xr-xplugins/eos-updater/tests/manual-test.py434
-rw-r--r--plugins/epiphany/gs-plugin-epiphany.c1183
-rw-r--r--plugins/epiphany/gs-plugin-epiphany.h20
-rw-r--r--plugins/epiphany/gs-self-test.c240
-rw-r--r--plugins/epiphany/meson.build87
-rw-r--r--plugins/epiphany/org.freedesktop.portal.DynamicLauncher.xml332
-rw-r--r--plugins/epiphany/org.gnome.Epiphany.WebAppProvider.xml85
-rw-r--r--plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in11
-rw-r--r--plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c140
-rw-r--r--plugins/fedora-langpacks/gs-plugin-fedora-langpacks.h22
-rw-r--r--plugins/fedora-langpacks/gs-self-test.c88
-rw-r--r--plugins/fedora-langpacks/meson.build34
-rw-r--r--plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c855
-rw-r--r--plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.h22
-rw-r--r--plugins/fedora-pkgdb-collections/meson.build14
-rw-r--r--plugins/flatpak/gs-flatpak-app.c190
-rw-r--r--plugins/flatpak/gs-flatpak-app.h65
-rw-r--r--plugins/flatpak/gs-flatpak-transaction.c761
-rw-r--r--plugins/flatpak/gs-flatpak-transaction.h31
-rw-r--r--plugins/flatpak/gs-flatpak-utils.c271
-rw-r--r--plugins/flatpak/gs-flatpak-utils.h24
-rw-r--r--plugins/flatpak/gs-flatpak.c4624
-rw-r--r--plugins/flatpak/gs-flatpak.h184
-rw-r--r--plugins/flatpak/gs-plugin-flatpak.c2326
-rw-r--r--plugins/flatpak/gs-plugin-flatpak.h22
-rw-r--r--plugins/flatpak/gs-self-test.c2003
-rw-r--r--plugins/flatpak/meson.build63
-rw-r--r--plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in12
-rw-r--r--plugins/flatpak/tests/app-extension-update/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/libtest/README1
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml12
-rw-r--r--plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/metadata6
-rw-r--r--plugins/flatpak/tests/app-extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README0
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/metainfo/org.test.Chiron.Extension.metainfo.xml12
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/metadata6
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/.gitignore2
-rwxr-xr-xplugins/flatpak/tests/app-extension/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml16
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/applications/org.test.Chiron.desktop6
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.pngbin0 -> 334 bytes
-rw-r--r--plugins/flatpak/tests/app-extension/org.test.Chiron/metadata10
-rw-r--r--plugins/flatpak/tests/app-missing-runtime/.gitignore1
l---------plugins/flatpak/tests/app-missing-runtime/org.test.Chiron1
-rw-r--r--plugins/flatpak/tests/app-update/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/.gitignore2
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml19
l---------plugins/flatpak/tests/app-update/org.test.Chiron/files/share/applications/org.test.Chiron.desktop1
l---------plugins/flatpak/tests/app-update/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png1
-rw-r--r--plugins/flatpak/tests/app-update/org.test.Chiron/metadata4
-rw-r--r--plugins/flatpak/tests/app-with-runtime/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/.gitignore2
-rwxr-xr-xplugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/bin/chiron.sh2
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml16
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/applications/org.test.Chiron.desktop7
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.pngbin0 -> 334 bytes
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Chiron/metadata4
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty0
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/metadata3
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/.gitignore1
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README0
-rw-r--r--plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml10
-rwxr-xr-xplugins/flatpak/tests/build.py125
-rw-r--r--plugins/flatpak/tests/chiron.flatpakbin0 -> 5452 bytes
-rw-r--r--plugins/flatpak/tests/flatpakrepos.tar.gzbin0 -> 72252 bytes
-rw-r--r--plugins/flatpak/tests/meson.build34
-rw-r--r--plugins/flatpak/tests/only-runtime/.gitignore1
l---------plugins/flatpak/tests/only-runtime/org.test.Runtime1
-rw-r--r--plugins/fwupd/gs-fwupd-app.c309
-rw-r--r--plugins/fwupd/gs-fwupd-app.h31
-rw-r--r--plugins/fwupd/gs-plugin-fwupd.c1414
-rw-r--r--plugins/fwupd/gs-plugin-fwupd.h22
-rw-r--r--plugins/fwupd/gs-self-test.c111
-rw-r--r--plugins/fwupd/meson.build54
-rw-r--r--plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in12
-rwxr-xr-xplugins/fwupd/tests/build-cab.sh4
-rw-r--r--plugins/fwupd/tests/chiron-0.2.cabbin0 -> 34376 bytes
-rw-r--r--plugins/fwupd/tests/firmware.dfubin0 -> 32784 bytes
-rw-r--r--plugins/fwupd/tests/firmware.dfu.asc11
-rw-r--r--plugins/fwupd/tests/firmware.metainfo.xml30
-rw-r--r--plugins/malcontent/gs-plugin-malcontent.c480
-rw-r--r--plugins/malcontent/gs-plugin-malcontent.h22
-rw-r--r--plugins/malcontent/meson.build14
-rw-r--r--plugins/meson.build43
-rw-r--r--plugins/modalias/gs-plugin-modalias.c199
-rw-r--r--plugins/modalias/gs-plugin-modalias.h22
-rw-r--r--plugins/modalias/gs-self-test.c113
-rw-r--r--plugins/modalias/meson.build36
-rw-r--r--plugins/packagekit/gs-markdown.c856
-rw-r--r--plugins/packagekit/gs-markdown.h41
-rw-r--r--plugins/packagekit/gs-packagekit-helper.c141
-rw-r--r--plugins/packagekit/gs-packagekit-helper.h37
-rw-r--r--plugins/packagekit/gs-packagekit-task.c280
-rw-r--r--plugins/packagekit/gs-packagekit-task.h38
-rw-r--r--plugins/packagekit/gs-plugin-packagekit.c4080
-rw-r--r--plugins/packagekit/gs-plugin-packagekit.h22
-rw-r--r--plugins/packagekit/gs-self-test.c275
-rw-r--r--plugins/packagekit/meson.build50
-rw-r--r--plugins/packagekit/packagekit-common.c585
-rw-r--r--plugins/packagekit/packagekit-common.h41
-rwxr-xr-xplugins/packagekit/tests/build-rpm.sh2
-rw-r--r--plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpmbin0 -> 6414 bytes
-rw-r--r--plugins/packagekit/tests/chiron.spec22
-rw-r--r--plugins/repos/gs-plugin-repos.c422
-rw-r--r--plugins/repos/gs-plugin-repos.h22
-rw-r--r--plugins/repos/gs-self-test.c71
-rw-r--r--plugins/repos/meson.build35
-rw-r--r--plugins/repos/tests/yum.repos.d/utopia.repo5
-rw-r--r--plugins/rpm-ostree/gs-plugin-rpm-ostree.c2878
-rw-r--r--plugins/rpm-ostree/gs-plugin-rpm-ostree.h22
-rw-r--r--plugins/rpm-ostree/meson.build23
-rw-r--r--plugins/rpm-ostree/org.projectatomic.rpmostree1.xml458
-rw-r--r--plugins/snap/gs-plugin-snap.c1924
-rw-r--r--plugins/snap/gs-plugin-snap.h22
-rw-r--r--plugins/snap/gs-self-test.c395
-rw-r--r--plugins/snap/meson.build48
-rw-r--r--plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in12
-rw-r--r--po/LINGUAS69
-rw-r--r--po/POTFILES.in123
-rw-r--r--po/POTFILES.skip1
-rw-r--r--po/ab.po5089
-rw-r--r--po/af.po5120
-rw-r--r--po/ar.po5166
-rw-r--r--po/as.po2007
-rw-r--r--po/be.po5503
-rw-r--r--po/bg.po5318
-rw-r--r--po/bn.po3883
-rw-r--r--po/bs.po2321
-rw-r--r--po/ca.po5458
-rw-r--r--po/ca@valencia.po4789
-rw-r--r--po/ckb.po4174
-rw-r--r--po/cs.po5328
-rw-r--r--po/da.po5962
-rw-r--r--po/de.po6521
-rw-r--r--po/el.po7392
-rw-r--r--po/en_GB.po6776
-rw-r--r--po/eo.po5401
-rw-r--r--po/es.po7528
-rw-r--r--po/eu.po6027
-rw-r--r--po/fa.po6393
-rw-r--r--po/fi.po7208
-rw-r--r--po/fr.po5407
-rw-r--r--po/fur.po7220
-rw-r--r--po/ga.po2331
-rw-r--r--po/gd.po5097
-rw-r--r--po/gl.po6127
-rw-r--r--po/he.po6842
-rw-r--r--po/hi.po3882
-rw-r--r--po/hr.po7404
-rw-r--r--po/hu.po5330
-rw-r--r--po/id.po5323
-rw-r--r--po/ie.po3681
-rw-r--r--po/is.po5751
-rw-r--r--po/it.po5436
-rw-r--r--po/ja.po5434
-rw-r--r--po/ka.po5118
-rw-r--r--po/kab.po4211
-rw-r--r--po/kk.po6956
-rw-r--r--po/km.po1900
-rw-r--r--po/ko.po5318
-rw-r--r--po/lt.po7269
-rw-r--r--po/lv.po6436
-rw-r--r--po/meson.build6
-rw-r--r--po/mjw.po4203
-rw-r--r--po/ml.po3961
-rw-r--r--po/mr.po3881
-rw-r--r--po/ms.po4380
-rw-r--r--po/nb.po5246
-rw-r--r--po/ne.po6302
-rw-r--r--po/nl.po7243
-rw-r--r--po/oc.po7404
-rw-r--r--po/pa.po7495
-rw-r--r--po/pl.po5377
-rw-r--r--po/pt.po6562
-rw-r--r--po/pt_BR.po5558
-rw-r--r--po/ro.po6842
-rw-r--r--po/ru.po5431
-rw-r--r--po/sk.po7076
-rw-r--r--po/sl.po7465
-rw-r--r--po/sr.po7332
-rw-r--r--po/sr@latin.po5220
-rw-r--r--po/sv.po7227
-rw-r--r--po/te.po1812
-rw-r--r--po/th.po2974
-rw-r--r--po/tr.po5258
-rw-r--r--po/uk.po6142
-rw-r--r--po/vi.po6374
-rw-r--r--po/zh_CN.po6996
-rw-r--r--po/zh_HK.po2086
-rw-r--r--po/zh_TW.po7094
-rw-r--r--src/gnome-software-local-file-flatpak.desktop.in11
-rw-r--r--src/gnome-software-local-file-fwupd.desktop.in11
-rw-r--r--src/gnome-software-local-file-packagekit.desktop.in11
-rw-r--r--src/gnome-software-local-file-snap.desktop.in11
-rw-r--r--src/gnome-software.gresource.xml110
-rw-r--r--src/gnome-software.xml74
-rw-r--r--src/gs-age-rating-context-dialog.c1253
-rw-r--r--src/gs-age-rating-context-dialog.h49
-rw-r--r--src/gs-age-rating-context-dialog.ui80
-rw-r--r--src/gs-app-addon-row.c315
-rw-r--r--src/gs-app-addon-row.h29
-rw-r--r--src/gs-app-addon-row.ui78
-rw-r--r--src/gs-app-context-bar.c988
-rw-r--r--src/gs-app-context-bar.h31
-rw-r--r--src/gs-app-context-bar.ui249
-rw-r--r--src/gs-app-details-page.c451
-rw-r--r--src/gs-app-details-page.h29
-rw-r--r--src/gs-app-details-page.ui97
-rw-r--r--src/gs-app-reviews-dialog.c559
-rw-r--r--src/gs-app-reviews-dialog.h38
-rw-r--r--src/gs-app-reviews-dialog.ui65
-rw-r--r--src/gs-app-row.c1240
-rw-r--r--src/gs-app-row.h57
-rw-r--r--src/gs-app-row.ui258
-rw-r--r--src/gs-app-tile.c176
-rw-r--r--src/gs-app-tile.h32
-rw-r--r--src/gs-app-tile.ui129
-rw-r--r--src/gs-app-translation-dialog.c271
-rw-r--r--src/gs-app-translation-dialog.h32
-rw-r--r--src/gs-app-translation-dialog.ui113
-rw-r--r--src/gs-app-version-history-dialog.c93
-rw-r--r--src/gs-app-version-history-dialog.h24
-rw-r--r--src/gs-app-version-history-dialog.ui44
-rw-r--r--src/gs-app-version-history-row.c115
-rw-r--r--src/gs-app-version-history-row.h27
-rw-r--r--src/gs-app-version-history-row.ui55
-rw-r--r--src/gs-application.c1525
-rw-r--r--src/gs-application.h31
-rw-r--r--src/gs-basic-auth-dialog.c131
-rw-r--r--src/gs-basic-auth-dialog.h29
-rw-r--r--src/gs-basic-auth-dialog.ui184
-rw-r--r--src/gs-category-page.c693
-rw-r--r--src/gs-category-page.h25
-rw-r--r--src/gs-category-page.ui155
-rw-r--r--src/gs-category-tile.c219
-rw-r--r--src/gs-category-tile.h26
-rw-r--r--src/gs-category-tile.ui33
-rw-r--r--src/gs-common.c1261
-rw-r--r--src/gs-common.h71
-rw-r--r--src/gs-context-dialog-row.c379
-rw-r--r--src/gs-context-dialog-row.h69
-rw-r--r--src/gs-context-dialog-row.ui20
-rw-r--r--src/gs-css.c308
-rw-r--r--src/gs-css.h36
-rw-r--r--src/gs-dbus-helper.c970
-rw-r--r--src/gs-dbus-helper.h23
-rw-r--r--src/gs-description-box.c358
-rw-r--r--src/gs-description-box.h29
-rw-r--r--src/gs-details-page.c2896
-rw-r--r--src/gs-details-page.h44
-rw-r--r--src/gs-details-page.ui1105
-rw-r--r--src/gs-extras-page.c1361
-rw-r--r--src/gs-extras-page.h41
-rw-r--r--src/gs-extras-page.ui146
-rw-r--r--src/gs-feature-tile.c621
-rw-r--r--src/gs-feature-tile.h21
-rw-r--r--src/gs-feature-tile.ui85
-rw-r--r--src/gs-featured-carousel.c402
-rw-r--r--src/gs-featured-carousel.h31
-rw-r--r--src/gs-featured-carousel.ui86
-rw-r--r--src/gs-hardware-support-context-dialog.c920
-rw-r--r--src/gs-hardware-support-context-dialog.h51
-rw-r--r--src/gs-hardware-support-context-dialog.ui83
-rw-r--r--src/gs-info-bar.c228
-rw-r--r--src/gs-info-bar.h29
-rw-r--r--src/gs-info-bar.ui49
-rw-r--r--src/gs-info-window.c124
-rw-r--r--src/gs-info-window.h33
-rw-r--r--src/gs-info-window.ui33
-rw-r--r--src/gs-installed-page.c974
-rw-r--r--src/gs-installed-page.h26
-rw-r--r--src/gs-installed-page.ui166
-rw-r--r--src/gs-language.c163
-rw-r--r--src/gs-language.h26
-rw-r--r--src/gs-layout-manager.c110
-rw-r--r--src/gs-layout-manager.h29
-rw-r--r--src/gs-license-tile.c334
-rw-r--r--src/gs-license-tile.h31
-rw-r--r--src/gs-license-tile.ui115
-rw-r--r--src/gs-loading-page.c215
-rw-r--r--src/gs-loading-page.h29
-rw-r--r--src/gs-loading-page.ui32
-rw-r--r--src/gs-lozenge.c470
-rw-r--r--src/gs-lozenge.h38
-rw-r--r--src/gs-lozenge.ui33
-rw-r--r--src/gs-main.c51
-rw-r--r--src/gs-metered-data-dialog.c67
-rw-r--r--src/gs-metered-data-dialog.h25
-rw-r--r--src/gs-metered-data-dialog.ui30
-rw-r--r--src/gs-moderate-page.c471
-rw-r--r--src/gs-moderate-page.h26
-rw-r--r--src/gs-moderate-page.ui80
-rw-r--r--src/gs-origin-popover-row.c204
-rw-r--r--src/gs-origin-popover-row.h30
-rw-r--r--src/gs-origin-popover-row.ui166
-rw-r--r--src/gs-os-update-page.c613
-rw-r--r--src/gs-os-update-page.h31
-rw-r--r--src/gs-os-update-page.ui45
-rw-r--r--src/gs-overview-page.c1050
-rw-r--r--src/gs-overview-page.h25
-rw-r--r--src/gs-overview-page.ui230
-rw-r--r--src/gs-page.c857
-rw-r--r--src/gs-page.h74
-rw-r--r--src/gs-prefs-dialog.c94
-rw-r--r--src/gs-prefs-dialog.h25
-rw-r--r--src/gs-prefs-dialog.ui48
-rw-r--r--src/gs-progress-button.c361
-rw-r--r--src/gs-progress-button.h38
-rw-r--r--src/gs-progress-button.ui35
-rw-r--r--src/gs-removal-dialog.c154
-rw-r--r--src/gs-removal-dialog.h25
-rw-r--r--src/gs-removal-dialog.ui93
-rw-r--r--src/gs-repo-row.c463
-rw-r--r--src/gs-repo-row.h35
-rw-r--r--src/gs-repo-row.ui98
-rw-r--r--src/gs-repos-dialog.c766
-rw-r--r--src/gs-repos-dialog.h26
-rw-r--r--src/gs-repos-dialog.ui75
-rw-r--r--src/gs-repos-section.c201
-rw-r--r--src/gs-repos-section.h31
-rw-r--r--src/gs-restarter.c216
-rw-r--r--src/gs-review-bar.c72
-rw-r--r--src/gs-review-bar.h24
-rw-r--r--src/gs-review-dialog.c215
-rw-r--r--src/gs-review-dialog.h26
-rw-r--r--src/gs-review-dialog.ui179
-rw-r--r--src/gs-review-histogram.c135
-rw-r--r--src/gs-review-histogram.h30
-rw-r--r--src/gs-review-histogram.ui410
-rw-r--r--src/gs-review-row.c323
-rw-r--r--src/gs-review-row.h56
-rw-r--r--src/gs-review-row.ui164
-rw-r--r--src/gs-safety-context-dialog.c651
-rw-r--r--src/gs-safety-context-dialog.h32
-rw-r--r--src/gs-safety-context-dialog.ui242
-rw-r--r--src/gs-screenshot-carousel.c365
-rw-r--r--src/gs-screenshot-carousel.h27
-rw-r--r--src/gs-screenshot-carousel.ui139
-rw-r--r--src/gs-screenshot-image.c952
-rw-r--r--src/gs-screenshot-image.h38
-rw-r--r--src/gs-screenshot-image.ui99
-rw-r--r--src/gs-search-page.c566
-rw-r--r--src/gs-search-page.h27
-rw-r--r--src/gs-search-page.ui91
-rw-r--r--src/gs-self-test.c52
-rw-r--r--src/gs-shell-search-provider.c409
-rw-r--r--src/gs-shell-search-provider.h26
-rw-r--r--src/gs-shell.c2725
-rw-r--r--src/gs-shell.h92
-rw-r--r--src/gs-shell.ui521
-rw-r--r--src/gs-star-image.c254
-rw-r--r--src/gs-star-image.h22
-rw-r--r--src/gs-star-widget.c337
-rw-r--r--src/gs-star-widget.h38
-rw-r--r--src/gs-star-widget.ui19
-rw-r--r--src/gs-storage-context-dialog.c412
-rw-r--r--src/gs-storage-context-dialog.h32
-rw-r--r--src/gs-storage-context-dialog.ui87
-rw-r--r--src/gs-summary-tile.c253
-rw-r--r--src/gs-summary-tile.h21
-rw-r--r--src/gs-summary-tile.ui130
-rw-r--r--src/gs-update-dialog.c391
-rw-r--r--src/gs-update-dialog.h27
-rw-r--r--src/gs-update-dialog.ui108
-rw-r--r--src/gs-update-list.c150
-rw-r--r--src/gs-update-list.h32
-rw-r--r--src/gs-update-monitor.c1476
-rw-r--r--src/gs-update-monitor.h29
-rw-r--r--src/gs-updates-page.c1467
-rw-r--r--src/gs-updates-page.h26
-rw-r--r--src/gs-updates-page.ui307
-rw-r--r--src/gs-updates-section.c733
-rw-r--r--src/gs-updates-section.h48
-rw-r--r--src/gs-updates-section.ui109
-rw-r--r--src/gs-upgrade-banner.c374
-rw-r--r--src/gs-upgrade-banner.h35
-rw-r--r--src/gs-upgrade-banner.ui223
-rw-r--r--src/gs-vendor.c127
-rw-r--r--src/gs-vendor.h33
-rw-r--r--src/meson.build312
-rw-r--r--src/org.freedesktop.PackageKit.Modify2.xml560
-rw-r--r--src/org.freedesktop.PackageKit.service.in3
-rw-r--r--src/org.freedesktop.PackageKit.xml506
-rw-r--r--src/org.gnome.Software-search-provider.ini5
-rw-r--r--src/org.gnome.Software.desktop.in17
-rw-r--r--src/org.gnome.Software.service.in3
-rw-r--r--src/shell-search-provider-dbus-interfaces.xml44
-rw-r--r--src/style-dark.css114
-rw-r--r--src/style-hc.css38
-rw-r--r--src/style.css580
-rw-r--r--subprojects/appstream.wrap5
-rw-r--r--subprojects/gnome-pwa-list.wrap6
-rw-r--r--subprojects/gnome-pwa-list/README.md61
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-foss.csv10
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-foss.xml310
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.csv2
-rw-r--r--subprojects/gnome-pwa-list/gnome-pwa-list-proprietary.xml62
-rw-r--r--subprojects/gnome-pwa-list/meson.build14
-rwxr-xr-xsubprojects/gnome-pwa-list/pwa-metainfo-generator.py213
-rw-r--r--subprojects/gtk.wrap5
-rw-r--r--subprojects/libadwaita.wrap5
-rw-r--r--subprojects/libglib-testing.wrap5
-rw-r--r--subprojects/libxmlb.wrap5
-rw-r--r--subprojects/malcontent.wrap5
-rw-r--r--subprojects/sysprof.wrap5
-rwxr-xr-xtests/actions.py61
-rwxr-xr-xtests/basic.py151
650 files changed, 515955 insertions, 0 deletions
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..f103d5f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,19 @@
+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..937cc34
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,105 @@
+include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
+
+stages:
+ - build
+ - deploy
+
+cache:
+ paths:
+ - _ccache/
+
+variables:
+ MESON_TEST_TIMEOUT_MULTIPLIER: 4
+ G_MESSAGES_DEBUG: all
+ MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --prefix /usr -Dsoup2=true -Dwebapps=true -Dhardcoded_foss_webapps=false -Dhardcoded_proprietary_webapps=false"
+ BUNDLE: "gnome-software-dev.flatpak"
+
+.build:
+ before_script:
+ - cp -r $HOME/subprojects/* subprojects/
+
+fedora-x86_64:
+ extends: .build
+ image: registry.gitlab.gnome.org/gnome/gnome-software/fedora:v10
+ stage: build
+ except:
+ - tags
+ script:
+ - meson ${MESON_COMMON_OPTIONS}
+ -Drpm_ostree=true
+ -Dmalcontent=true
+ -Dsysprof=enabled
+ _build
+ - ninja -C _build
+ - .gitlab-ci/run-tests.sh
+ --no-suite packagekit
+ --no-suite fwupd
+ --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/meson-logs"
+ - "_build/${CI_JOB_NAME}-report.xml"
+
+debian-stable-x86_64:
+ extends: .build
+ image: registry.gitlab.gnome.org/gnome/gnome-software/debian-stable:v9
+ stage: build
+ except:
+ - tags
+ script:
+ - meson ${MESON_COMMON_OPTIONS}
+ -Drpm_ostree=false
+ -Dmalcontent=false
+ -Dsysprof=disabled
+ _build
+ - ninja -C _build
+ - .gitlab-ci/run-tests.sh
+ --no-suite packagekit
+ --no-suite fwupd
+ --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'
+ stage: 'build'
+ dependencies: []
+ variables:
+ MANIFEST_PATH: "contrib/org.gnome.SoftwareDevel.json"
+ FLATPAK_MODULE: "gnome-software"
+ RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
+ APP_ID: "org.gnome.SoftwareDevel"
+ when: manual
+ allow_failure: true
+ script:
+ # Modified from https://gitlab.gnome.org/GNOME/citemplates/-/blob/HEAD/flatpak/flatpak_ci_initiative.yml
+ # to drop the unit tests, since we don’t need them
+ - rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS}
+ - flatpak-builder --user --disable-rofiles-fuse flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH}
+ # Generate a Flatpak bundle
+ - flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH}
+ - tar cf repo.tar repo/
+
+# 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
diff --git a/.gitlab-ci/README.md b/.gitlab-ci/README.md
new file mode 100644
index 0000000..4eadf22
--- /dev/null
+++ b/.gitlab-ci/README.md
@@ -0,0 +1,22 @@
+# 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-stable --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-stable --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. 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..fb0337c
--- /dev/null
+++ b/.gitlab-ci/cache-subprojects.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+
+git clone --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gnome-software.git
+meson subprojects download --sourcedir gnome-software
+rm gnome-software/subprojects/*.wrap
+mv gnome-software/subprojects/ .
+# allow updating this one without a docker rebuild
+rm -rf subprojects/gnome-pwa-list
+rm -rf gnome-software
diff --git a/.gitlab-ci/debian-stable.Dockerfile b/.gitlab-ci/debian-stable.Dockerfile
new file mode 100644
index 0000000..ab31fbb
--- /dev/null
+++ b/.gitlab-ci/debian-stable.Dockerfile
@@ -0,0 +1,94 @@
+FROM debian:bookworm
+
+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 \
+ git \
+ gnome-pkg-tools \
+ gobject-introspection \
+ gperf \
+ gsettings-desktop-schemas-dev \
+ gtk-doc-tools \
+ itstool \
+ lcov \
+ libaccountsservice-dev \
+ libappstream-dev \
+ libcairo2-dev \
+ libcairo-gobject2 \
+ libcurl4-gnutls-dev \
+ libepoxy-dev \
+ 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 \
+ libsoup2.4-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 \
+ policykit-1 \
+ 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 meson==0.60.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 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..a3bc5f1
--- /dev/null
+++ b/.gitlab-ci/fedora.Dockerfile
@@ -0,0 +1,96 @@
+FROM fedora:35
+
+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 \
+ git \
+ glib2-devel \
+ 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 \
+ libcurl-devel \
+ libdnf-devel \
+ libepoxy-devel \
+ libglib-testing-devel \
+ libgudev-devel \
+ libjpeg-turbo-devel \
+ liboauth-devel \
+ libsecret-devel \
+ libsoup-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-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 \
+ zlib-devel \
+ && dnf clean all
+
+RUN pip3 install meson==0.60.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 cache-subprojects.sh .
+RUN ./cache-subprojects.sh
+
+ENV LANG C.UTF-8
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..030cade
--- /dev/null
+++ b/.gitlab-ci/run-docker.sh
@@ -0,0 +1,132 @@
+#!/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 <command> [options] [basename]"
+ echo ""
+ echo "Available commands"
+ echo ""
+ echo " build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
+ echo " run --base=<BASENAME> - Run Docker image <BASENAME>"
+ echo " push --base=<BASENAME> - Push Docker image <BASENAME> 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 <command>"
+ 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}"
+ $SUDO_CMD docker build \
+ --build-arg HOST_USER_ID="$UID" \
+ --tag "${TAG}" \
+ --file "${base}.Dockerfile" .
+ 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..f68c523
--- /dev/null
+++ b/.gitlab/issue_templates/Default.md
@@ -0,0 +1,15 @@
+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 <richard@hughsie.com>
+Matthias Clasen <mclasen@redhat.com>
+Kalev Lember <kalevlember@gmail.com>
+
+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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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..535bae9
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2004 @@
+Version 43.5
+~~~~~~~~~~~~
+Released: 2023-03-03
+
+This is a stable release with the following change:
+ * Fix few memory leaks
+
+Version 43.4
+~~~~~~~~~~~~
+Released: 2023-02-10
+
+This is a stable release with the following changes:
+ * Stop cancelled search in appstream data early
+ * Lookup for appstream-provided icons in more directories
+
+Version 43.3
+~~~~~~~~~~~~
+Released: 2023-01-06
+
+This is a stable release with the following changes:
+ * Periodically expire cached app icons
+ * Stop notifying about unprepared critical updates
+
+This release also updates translations:
+ * Abkhazian (Nart Tlisha)
+ * Georgian (Ekaterine Papava)
+ * Hebrew (Yosef Or Boczko)
+ * Interlingue (Olga Smirnova)
+ * Occitan (post 1500) (Quentin PAGÈS)
+ * Persian (Danial Behzadi)
+
+Version 43.2
+~~~~~~~~~~~~
+Released: 2022-12-02
+
+This is a stable release with the following changes:
+ * Fix show of updatable app in the details page
+ * Fix search for apps providing some feature under rpm-ostree
+ * Fix sending of ODRS data when using libsoup3
+ * Fix occasional crash when installing apps
+
+This release also updates translations:
+ * Abkhazian (Nart Tlisha)
+ * Belarusian (Vasil Pupkin)
+ * Czech (Daniel Rusek)
+ * Georgian (Zurab Kargareteli)
+ * Greek (Kosmas Martakidis)
+ * Hebrew (Yosef Or Boczko)
+ * Hungarian (Balázs Meskó)
+ * Russian (Aleksandr Melman)
+ * Turkish (Sabri Ünal)
+
+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..077b0ab
--- /dev/null
+++ b/README.md
@@ -0,0 +1,98 @@
+[![Build Status](https://gitlab.gnome.org/GNOME/gnome-software/badges/main/pipeline.svg)](https://gitlab.gnome.org/GNOME/gnome-software/pipelines)
+
+# Software
+
+[Software](https://wiki.gnome.org/Apps/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://wiki.gnome.org/Projects/GnomeShell).
+
+# 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` on [irc.gnome.org](https://wiki.gnome.org/Community/GettingInTouch/IRC).
+
+# Documentation for app developers and vendors
+
+Specific documentation is available for application developers who wish to test
+how their applications appear in GNOME Software; and for distribution vendors
+who wish to customise how GNOME Software appears in their distribution:
+ * [Tools in GNOME Software for application 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
+```
+
+## Default branch renamed to `main`
+
+The default development branch of gnome-software has been renamed to `main`. To
+update your local checkout, use:
+```sh
+git checkout master
+git branch -m master main
+git fetch
+git branch --unset-upstream
+git branch -u origin/main
+git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
+```
+
+# Debugging
+
+Running with `--verbose` will give detailed logging information.
+
+# 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..af711a1
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,114 @@
+GNOME Software Release Notes
+===
+
+Release schedule
+---
+
+GNOME Software releases are done on the timetable set by the [GNOME release schedule](https://wiki.gnome.org/Schedule).
+
+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://wiki.gnome.org/MaintainersCorner/Releasing).
+
+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
+
+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 -m "Release version ${new_version}"
+```
+
+Build the release tarball:
+```
+# Only execute git clean if you don't have anything not tracked by git that you
+# want to keep
+git clean -dfx
+meson --prefix $PWD/install -Dbuildtype=release -Dsoup2=true build/
+ninja -C build/ dist
+```
+
+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.
+
+Upload the release tarball:
+```
+scp build/meson-dist/gnome-software-${new_version}.tar.xz master.gnome.org:
+ssh master.gnome.org ftpadmin install gnome-software-${new_version}.tar.xz
+```
+
+Add the release notes to GitLab and close the milestone:
+ - Go to https://gitlab.gnome.org/GNOME/gnome-software/-/releases/new?tag_name=${new_version}
+ - set `Release title` to `${new_version}`
+ - set the Milestone of the release, if such exists
+ - copy the Release notes for the new release from the `NEWS` file
+ (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 `Create release` 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, as all issues and merge requests tagged
+ for this release should now be complete
+
+Post release version bump in `meson.build`:
+```
+# edit meson.build, then
+git commit -a -m "trivial: Post release version bump"
+git push
+```
+
+`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/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..6266107
--- /dev/null
+++ b/contrib/gnome-software.spec.in
@@ -0,0 +1,190 @@
+%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://wiki.gnome.org/Apps/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: libdnf-devel
+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 application 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 application 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 <richard@hughsie.com> #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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This is only an example file, what the deployment-featured file can look like;
+ if used, it should be installed beside the org.gnome.Software.Featured.xml file. -->
+<components>
+ <component merge="append">
+ <id>org.gnome.Software.desktop</id>
+ <custom>
+ <value key="GnomeSoftware::DeploymentFeatured">foocorp</value>
+ </custom>
+ </component>
+</components>
diff --git a/contrib/org.gnome.SoftwareDevel.json b/contrib/org.gnome.SoftwareDevel.json
new file mode 100644
index 0000000..577aef7
--- /dev/null
+++ b/contrib/org.gnome.SoftwareDevel.json
@@ -0,0 +1,214 @@
+{
+ "app-id": "org.gnome.SoftwareDevel",
+ "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"
+ ],
+ "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": "v0.15.2",
+ "commit": "d2bfe7c2a4ca692daf33a5cb4d429011269d1cba"
+ }
+ ]
+ },
+ {
+ "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": "linux-pam",
+ "buildsystem": "autotools",
+ "config-opts": [
+ "--disable-doc",
+ "--includedir=/app/include/security"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/linux-pam/linux-pam.git"
+ }
+ ]
+ },
+ {
+ "name": "polkit",
+ "buildsystem": "meson",
+ "config-opts": [
+ "-Djs_engine=mozjs"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.freedesktop.org/polkit/polkit.git"
+ }
+ ]
+ },
+ {
+ "name": "libfuse",
+ "buildsystem": "simple",
+ "build-commands": [
+ "./makeconf.sh",
+ "./configure --disable-util --disable-example --prefix=/",
+ "make install DESTDIR=/app"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/libfuse/libfuse.git",
+ "branch": "fuse_2_9_bugfix"
+ }
+ ]
+ },
+ {
+ "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": "flatpak",
+ "buildsystem": "autotools",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://github.com/flatpak/flatpak.git",
+ "branch": "main"
+ }
+ ]
+ },
+ {
+ "buildsystem": "meson",
+ "builddir": true,
+ "name": "gnome-software",
+ "config-opts": [
+ "--libdir=/app/lib",
+ "-Dpackagekit=false",
+ "-Dpackagekit_autoremove=false",
+ "-Dsoup2=true",
+ "-Dfwupd=false",
+ "-Dflatpak=true",
+ "-Dmalcontent=false",
+ "-Dgudev=false",
+ "-Dgtk_doc=false",
+ "-Dprofile=Devel"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/gnome-software.git",
+ "branch": "main"
+ }
+ ]
+ }
+ ]
+}
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <!-- Arbitrary list of popular GNOME apps. The list should be long enough
+ to show up on the overview page if it’s the only source of curated apps.
+ Distros should not ship this in production releases: they should be
+ providing their own curated list of ‘Editor’s Choice’ apps instead. -->
+ <component merge="append">
+ <id>org.gnome.Aisleriot</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Boxes.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Builder.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Calendar.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.clocks.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Contacts.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Dictionary</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Evince</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Evolution.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Geary.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Maps.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Nautilus.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>im.bernard.Nostalgia</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Notes.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Photos.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Polari.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Todo</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Totem.desktop</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Weather</id>
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+ </component>
+</components>
diff --git a/data/assets/org.gnome.Software.Featured.xml b/data/assets/org.gnome.Software.Featured.xml
new file mode 100644
index 0000000..1a759a2
--- /dev/null
+++ b/data/assets/org.gnome.Software.Featured.xml
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <!-- GNOME Circle apps (https://circle.gnome.org) -->
+ <component merge="append">
+ <id>app.drey.Dialect</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>app.drey.Warp</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.adrienplazas.Metronome</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Authenticator</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Decoder</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.belmoussaoui.Obfuscate</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.bitstower.Markets</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.alexhuntley.Plots</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.bleakgrey.tootle</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.geigi.cozy</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.hugolabe.Wike</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.huluti.Curtail</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.liferooter.textpieces</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.github.maoschanz.drawing</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.gitlab.newsflash</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.Blanket</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.SharePreview</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>com.rafaelmardojai.WebfontKitGenerator</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.AudioSharing</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.Fragments</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>de.haeckerfelix.Shortwave</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>dev.Cogitri.Health</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>dev.geopjr.Collision</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>fr.romainvigier.MetadataCleaner</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.bassi.Amberol</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.lainsce.Khronos</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.seadve.Kooha</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>io.github.seadve.Mousai</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gaphor.Gaphor</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.DejaDup</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.somas.Apostrophe</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.YaLTeR.Identity</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.gitlab.YaLTeR.VideoTrimmer</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Podcasts</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Polari</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.Solanum</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.Citations</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.PikaBackup</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gnome.World.Secrets</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>org.gustavoperedo.FontDownloader</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Commit</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Junction</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+ <component merge="append">
+ <id>re.sonny.Tangram</id>
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+ </component>
+</components>
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 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+ id="svg8"
+ version="1.1"
+ viewBox="0 0 320 320"
+ height="320"
+ width="320"
+ sodipodi:docname="up-to-date.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs
+ id="defs2">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient14556">
+ <stop
+ style="stop-color:#f9ef69;stop-opacity:1;"
+ offset="0"
+ id="stop14552" />
+ <stop
+ style="stop-color:#f5c211;stop-opacity:1"
+ offset="1"
+ id="stop14554" />
+ </linearGradient>
+ <linearGradient
+ id="a-3"
+ gradientTransform="matrix(0.707107,0.707107,0.707107,-0.707107,2,-170)"
+ gradientUnits="userSpaceOnUse"
+ x1="188.44394"
+ x2="261.09912"
+ y1="-77.78183"
+ y2="-150.43706">
+ <stop
+ offset="0"
+ stop-color="#f6d32d"
+ id="stop2-6" />
+ <stop
+ offset="1"
+ stop-color="#f5c211"
+ id="stop4-7" />
+ </linearGradient>
+ <radialGradient
+ id="b"
+ cx="280.9942"
+ cy="488.84842"
+ gradientTransform="matrix(0.347005,0,0,0.342234,-31.50647,-127.48206)"
+ gradientUnits="userSpaceOnUse"
+ r="224">
+ <stop
+ offset="0"
+ stop-color="#fdfacf"
+ id="stop7" />
+ <stop
+ offset="0.4"
+ stop-color="#f9f06b"
+ id="stop9" />
+ <stop
+ offset="1"
+ stop-color="#f6d32d"
+ id="stop11" />
+ </radialGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10519"
+ id="linearGradient10521"
+ x1="564.64844"
+ y1="486.45703"
+ x2="723.66016"
+ y2="486.45703"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1724844,0,0,1.1724844,-531.44458,-257.84982)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10519">
+ <stop
+ style="stop-color:#26a269;stop-opacity:1;"
+ offset="0"
+ id="stop10515" />
+ <stop
+ style="stop-color:#1eef8f;stop-opacity:1"
+ offset="0.28584763"
+ id="stop10685" />
+ <stop
+ style="stop-color:#165f3d;stop-opacity:1"
+ offset="1"
+ id="stop10517" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8268"
+ id="linearGradient8270"
+ x1="624.69623"
+ y1="401.86096"
+ x2="698.71875"
+ y2="288.45312"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1724844,0,0,1.1724844,-531.44458,-201.41465)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8268">
+ <stop
+ style="stop-color:#26a269;stop-opacity:1"
+ offset="0"
+ id="stop8264" />
+ <stop
+ style="stop-color:#f9f06b;stop-opacity:1"
+ offset="1"
+ id="stop8266" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient14556"
+ id="linearGradient14558"
+ x1="231.2832"
+ y1="145.98535"
+ x2="231.2832"
+ y2="252.41602"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ units="px"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="g960"
+ inkscape:document-units="px"
+ inkscape:cy="166.27648"
+ inkscape:cx="60.187402"
+ inkscape:zoom="2.1349983"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ borderopacity="1"
+ bordercolor="#383838"
+ pagecolor="#1f1f1f"
+ id="base"
+ inkscape:pagecheckerboard="1"
+ width="400px"
+ objecttolerance="10.0"
+ gridtolerance="10.0"
+ guidetolerance="10.0"
+ inkscape:window-width="1920"
+ inkscape:window-height="1011"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ transform="translate(-40,-40)">
+ <g
+ id="g960"
+ transform="translate(-9)">
+ <g
+ style="stroke-width:0.386113"
+ transform="matrix(1.1259125,0,0,1.1259125,224.47071,55.053376)"
+ id="g862">
+ <path
+ d="m 20,20 h 88 v 88 H 20 Z m 0,0"
+ fill="#f5c211"
+ id="path856-5"
+ style="stroke-width:0.298167" />
+ <path
+ style="fill:url(#a-3);stroke-width:0.386113"
+ d="M 2,64 64,126 126,64 64,2 Z m 0,0"
+ fill="url(#a)"
+ id="path858-3" />
+ <path
+ style="fill:url(#b);stroke-width:0.386113"
+ d="M 112,64 C 112,90.507812 90.507812,112 64,112 37.492188,112 16,90.507812 16,64 16,37.492188 37.492188,16 64,16 c 26.507812,0 48,21.492188 48,48 z m 0,0"
+ fill="url(#b)"
+ id="path860-5" />
+ </g>
+ <circle
+ style="fill:url(#linearGradient10521);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="circle10463"
+ cx="209.35948"
+ cy="242.87909"
+ r="101.09472" />
+ <circle
+ style="fill:url(#linearGradient14558);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="circle11708"
+ cx="209.35948"
+ cy="236.68916"
+ r="101.09472" />
+ <circle
+ style="fill:url(#linearGradient8270);fill-opacity:1;stroke-width:18.7598;stop-color:#000000"
+ id="path2198"
+ cx="209.35948"
+ cy="238.18916"
+ r="101.09472" />
+ <g
+ id="g8228"
+ transform="matrix(0.93457387,0,0,0.93457387,-379.96735,-136.74431)">
+ <path
+ id="path2322"
+ style="display:inline;fill:#99c1f1;fill-opacity:1;stroke:none;stroke-width:32.3735;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 538.64083,296.63671 a 43.839679,43.839679 0 0 0 -39.2403,24.36235 35.177858,35.177858 0 0 0 -3.3343,-0.16019 35.177858,35.177858 0 0 0 -35.1788,35.17881 35.177858,35.177858 0 0 0 0.9716,8.21352 h 147.2279 a 29.419203,29.419203 0 0 0 -26.7777,-28.00225 43.839679,43.839679 0 0 0 -43.6326,-39.59224 43.839679,43.839679 0 0 0 -0.036,0 z" />
+ <path
+ id="path889"
+ style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:32.3735;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 538.64083,292.63671 a 43.839679,43.839679 0 0 0 -39.2403,24.36235 35.177858,35.177858 0 0 0 -3.3343,-0.16019 35.177858,35.177858 0 0 0 -35.1788,35.17881 35.177858,35.177858 0 0 0 0.9716,8.21352 h 147.2279 a 29.419203,29.419203 0 0 0 -26.7777,-28.00225 43.839679,43.839679 0 0 0 -43.6326,-39.59224 43.839679,43.839679 0 0 0 -0.036,0 z" />
+ </g>
+ <path
+ style="fill:none;stroke:#8ff0a4;stroke-width:27.0574;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 173.95206,242.7111 27.04994,27.04994 55.33318,-55.33316"
+ id="path7128" />
+ <g
+ id="g8232"
+ transform="matrix(0.85677501,0,0,0.85677501,-296.65379,-71.159142)">
+ <path
+ id="path2302"
+ style="display:inline;fill:#99c1f1;fill-opacity:1;stroke:none;stroke-width:48.5793;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 741.32713,365.18189 c -14.26103,10e-4 -26.92647,9.11418 -31.45954,22.63558 -3.34805,-1.36908 -6.93047,-2.07375 -10.54763,-2.07475 -15.40287,-6.9e-4 -27.88955,12.48596 -27.88889,27.88883 -3.2e-4,4.76721 1.22143,9.45492 3.54859,13.61552 h 82.67972 c 10.41164,-5.88686 16.84961,-16.92128 16.85101,-28.88194 -8e-5,-18.32657 -14.85669,-33.18317 -33.18326,-33.18324 z"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ id="path903"
+ style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:48.5793;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.482318;stop-color:#000000"
+ d="m 739.32713,361.18189 c -14.26103,10e-4 -26.92647,9.11418 -31.45954,22.63558 -3.34805,-1.36908 -6.93047,-2.07375 -10.54763,-2.07475 -15.40287,-6.9e-4 -27.88955,12.48596 -27.88889,27.88883 -3.2e-4,4.76721 1.22143,9.45492 3.54859,13.61552 h 82.67972 c 10.41164,-5.88686 16.84961,-16.92128 16.85101,-28.88194 -8e-5,-18.32657 -14.85669,-33.18317 -33.18326,-33.18324 z"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ </g>
+ </g>
+</svg>
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/icons/adaptive-symbolic.svg b/data/icons/adaptive-symbolic.svg
new file mode 100644
index 0000000..f1109c8
--- /dev/null
+++ b/data/icons/adaptive-symbolic.svg
@@ -0,0 +1 @@
+<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M44.004 25c-1.662 0-3 1.338-3 3v6c0 1.662 1.338 3 3 3h12c1.662 0 3-1.338 3-3v-6c0-1.662-1.338-3-3-3h-12zm-36.5.002a2.517 2.517 0 0 0-2.5 2.5v10c0 1.368 1.132 2.5 2.5 2.5h5c1.368 0 2.5-1.132 2.5-2.5v-10c0-1.368-1.132-2.5-2.5-2.5h-5zm15 1a2.517 2.517 0 0 0-2.5 2.5V37h2v-8.5c0-.294.206-.5.5-.5h11.004c.295 0 .5.206.5.5V37h2v-8.498c0-1.367-1.132-2.5-2.5-2.5H22.504zm21.5.998h12c.554 0 1 .446 1 1v6c0 .554-.446 1-1 1h-12c-.554 0-1-.446-1-1v-6c0-.554.446-1 1-1zm-36.5.002h.5c0 .554.446 1 1 1h2c.554 0 1-.446 1-1h.5c.294 0 .5.206.5.5v10c0 .294-.206.5-.5.5h-5a.478.478 0 0 1-.5-.5v-10c0-.294.206-.5.5-.5zM18.004 38a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2h-20zm29 0a2 2 0 0 0-2 2h10a2 2 0 0 0-2-2h-6z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/app-installed-symbolic.svg b/data/icons/app-installed-symbolic.svg
new file mode 100644
index 0000000..660cab2
--- /dev/null
+++ b/data/icons/app-installed-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="color:#000;fill:#2e3436;stroke-linecap:round;stroke-linejoin:round;stroke-dashoffset:26.4;-inkscape-stroke:none" d="M7.883 0a8.04 8.04 0 0 0-.963.074 7.988 7.988 0 0 0-4.604 2.291 8.014 8.014 0 0 0-1.228 9.666 8.008 8.008 0 0 0 9.016 3.686 8.004 8.004 0 0 0 5.892-7.752 1 1 0 1 0-1.998.01 5.987 5.987 0 0 1-4.42 5.812 5.995 5.995 0 0 1-6.764-2.766 5.993 5.993 0 0 1 .922-7.248 5.991 5.991 0 0 1 7.239-.984 1 1 0 1 0 .992-1.736A7.96 7.96 0 0 0 7.883 0zm7.209 2.002a1 1 0 0 0-.844.338L7.951 9.535 5.707 7.291a1 1 0 0 0-1.414 0 1 1 0 0 0 0 1.416l3 3a1 1 0 0 0 1.46-.049l7-8a1 1 0 0 0-.093-1.412 1 1 0 0 0-.568-.244z"/></svg> \ No newline at end of file
diff --git a/data/icons/chat-none-symbolic.svg b/data/icons/chat-none-symbolic.svg
new file mode 100644
index 0000000..ab473b3
--- /dev/null
+++ b/data/icons/chat-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06.802.803L11.941 13l2.53 2.53 1.06-1.061-1.521-1.522A2.49 2.49 0 0 0 16 10.5v-6A2.495 2.495 0 0 0 13.5 2H3.062L1.532.469zM.246 3.429A2.504 2.504 0 0 0 0 4.5v6C0 11.684 1.402 13 2.5 13H4v3l3.125-3h2.691L.246 3.43z"/></svg> \ No newline at end of file
diff --git a/data/icons/chat-symbolic.svg b/data/icons/chat-symbolic.svg
new file mode 100644
index 0000000..67ffbdf
--- /dev/null
+++ b/data/icons/chat-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 2A2.495 2.495 0 0 1 16 4.5v6c0 1.387-1.113 2.5-2.5 2.5H7.125L4 16v-3H2.5C1 13 0 11.684 0 10.5v-6C0 3.113 1.113 2 2.5 2zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/cigarette-none-symbolic.svg b/data/icons/cigarette-none-symbolic.svg
new file mode 100644
index 0000000..c54012f
--- /dev/null
+++ b/data/icons/cigarette-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M3 0v.5C3 2.98 5.02 5 7.5 5h3c.832 0 1.5.664 1.5 1.5V7h3v-.5C15 4.02 12.98 2 10.5 2h-3C6.664 2 6 1.332 6 .5V0Zm0 0" fill-opacity=".35" style="fill:#2e3436"/><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 14 14 1.06-1.06L13 11.938V8h-1v2.938l-1-1V8H9.062L1.532.469zM0 8v4h8.906l-4-4H0zm14 0v4h1V8h-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/cigarette-symbolic.svg b/data/icons/cigarette-symbolic.svg
new file mode 100644
index 0000000..75c42c7
--- /dev/null
+++ b/data/icons/cigarette-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M3 .012v.5c0 2.48 2.02 4.5 4.5 4.5h3c.832 0 1.5.664 1.5 1.5v.5h3v-.5c0-2.48-2.02-4.5-4.5-4.5h-3c-.836 0-1.5-.668-1.5-1.5v-.5zm0 0" fill-opacity=".35" style="fill:#2e3436"/><path style="fill:#2e3436" d="M0 8.012v4h11v-4H0zm12 0v4h1v-4h-1zm2 0v4h1v-4h-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/community-none-symbolic.svg b/data/icons/community-none-symbolic.svg
new file mode 100644
index 0000000..c0c07cb
--- /dev/null
+++ b/data/icons/community-none-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16px" height="16px" viewBox="0 0 16 16" version="1.1">
+<g id="surface25330">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:0.501961;" d="M 11 0 C 9.621094 0 8.5 1.121094 8.5 2.5 C 8.5 3.878906 9.621094 5 11 5 C 12.378906 5 13.5 3.878906 13.5 2.5 C 13.5 1.121094 12.378906 0 11 0 Z M 9 6 C 8.117188 6 6.933594 6.585938 6.230469 7.277344 L 10.953125 12 L 15 12 C 15.554688 12 16 11.554688 16 11 L 16 9 C 16 7.339844 14.660156 6 13 6 Z M 9 6 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:1;" d="M 5 4 C 4.425781 4 3.898438 4.195312 3.476562 4.523438 L 6.980469 8.027344 C 7.304688 7.601562 7.5 7.074219 7.5 6.5 C 7.5 5.121094 6.378906 4 5 4 Z M 2.609375 5.78125 C 2.539062 6.007812 2.5 6.25 2.5 6.5 C 2.5 7.878906 3.621094 9 5 9 C 5.25 9 5.492188 8.964844 5.722656 8.894531 Z M 3 10 C 1.339844 10 0 11.339844 0 13 L 0 15 C 0 15.554688 0.445312 16 1 16 L 9 16 C 9.554688 16 10 15.554688 10 15 L 10 13.171875 L 6.828125 10 Z M 3 10 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(13.333334%,13.333334%,13.333334%);fill-opacity:1;" d="M 1.53125 0.457031 L 0.46875 1.519531 L 14.46875 15.519531 L 15.53125 14.457031 Z M 1.53125 0.457031 "/>
+</g>
+</svg>
diff --git a/data/icons/community-symbolic.svg b/data/icons/community-symbolic.svg
new file mode 100644
index 0000000..3716efa
--- /dev/null
+++ b/data/icons/community-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M5 2a2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2zm6 2a2 2 0 0 0-2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2zM4 7c-1.662 0-3 1.338-3 3v1c0 .554.446 1 1 1h4c0-1.665 1.056-3.038 2.518-3.625A2.986 2.986 0 0 0 6 7H4zm6 2c-1.662 0-3 1.338-3 3v1c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-1c0-1.662-1.338-3-3-3h-2z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/desktop-symbolic.svg b/data/icons/desktop-symbolic.svg
new file mode 100644
index 0000000..3a4031a
--- /dev/null
+++ b/data/icons/desktop-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#241f31;fill-opacity:1" d="M3 1C1.338 1 0 2.338 0 4v6c0 1.662 1.338 3 3 3h10c1.662 0 3-1.338 3-3V4c0-1.662-1.338-3-3-3H3zm0 2h10c.554 0 1 .446 1 1v6c0 .554-.446 1-1 1H3c-.554 0-1-.446-1-1V4c0-.554.446-1 1-1zm2 11a2 2 0 0 0-2 2h10a2 2 0 0 0-2-2H5z"/></svg> \ No newline at end of file
diff --git a/data/icons/emblem-synchronizing-symbolic.svg b/data/icons/emblem-synchronizing-symbolic.svg
new file mode 100644
index 0000000..db232ff
--- /dev/null
+++ b/data/icons/emblem-synchronizing-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M7.863 1a7.01 7.01 0 0 0-5.926 3.5 1 1 0 0 0 .368 1.365A1 1 0 0 0 3.67 5.5a4.994 4.994 0 0 1 5.2-2.424A4.99 4.99 0 0 1 12.583 6H11a1 1 0 0 0-1 1 1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1 1 1 0 0 0-1 1v1.398A7.007 7.007 0 0 0 7.863 1ZM1 8a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1 1 1 0 0 0 1-1v-1.396a7.006 7.006 0 0 0 5.39 3.369 7.004 7.004 0 0 0 6.673-3.473 1 1 0 0 0-.366-1.365 1 1 0 0 0-1.367.365 4.994 4.994 0 0 1-4.766 2.48A4.994 4.994 0 0 1 3.418 10H5a1 1 0 0 0 1-1 1 1 0 0 0-1-1Z" style="fill:#2e3436;fill-opacity:1"/></svg> \ No newline at end of file
diff --git a/data/icons/explore-symbolic.svg b/data/icons/explore-symbolic.svg
new file mode 100644
index 0000000..befab30
--- /dev/null
+++ b/data/icons/explore-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#3d3846;fill-opacity:.35;stroke-width:1" d="M2.557 2a.59.59 0 0 0-.504.828L3.16 5.32l1.56-.6.6-1.56-2.492-1.107A.583.583 0 0 0 2.557 2Zm10.875.002a.585.585 0 0 0-.26.05L10.68 3.16l.6 1.56 1.56.6 1.107-2.492a.587.587 0 0 0-.515-.826ZM3.16 10.68l-1.107 2.492a.587.587 0 0 0 .775.775L5.32 12.84l-.6-1.56Zm9.68 0-1.56.6-.6 1.56 2.492 1.107a.587.587 0 0 0 .775-.775z"/><path d="M8.002 0a.572.572 0 0 0-.535.367L5.494 5.494.367 7.467a.571.571 0 0 0 0 1.066l5.127 1.973 1.973 5.127a.571.571 0 0 0 1.066 0l1.973-5.127 5.127-1.973a.571.571 0 0 0 0-1.066l-5.127-1.973L8.533.367A.573.573 0 0 0 8.002 0ZM8 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/external-link-symbolic.svg b/data/icons/external-link-symbolic.svg
new file mode 100644
index 0000000..35b8681
--- /dev/null
+++ b/data/icons/external-link-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M10 0a1 1 0 0 0 0 2h2.586L7.293 7.293a1 1 0 0 0 1.414 1.414L14 3.414V6a1 1 0 1 0 2 0V0h-1ZM4 1C2.355 1 1 2.355 1 4v8c0 1.645 1.355 3 3 3h8c1.645 0 3-1.355 3-3V9c0-.554-.446-1-1-1s-1 .446-1 1v3c0 .571-.429 1-1 1H4c-.571 0-1-.429-1-1V4c0-.571.429-1 1-1h3c.554 0 1-.446 1-1s-.446-1-1-1Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/flag-outline-thin-symbolic.svg b/data/icons/flag-outline-thin-symbolic.svg
new file mode 100644
index 0000000..5a6c384
--- /dev/null
+++ b/data/icons/flag-outline-thin-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M1 0v16h2v-6h3.383l.722 1.447A1 1 0 0 0 8 12h6a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H9.617L8.895.553A1 1 0 0 0 8 0Zm2 2h4.383l.722 1.447A1 1 0 0 0 9 4h4v6H8.617l-.722-1.447A1 1 0 0 0 7 8H3Z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/flatpak-symbolic.svg b/data/icons/flatpak-symbolic.svg
new file mode 100644
index 0000000..6b34e64
--- /dev/null
+++ b/data/icons/flatpak-symbolic.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 7.804688 0.0195312 c -0.128907 0.0273438 -0.25 0.0742188 -0.359376 0.1484378 l -6 4 c -0.277343 0.183593 -0.445312 0.496093 -0.445312 0.832031 v 6 c 0 0.335938 0.167969 0.648438 0.445312 0.832031 l 6 4 c 0.335938 0.222657 0.773438 0.222657 1.109376 0 l 6 -4 c 0.277343 -0.183593 0.445312 -0.496093 0.445312 -0.832031 v -6 c 0 -0.335938 -0.167969 -0.648438 -0.445312 -0.832031 l -6 -4 c -0.21875 -0.1484378 -0.488282 -0.199219 -0.75 -0.1484378 z m 0.195312 2.1796878 v 6.800781 l 5 -3.332031 v 4.796875 l -5 3.335937 v -4.800781 l -5 -3.332031 v -0.132813 z m 0 0" fill="#2e3436"/>
+</svg>
diff --git a/data/icons/graveyard-symbolic.svg b/data/icons/graveyard-symbolic.svg
new file mode 100644
index 0000000..fbd5c05
--- /dev/null
+++ b/data/icons/graveyard-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.125 1.25-.844 2.188-1.844-.75-.75 1.874 1.875.75-2.187 5.75C5.082 11.54 3.832 13.027 3 14H1.469v1.063h13V14h-.719c-.414-.988-1.914-2.605-4.219-3l1.906-4.969 2.25.907.75-1.844-2.28-.907L13 2zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/hand-open-symbolic.svg b/data/icons/hand-open-symbolic.svg
new file mode 100644
index 0000000..2e20f74
--- /dev/null
+++ b/data/icons/hand-open-symbolic.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 8 0 c 0.554688 0 1 0.445312 1 1 v 6.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -4.5 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 8.5 c 0 0.5 0.5 0.5 0.5 0.5 l 1.792969 -1.707031 c 0.1875 -0.195313 0.445312 -0.300781 0.71875 -0.300781 c 1.082031 0.082031 1.144531 1.265624 0.695312 1.714843 l -3 3 c -0.707031 0.792969 -1.757812 1.289063 -2.707031 1.292969 h -6 c -3 0 -3 -3 -3 -3 v -8 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 3.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -6.5 c 0 -0.554688 0.445312 -1 1 -1 s 1 0.445312 1 1 v 5.5 s 0 0.5 0.5 0.5 s 0.5 -0.5 0.5 -0.5 v -6.5 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0" fill="#222222"/></svg>
diff --git a/data/icons/heart-filled-symbolic.svg b/data/icons/heart-filled-symbolic.svg
new file mode 100644
index 0000000..bd06edb
--- /dev/null
+++ b/data/icons/heart-filled-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M11.395 1.965a3.75 3.75 0 0 0-2.641.984L8 3.625l-.758-.676a3.738 3.738 0 0 0-3.676-.77 3.738 3.738 0 0 0-2.5 2.805 3.76 3.76 0 0 0 1.188 3.567L8 13.668l5.742-5.117a3.75 3.75 0 0 0-2.348-6.586zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/help-link-symbolic.svg b/data/icons/help-link-symbolic.svg
new file mode 100644
index 0000000..52f8fe6
--- /dev/null
+++ b/data/icons/help-link-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="color:#bebebe;fill:#2e3436;-inkscape-stroke:none" d="M8 0C3.585 0 0 3.585 0 8s3.585 8 8 8 8-3.585 8-8-3.585-8-8-8zm0 2c.973 0 1.887.227 2.695.629L9.461 5.14A2.324 2.324 0 0 0 8.662 5H7.338c-.28 0-.55.05-.799.14L5.305 2.63A6.034 6.034 0 0 1 8 2zM2.613 5.338l2.51 1.254A2.32 2.32 0 0 0 5 7.338v1.324c0 .28.05.55.14.799L2.64 10.713A6.032 6.032 0 0 1 2 8c0-.96.222-1.862.613-2.662zm10.774 0C13.778 6.138 14 7.04 14 8c0 .98-.231 1.9-.639 2.713L10.86 9.46c.092-.25.141-.52.141-.799V7.338c0-.26-.044-.512-.123-.746l2.51-1.254zM7.337 6h1.325C9.412 6 10 6.588 10 7.338v1.324C10 9.412 9.412 10 8.662 10H7.338C6.588 10 6 9.412 6 8.662V7.338C6 6.588 6.588 6 7.338 6zm-.77 4.867c.241.085.5.133.77.133h1.325c.27 0 .53-.048.772-.133l1.254 2.508C9.88 13.775 8.97 14 8 14c-.97 0-1.881-.226-2.688-.625l1.254-2.508z"/></svg> \ No newline at end of file
diff --git a/data/icons/hicolor/meson.build b/data/icons/hicolor/meson.build
new file mode 100644
index 0000000..6f92a45
--- /dev/null
+++ b/data/icons/hicolor/meson.build
@@ -0,0 +1,6 @@
+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')
+install_data('symbolic/app-remove-symbolic.svg',
+ install_dir : 'share/icons/hicolor/scalable/actions')
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="36" x2="60" y1="68" y2="68">
+ <stop offset="0" stop-color="#ed336c"/>
+ <stop offset="1" stop-color="#ffa348"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 1 -1 0 144 -32)" gradientUnits="userSpaceOnUse" x1="72" x2="96" y1="68" y2="68">
+ <stop offset="0" stop-color="#404ce6"/>
+ <stop offset="1" stop-color="#c061cb"/>
+ </linearGradient>
+ <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="68.84919" x2="95.257637" y1="84" y2="84">
+ <stop offset="0" stop-color="#33d1c6"/>
+ <stop offset="1" stop-color="#1c25d8"/>
+ </linearGradient>
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="36" x2="60" y1="68" y2="68">
+ <stop offset="0" stop-color="#ed336c"/>
+ <stop offset="1" stop-color="#ffa348"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 1 -1 0 144 -32)" gradientUnits="userSpaceOnUse" x1="72" x2="96" y1="68" y2="68">
+ <stop offset="0" stop-color="#404ce6"/>
+ <stop offset="1" stop-color="#c061cb"/>
+ </linearGradient>
+ <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="68.84919" x2="95.257637" y1="84" y2="84">
+ <stop offset="0" stop-color="#33d1c6"/>
+ <stop offset="1" stop-color="#1c25d8"/>
+ </linearGradient>
+ <clipPath id="d">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <clipPath id="e">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <filter id="f" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="g">
+ <g clip-path="url(#e)" filter="url(#f)">
+ <g clip-path="url(#d)">
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+ </g>
+ </g>
+ </mask>
+ <mask id="h">
+ <g filter="url(#f)">
+ <rect fill-opacity="0.8" height="128" width="128"/>
+ </g>
+ </mask>
+ <linearGradient id="i" gradientTransform="matrix(0 0.37 -0.98462 0 295.38501 -30.360001)" gradientUnits="userSpaceOnUse" x1="300" x2="428" y1="235" y2="235">
+ <stop offset="0" stop-color="#f9f06b"/>
+ <stop offset="1" stop-color="#f5c211"/>
+ </linearGradient>
+ <clipPath id="j">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <clipPath id="k">
+ <rect height="128" width="128"/>
+ </clipPath>
+ <path d="m 44 16 l 8 -8 h 24 l 8 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 52 8 l -8 8 v 16 h 8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 76 8 l 8 8 v 16 h -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 16 72 h 96 c 4.417969 0 8 3.582031 8 8 v 28 c 0 4.417969 -3.582031 8 -8 8 h -96 c -4.417969 0 -8 -3.582031 -8 -8 v -28 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 8 28 h 112 v 80 h -112 z m 0 0" fill="#e5e5e1"/>
+ <path d="m 8 68 h 112 v 40 h -112 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 44 56 h 8 c 4.417969 0 8 3.582031 8 8 v 8 c 0 4.417969 -3.582031 8 -8 8 h -8 c -4.417969 0 -8 -3.582031 -8 -8 v -8 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 76 64 c -6.628906 0 -12 -5.371094 -12 -12 s 5.371094 -12 12 -12 s 12 5.371094 12 12 s -5.371094 12 -12 12 z m 0 0" fill="url(#b)"/>
+ <path d="m 82.789062 70.976562 l -17.578124 10.046876 c -1.070313 0.609374 -1.730469 1.746093 -1.730469 2.976562 s 0.660156 2.367188 1.730469 2.976562 l 17.578124 10.046876 c 1.078126 0.617187 2.402344 0.609374 3.476563 -0.011719 c 1.074219 -0.625 1.734375 -1.769531 1.734375 -3.011719 v -20 c 0 -1.242188 -0.660156 -2.386719 -1.734375 -3.011719 c -1.074219 -0.621093 -2.398437 -0.628906 -3.476563 -0.011719 z m 0 0" fill="url(#c)"/>
+ <g clip-path="url(#k)" mask="url(#g)">
+ <g clip-path="url(#j)" mask="url(#h)">
+ <path d="m 128 80.640625 v 47.359375 h -128 v -47.359375 z m 0 0" fill="url(#i)"/>
+ <path d="m 13.308594 80.640625 l 47.355468 47.359375 h 21.214844 l -47.359375 -47.359375 z m 42.421875 0 l 47.363281 47.359375 h 21.214844 l -47.363282 -47.359375 z m 42.429687 0 l 29.839844 29.839844 v -21.210938 l -8.628906 -8.628906 z m -98.160156 7.90625 v 21.214844 l 18.238281 18.238281 h 21.214844 z m 0 0"/>
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/hicolor/symbolic/app-remove-symbolic.svg b/data/icons/hicolor/symbolic/app-remove-symbolic.svg
new file mode 100644
index 0000000..734827e
--- /dev/null
+++ b/data/icons/hicolor/symbolic/app-remove-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13 5v9H4V5H2v9c0 2 2 2 2 2h9c2 0 2-2 2-2V5zM9 6H8v6h1zM7 6H6v6h1zm4 0h-1v6h1zm1-6c2 0 2 2 2 2h2v2H1V2h2c0-2 2-2 2-2zm0 1H5v1h7z" fill="#474747"/></svg> \ No newline at end of file
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 1 4 v 8 c 0 1.109375 0.890625 2 2 2 h 10 c 1.109375 0 2 -0.890625 2 -2 v -8 z m 7 1.75 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m -2 3 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m 4 0 c 0.691406 0 1.25 0.558594 1.25 1.25 s -0.558594 1.25 -1.25 1.25 s -1.25 -0.558594 -1.25 -1.25 s 0.558594 -1.25 1.25 -1.25 z m 0 0"/>
+ <path d="m 6 1 l -1 1 v 3 h 2 v -3 h 2 v 3 h 2 v -3 l -1 -1 z m 0 0"/>
+</svg>
diff --git a/data/icons/meson.build b/data/icons/meson.build
new file mode 100644
index 0000000..13ca713
--- /dev/null
+++ b/data/icons/meson.build
@@ -0,0 +1 @@
+subdir('hicolor')
diff --git a/data/icons/money-none-symbolic.svg b/data/icons/money-none-symbolic.svg
new file mode 100644
index 0000000..9e74edf
--- /dev/null
+++ b/data/icons/money-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06L2.85 3.91l1.41 1.418a.985.985 0 0 1 .005-.004L5.94 7h-.003L9 10.063v-.004l.941.941h-.004l1.868 1.867h.004l2.662 2.662 1.06-1.06-2.396-2.397c.53-.537.861-1.268.861-2.076A3.01 3.01 0 0 0 11 7H9V5h4V3H9V1H7v2H5c-.281 0-.557.042-.82.117L1.53.47zM6.063 5H7v.938L6.062 5zm-3.97.277A2.99 2.99 0 0 0 5 8.992v.012h.82L2.094 5.277zM10.064 9H11a.98.98 0 0 1 .996.996.994.994 0 0 1-.26.678L10.062 9zM7 10.184V11H3v2h4v2h2v-2h.82L7 10.184z"/></svg> \ No newline at end of file
diff --git a/data/icons/money-symbolic.svg b/data/icons/money-symbolic.svg
new file mode 100644
index 0000000..0c06a39
--- /dev/null
+++ b/data/icons/money-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M7 1v2H5a2.996 2.996 0 0 0 0 5.992v.012h2v2H3v2h4v2h2v-2h2v-.012a3.01 3.01 0 0 0 2.996-2.996A3.01 3.01 0 0 0 11 7H9V5h4V3H9V1zM5.04 5H7v2H5.105a9.66 9.66 0 0 1-.109-.012.992.992 0 0 1-.863-1.492c.18-.309.504-.5.863-.5a.08.08 0 0 0 .043 0zM9 9h2c.563 0 .996.434.996.996s-.434.996-.996.996l-2 .012zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/nudity-none-symbolic.svg b/data/icons/nudity-none-symbolic.svg
new file mode 100644
index 0000000..410fbb3
--- /dev/null
+++ b/data/icons/nudity-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 2.498 2.498v.004l5.785 5.782.744.744s-.002 0-.002.002l1.473 1.472v-.004l3.502 3.502 1.06-1.06-3.111-3.112c.634-.634 1.049-1.67 1.049-2.845 0-1.933-1.117-3.5-2.5-3.5v-4h-8v.894L1.53.47zM6.97 4.512c.883 0 1.652.504 2.176 1.234.523.73.824 1.703.824 2.766 0 .128-.006.254-.016.379L8.92 7.857c-.091-.602-.304-1.132-.588-1.529-.383-.539-.86-.816-1.363-.816a.501.501 0 0 1 0-1zm-4 1.644v9.856h4v-4.45l.363-.105c.207-.059.415-.172.606-.336l-4.97-4.965zm5.586 5.582a3.042 3.042 0 0 1-.586.387v3.887h3v-1.856l-2.414-2.418z"/></svg> \ No newline at end of file
diff --git a/data/icons/nudity-symbolic.svg b/data/icons/nudity-symbolic.svg
new file mode 100644
index 0000000..6d7865c
--- /dev/null
+++ b/data/icons/nudity-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M2.969 1.012v15h4v-4.45l.363-.105c.84-.234 1.637-1.422 1.637-2.945 0-.871-.254-1.649-.637-2.184-.383-.539-.86-.816-1.363-.816a.501.501 0 0 1 0-1c.883 0 1.652.504 2.176 1.234.523.73.824 1.703.824 2.766 0 1.668-.809 3.023-2 3.613v3.887h3v-4c1.383 0 2.5-1.567 2.5-3.5 0-1.934-1.117-3.5-2.5-3.5v-4zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientTransform="matrix(0.25 0 0 0.244048 -0.499619 50.195877)" gradientUnits="userSpaceOnUse" x1="48" x2="464" y1="44" y2="44">
+ <stop offset="0" stop-color="#babdb6"/>
+ <stop offset="0.0416667" stop-color="#f6f5f4"/>
+ <stop offset="0.0833333" stop-color="#d5d3cf"/>
+ <stop offset="0.916667" stop-color="#deddda"/>
+ <stop offset="0.958333" stop-color="#f6f5f4"/>
+ <stop offset="1" stop-color="#babdb6"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(-0.471598 0 0 0.471598 569.325439 -130.366928)" gradientUnits="userSpaceOnUse" x1="953.275024" x2="944.207458" y1="350.855988" y2="359.923553">
+ <stop offset="0" stop-color="#e9b96e"/>
+ <stop offset="1" stop-color="#dc9321"/>
+ </linearGradient>
+ <linearGradient id="c" gradientTransform="matrix(-0.358336 0 0 0.358336 230.872086 1.097)" gradientUnits="userSpaceOnUse" x1="418.838409" x2="433.349823" y1="227" y2="212.868271">
+ <stop offset="0" stop-color="#9a9996"/>
+ <stop offset="0.415508" stop-color="#c0bfbc"/>
+ <stop offset="1" stop-color="#deddda"/>
+ </linearGradient>
+ <radialGradient id="d" cx="450.948059" cy="225.394623" gradientTransform="matrix(-0.658592 0 0 0.658592 370.111938 -72.351868)" gradientUnits="userSpaceOnUse" r="39.999989">
+ <stop offset="0" stop-color="#5b5b5b"/>
+ <stop offset="0.634455" stop-color="#262e39"/>
+ <stop offset="1" stop-color="#113f78"/>
+ </radialGradient>
+ <filter id="e" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="f">
+ <g filter="url(#e)">
+ <rect fill-opacity="0.3" height="128" width="128"/>
+ </g>
+ </mask>
+ <clipPath id="g">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <linearGradient id="h" gradientUnits="userSpaceOnUse" x1="19.25" x2="54.820038" y1="55.999985" y2="91.570023">
+ <stop offset="0" stop-color="#dc8add"/>
+ <stop offset="1" stop-color="#103c72"/>
+ </linearGradient>
+ <radialGradient id="i" cx="67.502945" cy="244.504639" gradientTransform="matrix(1.001091 -0.00000013 0.00000014 0.81247 -0.576645 -108.652573)" gradientUnits="userSpaceOnUse" r="11.077337">
+ <stop offset="0" stop-color="#113f78" stop-opacity="0"/>
+ <stop offset="0.786035" stop-color="#113f78" stop-opacity="0.105882"/>
+ <stop offset="1" stop-color="#103c72"/>
+ </radialGradient>
+ <mask id="j">
+ <g filter="url(#e)">
+ <rect fill-opacity="0.2" height="128" width="128"/>
+ </g>
+ </mask>
+ <clipPath id="k">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <path d="m 24 123 v 1 h 16 v -1 z m 64 0 v 1 h 16 v -1 z m 0 0" fill="#9a9996"/>
+ <path d="m 88 124 v -4 l -24 -96 v 4 z" fill="#77767b" fill-rule="evenodd"/>
+ <path d="m 40 124 v -4 l 24 -96 v 4 z" fill="#77767b" fill-rule="evenodd"/>
+ <path d="m 64 4 c -2.90625 0.003906 -5.417969 2.027344 -6.039062 4.867188 l -0.003907 -0.003907 l -33.957031 114.136719 h 16 l 24 -101 l 24 101 h 16 l -33.992188 -114.285156 l -0.007812 0.011718 c -0.671875 -2.773437 -3.148438 -4.722656 -6 -4.726562 z m 0 5 c 1.65625 0 3 1.34375 3 3 s -1.34375 3 -3 3 s -3 -1.34375 -3 -3 s 1.34375 -3 3 -3 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 20 30 h 88 c 4.417969 0 8 3.582031 8 8 v 66 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -66 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 20 20 h 88 c 4.417969 0 8 3.582031 8 8 v 72 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -72 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 128 36 l -48.90625 48.910156 c -2.199219 2.285156 -5.84375 2.324219 -8.085938 0.082032 c -2.242187 -2.242188 -2.203124 -5.886719 0.082032 -8.085938 l 41.132812 -41.132812 c 4.898438 -4.203126 11.777344 -3.773438 15.777344 0.226562 z m 0 0" fill="url(#b)"/>
+ <path d="m 90.683594 59.585938 c 5.148437 0.003906 7.6875 6.257812 3.996094 9.847656 l -19.066407 21.058594 c -2.785156 2.828124 -7.339843 2.847656 -10.144531 0.039062 c -2.804688 -2.804688 -2.785156 -7.359375 0.042969 -10.140625 l 21.058593 -19.066406 c 1.078126 -1.113281 2.5625 -1.738281 4.113282 -1.738281 z m 0 0" fill="url(#c)"/>
+ <path d="m 72 68 c 8.835938 0 16 7.164062 16 16 s -7.164062 16 -16 16 h -16 v -16 c 0 -8.835938 7.164062 -16 16 -16 z m 0 0" fill="url(#d)"/>
+ <g clip-path="url(#g)" mask="url(#f)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 72.003906 95 c 0 -1.65625 1.339844 -2.996094 2.996094 -2.996094 s 2.996094 1.339844 2.996094 2.996094 s -1.339844 2.996094 -2.996094 2.996094 s -2.996094 -1.339844 -2.996094 -2.996094 z m 0 0" fill="#ffffff"/>
+ </g>
+ <path d="m 12 39.867188 v 24 c 2.003906 -1.125 4.425781 -1.488282 6.671875 -1.003907 s 4.304687 1.8125 5.667969 3.664063 c 1.761718 2.390625 2.3125 5.460937 2.457031 8.429687 c 0.144531 2.964844 -0.066406 5.957031 0.394531 8.894531 c 0.628906 3.996094 2.539063 7.792969 5.410156 10.648438 c 2.867188 2.855469 6.6875 4.753906 10.703126 5.269531 c 2.609374 0.335938 5.253906 0.203125 7.886718 0.210938 l 4.808594 0.019531 c 0 -0.441406 0 -0.886719 0 -1.328125 c 0 -0.222656 0 -0.449219 0 -0.671875 c -2.035156 -0.476562 -4.085938 -0.863281 -6.15625 -1.160156 c -1.339844 -0.191406 -2.695312 -0.34375 -3.996094 -0.734375 c -1.300781 -0.386719 -2.5625 -1.023438 -3.460937 -2.039063 c -0.757813 -0.855468 -1.226563 -1.941406 -1.429688 -3.066406 c -0.207031 -1.121094 -0.152343 -2.28125 0.046875 -3.402344 c 0.40625 -2.246094 1.390625 -4.339844 2.132813 -6.5 c 2.398437 -6.988281 2.167969 -14.796875 -0.375 -21.730468 c -2.804688 -7.644532 -8.546875 -14.3125 -16.011719 -17.5625 c -4.605469 -2.007813 -9.78125 -2.6875 -14.75 -1.9375 z m 0 0" fill="url(#h)"/>
+ <path d="m 46.90625 96.375 l 4.285156 3.605469 l 18.808594 0.019531 l -2 -3 c -3.144531 -4.714844 -9.132812 -9 -12 -9 c 0 6 -5.5625 9.097656 -9.09375 8.375 z m 0 0" fill="url(#i)"/>
+ <g clip-path="url(#k)" mask="url(#j)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 35 128 l -0.621094 2 h 16.054688 l 0.523437 -1.972656 z m 57.988281 0 l 0.5 2 h 16.132813 l -0.621094 -2 z m 0 0"/>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="12" x2="116" y1="64" y2="64">
+ <stop offset="0" stop-color="#77767b"/>
+ <stop offset="0.05" stop-color="#c0bfbc"/>
+ <stop offset="0.1" stop-color="#9a9996"/>
+ <stop offset="0.899999" stop-color="#9a9996"/>
+ <stop offset="0.95" stop-color="#c0bfbc"/>
+ <stop offset="1" stop-color="#77767b"/>
+ </linearGradient>
+ <filter id="b" height="100%" width="100%" x="0%" y="0%">
+ <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+ </filter>
+ <mask id="c">
+ <g filter="url(#b)">
+ <rect fill-opacity="0.05" height="128" width="128"/>
+ </g>
+ </mask>
+ <radialGradient id="d" cx="63.999996" cy="194.190475" gradientTransform="matrix(4.727273 -0.00000079 0.0000003 1.636364 -230.545471 -205.766182)" gradientUnits="userSpaceOnUse" r="44">
+ <stop offset="0" stop-color="#ffffff"/>
+ <stop offset="1" stop-color="#ffffff" stop-opacity="0.094118"/>
+ </radialGradient>
+ <clipPath id="e">
+ <rect height="152" width="192"/>
+ </clipPath>
+ <path d="m 20 22 h 88 c 4.417969 0 8 3.582031 8 8 v 78 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -78 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="url(#a)"/>
+ <path d="m 20 12 h 88 c 4.417969 0 8 3.582031 8 8 v 80 c 0 4.417969 -3.582031 8 -8 8 h -88 c -4.417969 0 -8 -3.582031 -8 -8 v -80 c 0 -4.417969 3.582031 -8 8 -8 z m 0 0" fill="#deddda"/>
+ <path d="m 20 104 h 88 c 2.210938 0 4 -1.789062 4 -4 v -80 c 0 -2.210938 -1.789062 -4 -4 -4 h -88 c -2.210938 0 -4 1.789062 -4 4 v 80 c 0 2.210938 1.789062 4 4 4 z m 0 0" fill="#241f31"/>
+ <g clip-path="url(#e)" mask="url(#c)" transform="matrix(1 0 0 1 -8 -16)">
+ <path d="m 116 116 h -88 v -78 h 88 z m 0 0" fill="url(#d)"/>
+ </g>
+ <path d="m 24 28 h 28 v 4 h -28 z m 0 0" fill="#ff7800"/>
+ <path d="m 24 36 h 16 v 4 h -16 z m 0 0" fill="#deddda"/>
+ <path d="m 32 44 h 42 v 4 h -42 z m 0 0" fill="#3584e4"/>
+ <path d="m 32 52 h 22 v 4 h -22 z m 0 0" fill="#deddda"/>
+ <path d="m 40 60 h 36 v 4 h -36 z m 0 0" fill="#deddda"/>
+ <path d="m 40 68 h 20 v 4 h -20 z m 0 0" fill="#8ff0a4"/>
+ <path d="m 48 76 h 24 v 4 h -24 z m 0 0" fill="#ff7800"/>
+ <path d="m 24 84 h 32 v 4 h -32 z m 0 0" fill="#deddda"/>
+ <path d="m 24 92 h 18 v 4 h -18 z m 0 0" fill="#3584e4"/>
+ <path d="m 32 76 h 14 v 4 h -14 z m 0 0" fill="#8ff0a4"/>
+ <path d="m 62 68 h 20 v 4 h -20 z m 0 0" fill="#deddda"/>
+ <path d="m 78 60 h 18 v 4 h -18 z m 0 0" fill="#3584e4"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg">
+ <path d="m 64 4 l 60 100 h -120 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 64 5.503906 v 90.496094 h 8 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 69.878906 72 l -5.878906 12 l 8 20 h 52 l -18.773438 -31.875 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 64 5.503906 v 90.496094 h -8 z m 0 0" fill="#deddda"/>
+ <path d="m 23.199219 72 l -19.199219 32 h 52 l 8 -20 l -5.878906 -12 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 58.121094 72 l 5.878906 12 v 44 l -8 -24 z m 0 0" fill="#deddda"/>
+ <path d="m 69.878906 72 l -5.878906 12 v 44 l 8 -24 z m 0 0" fill="#c0bfbc"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#9a9996"/>
+ <stop offset="1" stop-color="#9a9996" stop-opacity="0"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0 -1.333333 -1.333333 0 414.662385 134.674892)" x1="38" x2="50" xlink:href="#a" y1="248" y2="248"/>
+ <linearGradient id="c" gradientTransform="matrix(0 -1.333333 -1.333333 0 374.778504 134.674892)" x1="38" x2="50" xlink:href="#a" y1="248" y2="248"/>
+ <path d="m 89.175781 41.980469 l 6.082031 7.5625 l 22.648438 -4.671875 l 9.875 47.90625 c 1.488281 7.234375 -2.171875 14.546875 -8.851562 17.695312 c -6.679688 3.148438 -14.648438 1.316406 -19.28125 -4.433594 l -35.40625 -44 z m 0 0" fill="#deddda"/>
+ <path d="m 39.175781 41.980469 l -6.082031 7.5625 l -22.648438 -4.671875 l -9.875 47.90625 c -1.488281 7.234375 2.171876 14.546875 8.851563 17.695312 c 6.679687 3.148438 14.648437 1.316406 19.28125 -4.433594 l 35.40625 -44 z m 0 0" fill="#deddda"/>
+ <path d="m 41.113281 28.007812 h 46 v 32 h -46 z m 0 0" fill="#deddda"/>
+ <path d="m 60.445312 59.289062 l -31.984374 39.75 c -3.859376 4.78125 -10.117188 6.929688 -16.101563 5.527344 s -10.632813 -6.105468 -11.96875 -12.105468 l -0.066406 0.316406 c -1.484375 7.234375 2.171875 14.546875 8.855469 17.695312 c 6.679687 3.148438 14.648437 1.316406 19.28125 -4.433594 l 35.402343 -44 z m 7.101563 0 l -3.421875 2.75 l 35.40625 44 c 4.632812 5.75 12.601562 7.582032 19.28125 4.433594 c 6.683594 -3.148437 10.339844 -10.460937 8.851562 -17.695312 l -0.0625 -0.316406 c -1.335937 6 -5.988281 10.703124 -11.96875 12.105468 c -5.984374 1.402344 -12.242187 -0.746094 -16.101562 -5.527344 z m 0 0" fill="#5e5c64" fill-opacity="0.235294"/>
+ <g fill="#c0bfbc">
+ <path d="m 54.113281 49.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0"/>
+ <path d="m 46.113281 32.007812 h 36 v 52 h -36 z m 0 0"/>
+ <path d="m 118.113281 49.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0"/>
+ <path d="m 57.996094 80.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0"/>
+ <path d="m 97.996094 80.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0"/>
+ </g>
+ <path d="m 46.113281 32.007812 h 36 v 48 h -36 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 57.996094 78.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 97.996094 78.007812 c 0 7.667969 -6.214844 13.882813 -13.882813 13.882813 s -13.886719 -6.214844 -13.886719 -13.882813 c 0 -7.667968 6.21875 -13.882812 13.886719 -13.882812 s 13.882813 6.214844 13.882813 13.882812 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 54.113281 47.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 118.113281 47.007812 c 0 12.152344 -9.851562 22 -22 22 c -12.152343 0 -22 -9.847656 -22 -22 c 0 -12.148437 9.847657 -22 22 -22 c 12.148438 0 22 9.851563 22 22 z m 0 0" fill="#f6f5f4"/>
+ <path d="m 29.996094 36.007812 c -1.109375 0 -2 0.890626 -2 2 v 6 h -6 c -1.109375 0 -2 0.890626 -2 2 v 4 c 0 1.109376 0.890625 2 2 2 h 6 v 6 c 0 1.109376 0.890625 2 2 2 h 4 c 1.109375 0 2 -0.890624 2 -2 v -6 h 6 c 1.109375 0 2 -0.890624 2 -2 v -4 c 0 -1.109374 -0.890625 -2 -2 -2 h -6 v -6 c 0 -1.109374 -0.890625 -2 -2 -2 z m 0 0" fill="#3d3846"/>
+ <path d="m 29.996094 34.007812 c -1.109375 0 -2 0.890626 -2 2 v 6 h -6 c -1.109375 0 -2 0.890626 -2 2 v 4 c 0 1.109376 0.890625 2 2 2 h 6 v 6 c 0 1.109376 0.890625 2 2 2 h 4 c 1.109375 0 2 -0.890624 2 -2 v -6 h 6 c 1.109375 0 2 -0.890624 2 -2 v -4 c 0 -1.109374 -0.890625 -2 -2 -2 h -6 v -6 c 0 -1.109374 -0.890625 -2 -2 -2 z m 0 0" fill="#5e5c64"/>
+ <path d="m 109.996094 50.007812 v 2 c 0 3.324219 -2.675782 6 -6 6 c -3.324219 0 -6 -2.675781 -6 -6 v -2 z m 0 0" fill="#c01c28"/>
+ <path d="m 97.996094 50.007812 c 0 3.3125 2.6875 6 6 6 s 6 -2.6875 6 -6 s -2.6875 -6 -6 -6 s -6 2.6875 -6 6 z m 0 0" fill="#ed333b"/>
+ <path d="m 93.996094 42.007812 v 2 c 0 3.324219 -2.675782 6 -6 6 c -3.324219 0 -6 -2.675781 -6 -6 v -2 z m 0 0" fill="#1a5fb4"/>
+ <path d="m 81.996094 42.007812 c 0 3.3125 2.6875 6 6 6 s 6 -2.6875 6 -6 s -2.6875 -6 -6 -6 s -6 2.6875 -6 6 z m 0 0" fill="#3584e4"/>
+ <path d="m 54.113281 78.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#241f31"/>
+ <path d="m 94.113281 78.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#241f31"/>
+ <path d="m 54.113281 76.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#3d3846"/>
+ <path d="m 94.113281 76.007812 c 0 5.523438 -4.480469 10 -10 10 c -5.523437 0 -10 -4.476562 -10 -10 c 0 -5.523437 4.476563 -10 10 -10 c 5.519531 0 10 4.476563 10 10 z m 0 0" fill="#3d3846"/>
+ <path d="m 83.996094 68.007812 c -4.417969 0 -8 3.582032 -8 8 c 0 4.417969 3.582031 8 8 8 c 4.417968 0 8 -3.582031 8 -8 c 0 -4.417968 -3.582032 -8 -8 -8 z m 0 0" fill="url(#b)"/>
+ <path d="m 44.113281 68.007812 c -4.417969 0 -8 3.582032 -8 8 c 0 4.417969 3.582031 8 8 8 s 8 -3.582031 8 -8 c 0 -4.417968 -3.582031 -8 -8 -8 z m 0 0" fill="url(#c)"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <radialGradient id="a" cx="64" cy="40" gradientUnits="userSpaceOnUse" r="60">
+ <stop offset="0" stop-color="#f8e45c"/>
+ <stop offset="1" stop-color="#f5c211"/>
+ </radialGradient>
+ <linearGradient id="b" gradientUnits="userSpaceOnUse">
+ <stop offset="0" stop-color="#f66151"/>
+ <stop offset="0.6" stop-color="#e6272f"/>
+ <stop offset="1" stop-color="#e01b24"/>
+ </linearGradient>
+ <radialGradient id="c" cx="52" cy="29.856375" gradientTransform="matrix(0.776974 0 0 0.621716 11.597331 20.590141)" r="16.084499" xlink:href="#b"/>
+ <radialGradient id="d" cx="52" cy="29.856375" gradientTransform="matrix(0.776974 0 0 0.621716 51.597511 20.590141)" r="16.084499" xlink:href="#b"/>
+ <path d="m 124 64 c 0 33.136719 -26.863281 60 -60 60 s -60 -26.863281 -60 -60 s 26.863281 -60 60 -60 s 60 26.863281 60 60 z m 0 0" fill="url(#a)"/>
+ <path d="m 123.824219 59.539062 c -1.871094 31.679688 -28.089844 56.421876 -59.824219 56.460938 c -31.402344 -0.003906 -57.488281 -24.222656 -59.824219 -55.539062 c -0.09375 1.175781 -0.152343 2.359374 -0.175781 3.539062 c 0 33.136719 26.863281 60 60 60 s 60 -26.863281 60 -60 c -0.003906 -1.488281 -0.0625 -2.976562 -0.175781 -4.460938 z m 0 0" fill="#e5a50a"/>
+ <path d="m 71.632812 64.992188 c 0 2.503906 -1.457031 4.816406 -3.816406 6.066406 c -2.363281 1.253906 -5.269531 1.253906 -7.632812 0 c -2.359375 -1.25 -3.816406 -3.5625 -3.816406 -6.066406" fill="none" stroke="#3d3846" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"/>
+ <path d="m 51.910156 31.996094 c -2.082031 0.058594 -4.0625 0.929687 -5.515625 2.425781 l -2.34375 2.34375 l -2.34375 -2.34375 c -1.507812 -1.546875 -3.578125 -2.421875 -5.738281 -2.421875 c -3.257812 0 -6.1875 1.976562 -7.414062 4.992188 c -1.222657 3.019531 -0.496094 6.476562 1.839843 8.746093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 2.371094 -2.296875 3.085938 -5.8125 1.804688 -8.855469 c -1.285157 -3.039062 -4.300781 -4.980468 -7.601563 -4.886718 z m 0 0" fill="url(#c)"/>
+ <path d="m 91.914062 31.996094 c -2.085937 0.058594 -4.066406 0.929687 -5.519531 2.425781 l -2.34375 2.34375 l -2.34375 -2.34375 c -1.507812 -1.546875 -3.578125 -2.421875 -5.738281 -2.421875 c -3.257812 0 -6.1875 1.976562 -7.410156 4.992188 c -1.226563 3.019531 -0.5 6.476562 1.835937 8.746093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 2.371094 -2.296875 3.085938 -5.8125 1.804688 -8.855469 c -1.285157 -3.039062 -4.300781 -4.980468 -7.597657 -4.886718 z m 0 0" fill="url(#d)"/>
+ <g fill="#c01c28">
+ <path d="m 28.121094 38.492188 c -0.511719 2.644531 0.34375 5.367187 2.273437 7.246093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 1.933594 -1.875 2.792969 -4.597656 2.285157 -7.246093 c -0.308594 1.617187 -1.105469 3.101562 -2.285157 4.246093 l -10.824219 10.824219 c -1.5625 1.5625 -4.09375 1.5625 -5.65625 0 v 0.007812 l -10.832031 -10.832031 c -1.175781 -1.148437 -1.972656 -2.628906 -2.273437 -4.246093 z m 0 0"/>
+ <path d="m 68.121094 38.492188 c -0.511719 2.644531 0.34375 5.367187 2.273437 7.246093 l 10.832031 10.832031 v -0.007812 c 1.5625 1.5625 4.09375 1.5625 5.65625 0 l 10.824219 -10.824219 c 1.933594 -1.875 2.792969 -4.597656 2.285157 -7.246093 c -0.308594 1.617187 -1.105469 3.101562 -2.285157 4.246093 l -10.824219 10.824219 c -1.5625 1.5625 -4.09375 1.5625 -5.65625 0 v 0.007812 l -10.832031 -10.832031 c -1.175781 -1.148437 -1.972656 -2.628906 -2.273437 -4.246093 z m 0 0"/>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="20.00001801213" x2="108.00010899163" y1="88.00001906939" y2="88.00001906939">
+ <stop offset="0" stop-color="#1a5fb4"/>
+ <stop offset="0.0340909" stop-color="#1c71d8"/>
+ <stop offset="0.0681818" stop-color="#3584e4"/>
+ <stop offset="0.931818" stop-color="#3584e4"/>
+ <stop offset="0.965909" stop-color="#1c71d8"/>
+ <stop offset="1" stop-color="#1a5fb4"/>
+ </linearGradient>
+ <linearGradient id="b" gradientTransform="matrix(0.272543 0 0 0.295903 1.85959 50.447067)" gradientUnits="userSpaceOnUse" x1="88.574776" x2="367.430145" y1="1.578945" y2="1.578945">
+ <stop offset="0" stop-color="#1a5fb4"/>
+ <stop offset="0.0263158" stop-color="#3584e4"/>
+ <stop offset="0.973324" stop-color="#3584e4"/>
+ <stop offset="1" stop-color="#1a5fb4"/>
+ </linearGradient>
+ <path d="m 28.722656 44 h 70.554688 c 4.816406 0 8.722656 3.90625 8.722656 8.722656 v 58.554688 c 0 4.816406 -3.90625 8.722656 -8.722656 8.722656 h -70.554688 c -4.816406 0 -8.722656 -3.90625 -8.722656 -8.722656 v -58.554688 c 0 -4.816406 3.90625 -8.722656 8.722656 -8.722656 z m 0 0" fill="url(#a)"/>
+ <path d="m 28.722656 8 h 70.554688 c 4.816406 0 8.722656 3.90625 8.722656 8.722656 v 70.554688 c 0 4.816406 -3.90625 8.722656 -8.722656 8.722656 h -70.554688 c -4.816406 0 -8.722656 -3.90625 -8.722656 -8.722656 v -70.554688 c 0 -4.816406 3.90625 -8.722656 8.722656 -8.722656 z m 0 0" fill="#62a0ea"/>
+ <path d="m 48 80 h 32 c 2.210938 0 4 1.789062 4 4 v 22 c 0 2.210938 -1.789062 4 -4 4 h -32 c -2.210938 0 -4 -1.789062 -4 -4 v -22 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="#62a0ea"/>
+ <path d="m 30 14 h 68 c 2.210938 0 4 1.789062 4 4 v 68 c 0 2.210938 -1.789062 4 -4 4 h -68 c -2.210938 0 -4 -1.789062 -4 -4 v -68 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="url(#b)"/>
+ <path d="m 48 84 h 32 c 2.210938 0 4 1.789062 4 4 v 12 c 0 2.210938 -1.789062 4 -4 4 h -32 c -2.210938 0 -4 -1.789062 -4 -4 v -12 c 0 -2.210938 1.789062 -4 4 -4 z m 0 0" fill="#deddda"/>
+ <path d="m 30.203125 20 c -1.203125 0 -2.179687 1.03125 -2.179687 2.304688 l -0.0625 66.773437 s 1.039062 0.582031 2.039062 0.582031 h 14 v 6.339844 h 40 v -6.339844 h 14 c 1 0 2.011719 -0.566406 2.011719 -0.566406 l -0.066407 -66.789062 c 0 -1.273438 -0.976562 -2.304688 -2.179687 -2.304688 z m 0 0" fill="#ffffff"/>
+ <path d="m 40 68 l 6 6 l 10 -10" fill="none" stroke="#3d3846" stroke-width="4"/>
+ <path d="m 64 40 h 24 v 4 h -24 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 64 68 h 24 v 4 h -24 z m 0 0" fill="#c0bfbc"/>
+ <path d="m 40 40 l 6 6 l 10 -10" fill="none" stroke="#3d3846" stroke-width="4"/>
+</svg>
diff --git a/data/icons/package-x-generic-symbolic.svg b/data/icons/package-x-generic-symbolic.svg
new file mode 100644
index 0000000..abe6ec5
--- /dev/null
+++ b/data/icons/package-x-generic-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3434">
+ <path d="m 4.027344 0.996094 c -1.660156 0 -3.027344 1.367187 -3.027344 3.027344 v 7.910156 c 0 1.660156 1.367188 3.027344 3.027344 3.027344 h 7.945312 c 1.660156 0 3.027344 -1.367188 3.027344 -3.027344 v -7.910156 c 0 -1.660157 -1.367188 -3.027344 -3.027344 -3.027344 z m 0 2 h 7.945312 c 0.585938 0 1.027344 0.441406 1.027344 1.027344 v 7.910156 c 0 0.585937 -0.441406 1.027344 -1.027344 1.027344 h -7.945312 c -0.589844 0 -1.027344 -0.441407 -1.027344 -1.027344 v -7.910156 c 0 -0.585938 0.4375 -1.027344 1.027344 -1.027344 z m 0 0"/>
+ <path d="m 4.027344 1 c -1.660156 0 -3.027344 1.367188 -3.027344 3.027344 v 0.945312 s 1.386719 2.03125 3.027344 2.03125 h 7.945312 c 1.46875 0 3.027344 -2.03125 3.027344 -2.03125 v -0.945312 c 0 -1.660156 -1.367188 -3.027344 -3.027344 -3.027344 z m 0 2 h 7.945312 c 0.585938 0 1.027344 0.441406 1.027344 1.027344 v 0.945312 c 0 0.585938 -0.441406 1.027344 -1.027344 1.027344 h -7.945312 c -0.589844 0 -1.027344 -0.441406 -1.027344 -1.027344 v -0.945312 c 0 -0.585938 0.4375 -1.027344 1.027344 -1.027344 z m 0 0"/>
+ <path d="m 7 0.996094 h 2 v 10.03125 l -2 -0.988282 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/padlock-open-symbolic.svg b/data/icons/padlock-open-symbolic.svg
new file mode 100644
index 0000000..31efb43
--- /dev/null
+++ b/data/icons/padlock-open-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C5.801 0 4 1.801 4 4v1a1 1 0 0 0 1 1 1 1 0 0 0 1-1V4c0-1.125.875-2 2-2s2 .875 2 2v4H4c-1.108 0-2 .892-2 2v5c0 .554.446 1 1 1h10c.554 0 1-.446 1-1v-5c0-1.108-.892-2-2-2V4c0-2.199-1.801-4-4-4Z" style="fill:#241f31"/></svg> \ No newline at end of file
diff --git a/data/icons/phone-symbolic.svg b/data/icons/phone-symbolic.svg
new file mode 100644
index 0000000..f73dab6
--- /dev/null
+++ b/data/icons/phone-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M5 0C3.355 0 2 1.355 2 3v10c0 1.645 1.355 3 3 3h6c1.645 0 3-1.355 3-3V3c0-1.645-1.355-3-3-3zm0 2h1c0 .554.446 1 1 1h2c.554 0 1-.446 1-1h1c.571 0 1 .429 1 1v9c0 .554-.446 1-1 1H5c-.554 0-1-.446-1-1V3c0-.571.429-1 1-1z"/></svg> \ No newline at end of file
diff --git a/data/icons/pub-symbolic.svg b/data/icons/pub-symbolic.svg
new file mode 100644
index 0000000..e6ba35c
--- /dev/null
+++ b/data/icons/pub-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M7.262.996a1.982 1.982 0 0 0-1.465.692A1.99 1.99 0 0 0 4.297 1c-1.11 0-2 .89-2 2H5v4.5a.499.499 0 1 0 1 0V3h6.02c-.344-.598-.98-1-1.723-1-.414 0-.8.125-1.121.34A1.982 1.982 0 0 0 7.262.996zM3 4v7.52A2.474 2.474 0 0 0 5.48 14h4.04a2.47 2.47 0 0 0 2.43-2h.257A2.808 2.808 0 0 0 15 9.207V6.793A2.808 2.808 0 0 0 12.207 4H7v3.5C7 8.332 6.332 9 5.5 9S4 8.332 4 7.5V4H3zm9 2h.207a.77.77 0 0 1 .793.793v2.414a.77.77 0 0 1-.793.793H12V6zM1 15v1h14v-1H1z"/></svg> \ No newline at end of file
diff --git a/data/icons/review-symbolic.svg b/data/icons/review-symbolic.svg
new file mode 100644
index 0000000..3c7529b
--- /dev/null
+++ b/data/icons/review-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3436">
+ <path d="m 2.5 0 c -1.382812 0 -2.50390625 1.117188 -2.5 2.5 v 8 c 0 1.386719 1.113281 2.5 2.5 2.5 h 8.375 l 3.125 3 v -3.0625 c 1.164062 -0.230469 2 -1.253906 2 -2.4375 v -8 c 0 -1.386719 -1.113281 -2.5 -2.5 -2.5 z m 0 2 h 11 c 0.277344 0 0.5 0.222656 0.5 0.5 v 8 c 0 0.277344 -0.222656 0.5 -0.5 0.5 h -11 c -0.277344 0 -0.5 -0.222656 -0.5 -0.5 v -8 c 0 -0.277344 0.222656 -0.5 0.5 -0.5 z m 0 0"/>
+ <path d="m 4 7 h 6 v 2 h -6 z m 0 0"/>
+ <path d="m 4 4 h 8 v 2 h -8 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/safety-symbolic.svg b/data/icons/safety-symbolic.svg
new file mode 100644
index 0000000..a01e586
--- /dev/null
+++ b/data/icons/safety-symbolic.svg
@@ -0,0 +1 @@
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M2 1v7c0 2.072 1.498 3.695 2.832 4.889a18.66 18.66 0 0 0 2.66 1.972l.516.305.512-.31s1.32-.8 2.65-2.002C12.5 11.65 14 10.044 14 8V1H2zm2 2h8v.586l-4 4-1.793-1.793-1.414 1.414L8 10.414l4-4V8c0 .92-1 2.312-2.17 3.37-.913.824-1.477 1.154-1.836 1.386-.358-.226-.918-.543-1.828-1.358C5 10.355 4 8.98 4 8V3z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/icons/sign-language-symbolic.svg b/data/icons/sign-language-symbolic.svg
new file mode 100644
index 0000000..f1721ab
--- /dev/null
+++ b/data/icons/sign-language-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M9 7v.5s0 .5.5.5.5-.5.5-.5V2c0-.555.445-1 1-1s1 .445 1 1v9.5c0 .5.5.5.5.5l1.793-1.707a.992.992 0 0 1 .719-.305c1.082.086 1.144 1.27.695 1.719l-3 3C12 15.5 10.949 15.997 10 16H4c-3 0-3-3-3-3V3c0-.555.445-1 1-1s1 .445 1 1v4.5s0 .5.5.5.5-.5.5-.5V7c0-.555.445-1 1-1s1 .445 1 1v.5s0 .5.5.5.5-.5.5-.5V7c0-.555.453-.992 1-1 .586-.012 1 .445 1 1zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/snap-symbolic.svg b/data/icons/snap-symbolic.svg
new file mode 100644
index 0000000..f5f93f3
--- /dev/null
+++ b/data/icons/snap-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#2e3434">
+ <path d="m 1 0.996094 l 7.136719 10.847656 l 4.898437 -3.507812 z m 0 0"/>
+ <path d="m 5.507812 5.328125 c -0.339843 0.058594 -0.625 0.285156 -0.753906 0.597656 l -3.617187 8.652344 c -0.175781 0.414063 -0.050781 0.890625 0.296875 1.167969 c 0.351562 0.28125 0.847656 0.292968 1.210937 0.027344 l 6.929688 -4.984376 c 0.230469 -0.164062 0.382812 -0.421874 0.410156 -0.703124 c 0.03125 -0.285157 -0.058594 -0.566407 -0.25 -0.78125 l -3.316406 -3.664063 c -0.230469 -0.25 -0.574219 -0.371094 -0.910157 -0.3125 z m 0.480469 2.820313 l 1.511719 1.667968 l -3.15625 2.269532 z m 0 0"/>
+ <path d="m 6.042969 2.914062 l 9.957031 6.15625 l -0.039062 -5.066406 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/strong-language-none-symbolic.svg b/data/icons/strong-language-none-symbolic.svg
new file mode 100644
index 0000000..0d62d57
--- /dev/null
+++ b/data/icons/strong-language-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 14 14 1.06-1.06-1.035-1.035a1.5 1.5 0 0 0-1.426-1.426L12.062 11H14V2h-2v8.938l-1-1V9h-.938L9 7.937V7h2V5H9V2H7v3h-.938L5 3.937V2H3.062L1.532.469zM1 5v2h2v2H1v2h2v3h2v-3h2v3h2v-1.879L5.879 9H5v-.879L1.879 5H1z"/></svg> \ No newline at end of file
diff --git a/data/icons/strong-language-symbolic.svg b/data/icons/strong-language-symbolic.svg
new file mode 100644
index 0000000..5b22d2f
--- /dev/null
+++ b/data/icons/strong-language-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="M3 2v3H1v2h2v2H1v2h2v3h2v-3h2v3h2v-3h2V9H9V7h2V5H9V2H7v3H5V2H3zm9 0v9h2V2h-2zM5 7h2v2H5V7zm8 5a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 3 0A1.5 1.5 0 0 0 13 12z"/></svg> \ No newline at end of file
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 40 30 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 62 30 c -3.324219 0 -6 2.675781 -6 6 v 6 h -12 c -2.214844 0 -4 1.785156 -4 4 v 12 h 6 c 3.324219 0 6 2.675781 6 6 s -2.675781 6 -6 6 h -6 v 12 c 0 2.214844 1.785156 4 4 4 h 12 v -6 c 0 -3.324219 2.675781 -6 6 -6 s 6 2.675781 6 6 v 6 h 12 c 2.214844 0 4 -1.785156 4 -4 v -12 h 6 c 3.324219 0 6 -2.675781 6 -6 s -2.675781 -6 -6 -6 h -6 v -12 c 0 -2.214844 -1.785156 -4 -4 -4 h -12 v -6 c 0 -3.324219 -2.675781 -6 -6 -6 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 64.90625 30.5625 c -0.9375 0 -1.875 0.046875 -2.789062 0.132812 l -1.726563 8.898438 c -1.421875 0.3125 -2.816406 0.746094 -4.117187 1.328125 l -6.507813 -6.242187 c -1.652344 0.976562 -3.089844 2.183593 -4.515625 3.453124 l 3.851562 8.101563 c -0.945312 1.058594 -1.804687 2.21875 -2.523437 3.453125 l -8.898437 -1.195312 c -0.753907 1.738281 -1.3125 3.554687 -1.726563 5.445312 l 7.835937 4.25 c -0.074218 0.714844 -0.132812 1.390625 -0.132812 2.125 s 0.0625 1.410156 0.132812 2.125 l -7.835937 4.25 c 0.414063 1.890625 0.972656 3.707031 1.726563 5.445312 l 8.898437 -1.195312 c 0.71875 1.230469 1.578125 2.394531 2.523437 3.453125 l -3.851562 8.101563 c 1.425781 1.269531 2.863281 2.476562 4.515625 3.453124 l 6.507813 -6.242187 c 1.300781 0.582031 2.695312 1.015625 4.117187 1.328125 l 1.726563 8.898438 c 0.914062 0.085937 1.851562 0.132812 2.789062 0.132812 s 1.875 -0.046875 2.789062 -0.132812 l 1.726563 -8.898438 c 1.421875 -0.3125 2.816406 -0.746094 4.117187 -1.328125 l 6.507813 6.242187 c 1.652344 -0.976562 3.089844 -2.183593 4.515625 -3.453124 l -3.851562 -8.101563 c 0.945312 -1.058594 1.804687 -2.222656 2.523437 -3.453125 l 8.898437 1.195312 c 0.753907 -1.738281 1.3125 -3.554687 1.726563 -5.445312 l -7.835937 -4.25 c 0.074218 -0.714844 0.132812 -1.390625 0.132812 -2.125 s -0.058594 -1.410156 -0.132812 -2.125 l 7.835937 -4.25 c -0.414063 -1.890625 -0.972656 -3.707031 -1.726563 -5.445312 l -8.898437 1.195312 c -0.71875 -1.234375 -1.578125 -2.394531 -2.523437 -3.453125 l 3.851562 -8.101563 c -1.425781 -1.269531 -2.863281 -2.476562 -4.515625 -3.453124 l -6.507813 6.242187 c -1.300781 -0.582031 -2.695312 -1.015625 -4.117187 -1.328125 l -1.726563 -8.898438 c -0.914062 -0.085937 -1.851562 -0.132812 -2.789062 -0.132812 z m 0 17 c 7.042969 0 12.75 5.707031 12.75 12.75 s -5.707031 12.75 -12.75 12.75 s -12.75 -5.707031 -12.75 -12.75 s 5.707031 -12.75 12.75 -12.75 z m 0 0" fill="#99c1f1"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 52.1875 42 v 40 h 4 c 0.699219 0.003906 1.390625 -0.15625 2 -0.5 l 28 -16 c 1.242188 -0.6875 1.875 -2.09375 1.875 -3.5 s -0.632812 -2.8125 -1.875 -3.5 l -28 -16 c -0.609375 -0.34375 -1.300781 -0.503906 -2 -0.5 z m 0 0" fill="#99c1f1"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 18 41 h 57 v 57 h -57 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="f">
+ <path d="m 36 59 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="g">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="h">
+ <path d="m 48 47 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="i">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="j">
+ <path d="m 17 48 h 68 v 69 h -68 z m 0 0"/>
+ </clipPath>
+ <clipPath id="k">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="l">
+ <path d="m 68 27 h 55 v 56 h -55 z m 0 0"/>
+ </clipPath>
+ <clipPath id="m">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="n">
+ <path d="m 48 28 h 34 v 34 h -34 z m 0 0"/>
+ </clipPath>
+ <clipPath id="o">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="p">
+ <path d="m 45 44 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="q">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="r">
+ <path d="m 65 24 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="s">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="t">
+ <path d="m 51 24 h 35 v 35 h -35 z m 0 0"/>
+ </clipPath>
+ <clipPath id="u">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="v">
+ <path d="m 64 28 h 15 v 15 h -15 z m 0 0"/>
+ </clipPath>
+ <clipPath id="w">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="x">
+ <path d="m 58 34 h 10 v 9 h -10 z m 0 0"/>
+ </clipPath>
+ <clipPath id="y">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 200.630501 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.157014 -4.157014 c 0 -2.292573 1.861679 -4.154253 4.154252 -4.154253 c 2.295335 0.002763 4.154252 1.86168 4.157015 4.157015 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#f)">
+ <g clip-path="url(#g)">
+ <path d="m 225.556015 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154252 c 2.292573 0 4.151491 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#h)">
+ <g clip-path="url(#i)">
+ <path d="m 225.556015 114.1646 c 0 2.292572 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.86168 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154253 c 2.292573 0 4.151491 1.858918 4.154253 4.154253 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#j)">
+ <g clip-path="url(#k)">
+ <path d="m 43.515625 234.34375 l -2.9375 2.9375 v 5.875 l 11.75 11.75 h 5.875 l 2.9375 -2.9375" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(1 0 0 1 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#l)">
+ <g clip-path="url(#m)">
+ <path d="m -80.919532 221.401762 c 0 2.292573 -1.858918 4.151491 -4.154253 4.154253 c -2.292572 0 -4.154252 -1.86168 -4.154252 -4.154253 c 0.002762 -2.295335 1.86168 -4.154252 4.154252 -4.154252 c 2.295335 -0.002762 4.157015 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 -0.707107 0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#n)">
+ <g clip-path="url(#o)">
+ <path d="m 65.546875 29.746094 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -10.28125 10.28125 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 10.28125 -10.28125 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1a5fb4"/>
+ </g>
+ </g>
+ <g clip-path="url(#p)">
+ <g clip-path="url(#q)">
+ <path d="m 50.859375 44.433594 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#r)">
+ <g clip-path="url(#s)">
+ <path d="m 65.546875 29.746094 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#t)">
+ <g clip-path="url(#u)">
+ <path d="m 69.953125 25.339844 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -11.75 11.75 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 11.75 -11.75 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1c71d8"/>
+ </g>
+ </g>
+ <g clip-path="url(#v)">
+ <g clip-path="url(#w)">
+ <path d="m 67.015625 28.277344 l 11.75 11.75 l -2.9375 2.9375 l -11.75 -11.75 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#x)">
+ <g clip-path="url(#y)">
+ <path d="m 61.140625 34.152344 l 5.875 5.875 l -2.9375 2.9375 l -5.875 -5.875 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="d">
+ <path d="m 18 41 h 57 v 57 h -57 z m 0 0"/>
+ </clipPath>
+ <clipPath id="e">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="f">
+ <path d="m 36 59 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="g">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="h">
+ <path d="m 48 47 h 56 v 56 h -56 z m 0 0"/>
+ </clipPath>
+ <clipPath id="i">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="j">
+ <path d="m 17 48 h 68 v 69 h -68 z m 0 0"/>
+ </clipPath>
+ <clipPath id="k">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="l">
+ <path d="m 68 27 h 55 v 56 h -55 z m 0 0"/>
+ </clipPath>
+ <clipPath id="m">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="n">
+ <path d="m 48 28 h 34 v 34 h -34 z m 0 0"/>
+ </clipPath>
+ <clipPath id="o">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="p">
+ <path d="m 45 44 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="q">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="r">
+ <path d="m 65 24 h 21 v 21 h -21 z m 0 0"/>
+ </clipPath>
+ <clipPath id="s">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="t">
+ <path d="m 51 24 h 35 v 35 h -35 z m 0 0"/>
+ </clipPath>
+ <clipPath id="u">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="v">
+ <path d="m 64 28 h 15 v 15 h -15 z m 0 0"/>
+ </clipPath>
+ <clipPath id="w">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <clipPath id="x">
+ <path d="m 58 34 h 10 v 9 h -10 z m 0 0"/>
+ </clipPath>
+ <clipPath id="y">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#d)">
+ <g clip-path="url(#e)">
+ <path d="m 200.630501 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.157014 -4.157014 c 0 -2.292573 1.861679 -4.154253 4.154252 -4.154253 c 2.295335 0.002763 4.154252 1.86168 4.157015 4.157015 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#f)">
+ <g clip-path="url(#g)">
+ <path d="m 225.556015 130.781609 c 0 2.292573 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.861679 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154252 c 2.292573 0 4.151491 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#h)">
+ <g clip-path="url(#i)">
+ <path d="m 225.556015 114.1646 c 0 2.292572 -1.86168 4.154252 -4.154253 4.154252 c -2.295335 -0.002762 -4.154252 -1.86168 -4.154252 -4.154252 c -0.002762 -2.295335 1.858917 -4.157015 4.154252 -4.154253 c 2.292573 0 4.151491 1.858918 4.154253 4.154253 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 0.707107 -0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#j)">
+ <g clip-path="url(#k)">
+ <path d="m 43.515625 234.34375 l -2.9375 2.9375 v 5.875 l 11.75 11.75 h 5.875 l 2.9375 -2.9375" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(1 0 0 1 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#l)">
+ <g clip-path="url(#m)">
+ <path d="m -80.919532 221.401762 c 0 2.292573 -1.858918 4.151491 -4.154253 4.154253 c -2.292572 0 -4.154252 -1.86168 -4.154252 -4.154253 c 0.002762 -2.295335 1.86168 -4.154252 4.154252 -4.154252 c 2.295335 -0.002762 4.157015 1.858917 4.154253 4.154252 z m 0 0" fill="none" stroke="#99c1f1" stroke-width="4.15432" transform="matrix(0.707107 -0.707107 0.707107 0.707107 0 -162)"/>
+ </g>
+ </g>
+ <g clip-path="url(#n)">
+ <g clip-path="url(#o)">
+ <path d="m 65.546875 29.746094 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -10.28125 10.28125 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 10.28125 -10.28125 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1a5fb4"/>
+ </g>
+ </g>
+ <g clip-path="url(#p)">
+ <g clip-path="url(#q)">
+ <path d="m 50.859375 44.433594 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 5.875 5.875 l -4.40625 4.40625 c -0.8125 0.816406 -0.8125 2.125 0 2.9375 c 0.8125 0.816406 2.125 0.816406 2.9375 0 l 4.40625 -4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#r)">
+ <g clip-path="url(#s)">
+ <path d="m 65.546875 29.746094 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 5.875 5.875 l 4.40625 -4.40625 c 0.8125 -0.8125 2.125 -0.8125 2.9375 0 c 0.8125 0.816406 0.8125 2.125 0 2.9375 l -4.40625 4.40625 z m 0 0" fill="#99c1f1"/>
+ </g>
+ </g>
+ <g clip-path="url(#t)">
+ <g clip-path="url(#u)">
+ <path d="m 69.953125 25.339844 l 14.6875 14.6875 c 1.621094 1.625 1.621094 4.253906 0 5.875 l -11.75 11.75 c -1.621094 1.625 -4.253906 1.625 -5.875 0 l -14.6875 -14.6875 c -1.621094 -1.621094 -1.621094 -4.25 0 -5.875 l 11.75 -11.75 c 1.621094 -1.621094 4.253906 -1.621094 5.875 0 z m 0 0" fill="#1c71d8"/>
+ </g>
+ </g>
+ <g clip-path="url(#v)">
+ <g clip-path="url(#w)">
+ <path d="m 67.015625 28.277344 l 11.75 11.75 l -2.9375 2.9375 l -11.75 -11.75 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g clip-path="url(#x)">
+ <g clip-path="url(#y)">
+ <path d="m 61.140625 34.152344 l 5.875 5.875 l -2.9375 2.9375 l -5.875 -5.875 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1">
+ <path d="m 48 82 h 32 v 8 h -32 z m 0 0"/>
+ <path d="m 52 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 68 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 84 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 36 66 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 44 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 60 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 76 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 28 50 h 8 v 8 h -8 z m 0 0"/>
+ <path d="m 92 50 h 8 v 8 h -8 z m 0 0"/>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1" fill-rule="evenodd">
+ <path d="m 46 34 v 56 h 8 v -56 z m 0 0"/>
+ <path d="m 50 34 c -2.210938 0 -4 1.789062 -4 4 v 24 c 0 2.210938 1.789062 4 4 4 h 13.53125 l 2.890625 5.789062 c 0.679687 1.355469 2.0625 2.210938 3.578125 2.210938 h 20 c 2.210938 0 4 -1.789062 4 -4 v -24 c 0 -2.210938 -1.789062 -4 -4 -4 h -13.523438 l -2.898437 -5.789062 c -0.679687 -1.355469 -2.0625 -2.210938 -3.578125 -2.210938 z m 0 0"/>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <g fill="#99c1f1">
+ <path d="m 56 50 h 16 v 32 h -16 z m 0 0"/>
+ <path d="m 64 35.371094 l 22.628906 22.628906 h -45.257812 z m 0 0"/>
+ </g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8.157114" x2="122.745697" y1="77.241079" y2="77.241079">
+ <stop offset="0" stop-color="#99c1f1"/>
+ <stop offset="0.0575141" stop-color="#1a5fb4"/>
+ <stop offset="0.388232" stop-color="#1a5fb4"/>
+ <stop offset="0.473021" stop-color="#2b7be0"/>
+ <stop offset="0.618795" stop-color="#154d91"/>
+ <stop offset="0.953538" stop-color="#1a5fb4"/>
+ <stop offset="1" stop-color="#2f7fe1"/>
+ </linearGradient>
+ <clipPath id="b">
+ <path d="m 6 1 h 117 v 118 h -117 z m 0 0"/>
+ </clipPath>
+ <clipPath id="c">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0"/>
+ </clipPath>
+ <path d="m 70.40625 119.546875 l 50.207031 -50.207031 c 1.660157 -1.660156 2.574219 -3.839844 2.453125 -6.003906 l -0.140625 -3.058594 l -52.519531 -52.953125 c -3.257812 -3.289063 -8.394531 -3.121094 -11.8125 0 l -52.550781 52.996093 l -0.042969 3.144532 c -0.027344 2.125 0.761719 4.246094 2.390625 5.875 l 50.203125 50.207031 c 3.273438 3.269531 8.542969 3.269531 11.8125 0 z m 0 0" fill="url(#a)"/>
+ <g clip-path="url(#b)">
+ <g clip-path="url(#c)">
+ <path d="m 70.335938 115.847656 l 50.097656 -50.097656 c 3.253906 -3.253906 3.253906 -8.53125 0 -11.785156 l -50.097656 -50.101563 c -3.253907 -3.253906 -8.535157 -3.253906 -11.789063 0 l -50.097656 50.101563 c -3.253907 3.253906 -3.253907 8.53125 0 11.785156 l 50.097656 50.097656 c 3.253906 3.257813 8.535156 3.257813 11.789063 0 z m 0 0" fill="#62a0ea"/>
+ </g>
+ </g>
+ <path d="m 64.90625 30.5625 c -0.9375 0 -1.875 0.046875 -2.789062 0.132812 l -1.726563 8.898438 c -1.421875 0.3125 -2.816406 0.746094 -4.117187 1.328125 l -6.507813 -6.242187 c -1.652344 0.976562 -3.089844 2.183593 -4.515625 3.453124 l 3.851562 8.101563 c -0.945312 1.058594 -1.804687 2.21875 -2.523437 3.453125 l -8.898437 -1.195312 c -0.753907 1.738281 -1.3125 3.554687 -1.726563 5.445312 l 7.835937 4.25 c -0.074218 0.714844 -0.132812 1.390625 -0.132812 2.125 s 0.0625 1.410156 0.132812 2.125 l -7.835937 4.25 c 0.414063 1.890625 0.972656 3.707031 1.726563 5.445312 l 8.898437 -1.195312 c 0.71875 1.230469 1.578125 2.394531 2.523437 3.453125 l -3.851562 8.101563 c 1.425781 1.269531 2.863281 2.476562 4.515625 3.453124 l 6.507813 -6.242187 c 1.300781 0.582031 2.695312 1.015625 4.117187 1.328125 l 1.726563 8.898438 c 0.914062 0.085937 1.851562 0.132812 2.789062 0.132812 s 1.875 -0.046875 2.789062 -0.132812 l 1.726563 -8.898438 c 1.421875 -0.3125 2.816406 -0.746094 4.117187 -1.328125 l 6.507813 6.242187 c 1.652344 -0.976562 3.089844 -2.183593 4.515625 -3.453124 l -3.851562 -8.101563 c 0.945312 -1.058594 1.804687 -2.222656 2.523437 -3.453125 l 8.898437 1.195312 c 0.753907 -1.738281 1.3125 -3.554687 1.726563 -5.445312 l -7.835937 -4.25 c 0.074218 -0.714844 0.132812 -1.390625 0.132812 -2.125 s -0.058594 -1.410156 -0.132812 -2.125 l 7.835937 -4.25 c -0.414063 -1.890625 -0.972656 -3.707031 -1.726563 -5.445312 l -8.898437 1.195312 c -0.71875 -1.234375 -1.578125 -2.394531 -2.523437 -3.453125 l 3.851562 -8.101563 c -1.425781 -1.269531 -2.863281 -2.476562 -4.515625 -3.453124 l -6.507813 6.242187 c -1.300781 -0.582031 -2.695312 -1.015625 -4.117187 -1.328125 l -1.726563 -8.898438 c -0.914062 -0.085937 -1.851562 -0.132812 -2.789062 -0.132812 z m 0 17 c 7.042969 0 12.75 5.707031 12.75 12.75 s -5.707031 12.75 -12.75 12.75 s -12.75 -5.707031 -12.75 -12.75 s 5.707031 -12.75 12.75 -12.75 z m 0 0" fill="#99c1f1"/>
+</svg>
diff --git a/data/icons/test-symbolic.svg b/data/icons/test-symbolic.svg
new file mode 100644
index 0000000..063260d
--- /dev/null
+++ b/data/icons/test-symbolic.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
+ <g fill="#222222">
+ <path d="m 8 0 c -4.40625 0 -8 3.59375 -8 8 s 3.59375 8 8 8 s 8 -3.59375 8 -8 s -3.59375 -8 -8 -8 z m 0 1.941406 c 3.359375 0 6.058594 2.699219 6.058594 6.058594 s -2.699219 6.058594 -6.058594 6.058594 s -6.058594 -2.699219 -6.058594 -6.058594 s 2.699219 -6.058594 6.058594 -6.058594 z m 0 0"/>
+ <path d="m 13 8 c 0 2.761719 -2.238281 5 -5 5 v -5 z m 0 0"/>
+ <path d="m 3 8 c 0 -2.761719 2.238281 -5 5 -5 v 5 z m 0 0"/>
+ </g>
+</svg>
diff --git a/data/icons/violence-none-symbolic.svg b/data/icons/violence-none-symbolic.svg
new file mode 100644
index 0000000..c25c981
--- /dev/null
+++ b/data/icons/violence-none-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path style="fill:#2e3436" d="m1.531.469-1.06 1.06 6.154 6.155L10 11.062a25.453 25.453 0 0 0 .002-.001l4.469 4.468 1.06-1.06-4.363-4.364a25.453 25.453 0 0 0 1.395-1.293L9.027 5.277 7.686 6.623 1.53.469zm12.754.125a1.504 1.504 0 0 0-1.015.441L9.734 4.57l1.414 1.414 2.536-2.535a1.501 1.501 0 1 0 .601-2.855zM5.562 8.746l-5.019 5.02c.559.554 3.766 1.096 8.219-1.82l-3.2-3.2z"/></svg> \ No newline at end of file
diff --git a/data/icons/violence-symbolic.svg b/data/icons/violence-symbolic.svg
new file mode 100644
index 0000000..2a6d392
--- /dev/null
+++ b/data/icons/violence-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M14.285.594a1.504 1.504 0 0 0-1.015.441L9.734 4.57l1.414 1.414 2.536-2.535a1.501 1.501 0 1 0 .601-2.855zM9.027 5.277.543 13.766c.707.703 5.656 1.41 12.02-4.954zm0 0" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/data/icons/webpage-symbolic.svg b/data/icons/webpage-symbolic.svg
new file mode 100644
index 0000000..8415de5
--- /dev/null
+++ b/data/icons/webpage-symbolic.svg
@@ -0,0 +1 @@
+<svg height="16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 0C3.37 0 0 3.37 0 7.5S3.37 15 7.5 15 15 11.63 15 7.5 11.63 0 7.5 0zm0 2c.183 0 .382.084.617.322.235.239.48.626.69 1.127.373.897.632 2.151.683 3.551H5.51c.05-1.4.31-2.654.683-3.55.21-.502.455-.889.69-1.128C7.118 2.084 7.317 2 7.5 2zm-1.857.318a5.85 5.85 0 0 0-.372.746c-.439 1.054-.71 2.422-.76 3.936H2.024a5.481 5.481 0 0 1 3.62-4.682zm3.714 0A5.481 5.481 0 0 1 12.977 7h-2.489c-.05-1.514-.32-2.882-.76-3.936a5.85 5.85 0 0 0-.37-.746zM2.023 8h2.489c.05 1.514.32 2.882.76 3.936.112.27.235.519.37.746A5.481 5.481 0 0 1 2.024 8zM5.51 8h3.98c-.05 1.4-.31 2.654-.683 3.55-.21.502-.455.889-.69 1.128-.235.238-.434.322-.617.322s-.382-.084-.617-.322c-.235-.239-.48-.626-.69-1.127C5.82 10.654 5.561 9.4 5.51 8zm4.978 0h2.489a5.481 5.481 0 0 1-3.62 4.682 5.85 5.85 0 0 0 .372-.746c.439-1.054.71-2.422.76-3.936z" style="fill:#3d3846"/></svg> \ No newline at end of file
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000..7d0aa6d
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,42 @@
+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('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
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..a43e442
--- /dev/null
+++ b/data/metainfo/org.gnome.Software.metainfo.xml.in
@@ -0,0 +1,2158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop-application">
+ <id>org.gnome.Software.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Software</name>
+ <summary>Install and update apps</summary>
+ <description>
+ <p>
+ Software allows you to find and install new applications and system
+ extensions and remove existing installed applications.
+ </p>
+ <p>
+ 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.
+ </p>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-overview.png</image>
+ <caption>Overview panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details.png</image>
+ <caption>Details panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-details2.png</image>
+ <caption>Details panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-installed.png</image>
+ <caption>Installed panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-up-to-date.png</image>
+ <caption>Updates panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates.png</image>
+ <caption>Updates panel</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://gitlab.gnome.org/GNOME/gnome-software/raw/HEAD/data/metainfo/ss-updates-details.png</image>
+ <caption>The update details</caption>
+ </screenshot>
+ </screenshots>
+
+ <recommends>
+ <!-- Works on desktops or touchscreen devices -->
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ </recommends>
+
+ <requires>
+ <!-- Adaptive -->
+ <display_length compare="ge">360</display_length>
+ </requires>
+
+ <!--
+ Validate with `appstreamcli validate *.metainfo.xml`
+ -->
+ <releases>
+ <release date="2023-03-03" version="43.5" type="stable">
+ <description>
+ <p>This is a stable release with the following change:</p>
+ <ul>
+ <li>Fix few memory leaks</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2023-02-10" version="43.4" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Stop cancelled search in appstream data early</li>
+ <li>Lookup for appstream-provided icons in more directories</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2023-01-06" version="43.3" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Periodically expire cached app icons</li>
+ <li>Stop notifying about unprepared critical updates</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Georgian (Ekaterine Papava)</li>
+ <li>Hebrew (Yosef Or Boczko)</li>
+ <li>Interlingue (Olga Smirnova)</li>
+ <li>Occitan (post 1500) (Quentin PAGÈS)</li>
+ <li>Persian (Danial Behzadi)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-12-02" version="43.2" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix show of updatable app in the details page</li>
+ <li>Fix search for apps providing some feature under rpm-ostree</li>
+ <li>Fix sending of ODRS data when using libsoup3</li>
+ <li>Fix occasional crash when installing apps</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Belarusian (Vasil Pupkin)</li>
+ <li>Czech (Daniel Rusek)</li>
+ <li>Georgian (Zurab Kargareteli)</li>
+ <li>Greek (Kosmas Martakidis)</li>
+ <li>Hebrew (Yosef Or Boczko)</li>
+ <li>Hungarian (Balázs Meskó)</li>
+ <li>Russian (Aleksandr Melman)</li>
+ <li>Turkish (Sabri Ünal)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-10-21" version="43.1" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix searches not completing if installing or uninstalling an app at the same time</li>
+ <li>Notify of errors when running a flatpak app whose runtime is missing</li>
+ <li>Fix installing local RPM packages</li>
+ <li>Fix distribution upgrades when package conflicts are present</li>
+ <li>Fix opening web apps from their details page</li>
+ <li>Improve appearance of app ratings if ratings data cannot be downloaded</li>
+ <li>Fix crash when showing offline update errors on startup</li>
+ <li>Highlight priority of firmware updates, making security fixes more obvious</li>
+ <li>Fix installation of pending apps in some situations</li>
+ <li>Fix downloading of rpm-ostree app updates from the Updates page</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian (Nart Tlisha)</li>
+ <li>Catalan (Jordi Mas)</li>
+ <li>Chinese (Taiwan) (Cheng-Chia Tseng)</li>
+ <li>Croatian (Goran Vidović)</li>
+ <li>French (Claude Paroz)</li>
+ <li>Friulian (Fabio Tomat)</li>
+ <li>Georgian (Zurab Kargareteli)</li>
+ <li>German (Philipp Kiemle, Jürgen Benvenuti)</li>
+ <li>Icelandic (Sveinn í Felli)</li>
+ <li>Italian (Gianvito Cavasoli)</li>
+ <li>Kazakh (Baurzhan Muftakhidinov)</li>
+ <li>Panjabi (A S Alam)</li>
+ <li>Slovenian (Matej Urbančič)</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-09-16" version="43.0" type="stable">
+ <description>
+ <p>This is a stable release with translation updates:</p>
+ <ul>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>English (United Kingdom)</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Icelandic</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-09-02" version="43~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 43.</p>
+ <ul>
+ <li>Supports video as a screenshot</li>
+ <li>Improvements of source picker in the details page</li>
+ <li>Fixes a bug when viewing details of a package file</li>
+ <li>Fixes a bug when reading certain .flatpakref file</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian</li>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>Finnish</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-08-05" version="43~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 43.</p>
+ <ul>
+ <li>Various fixes related to changed threading model</li>
+ <li>Various UI parts updated</li>
+ <li>Sources dropdown had been reworked</li>
+ <li>Fixes a rare crash when showing app details</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Abkhazian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Dutch</li>
+ <li>Georgian</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Italian</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-06-30" version="43~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 43.</p>
+ <ul>
+ <li>Various improvements to notifications</li>
+ <li>Fix several crashes when handling flatpak apps</li>
+ <li>Add ‘Other Apps by Author’ section in the app details page</li>
+ <li>Improve styling of app context lozenges</li>
+ <li>Add ‘Available for Distro’ section to the overview page (if configured by your distribution)</li>
+ <li>Show more details about file system permissions requested by flatpak apps</li>
+ <li>Show more types of URI from app metainfo</li>
+ <li>Fix a few issues when using a dark mode theme</li>
+ <li>Fix some issues with arrows in right-to-left locales</li>
+ <li>Fix language pack installation for certain locales</li>
+ <li>Improve debug output to make user bug reports more useful</li>
+ <li>Add `--uninstall=ID` command line option</li>
+ <li>Allow scrolling screenshots by clicking on next and previous screenshots</li>
+ <li>Add support for webapps</li>
+ <li>Allow swiping back in the shell using touch gestures</li>
+ <li>Improved caching of downloaded metadata</li>
+ <li>Many internal architectural changes to make the code more maintainable</li>
+ <li>
+ The <code>popular-overrides</code> 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
+ </li>
+ <li>
+ The <code>hardcoded_popular</code> Meson option has been renamed to
+ <code>hardcoded_curated</code>.
+ </li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>Georgian</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-03-18" version="42.0" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Various fixes related to changed threading model</li>
+ <li>Added several appstream-related fixes</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Danish</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Hungarian</li>
+ <li>Japanese</li>
+ <li>Kazakh</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-03-04" version="42~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 42.</p>
+ <ul>
+ <li>Cancel ongoing update downloads when system power is low</li>
+ <li>Numerous small user interface fixes and tweaks</li>
+ <li>Prioritize full matches in search results</li>
+ <li>Improvements in dark mode</li>
+ <li>Fix disabling flatpak remotes from the ‘Software Repositories’ dialog</li>
+ <li>Threading and performance improvements which should reduce the number of user interface freezes</li>
+ <li>Update some icons</li>
+ <li>Check for updates when moving from a metered to a non-metered network connection</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-02-10" version="42~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 42.</p>
+ <ul>
+ <li>Allow <code>--verbose</code> to be enabled at runtime</li>
+ <li>Condense the rows in the age rating context dialog</li>
+ <li>Update the UI for ratings and reviews of apps</li>
+ <li>Improve the appearance of the category page loading screen</li>
+ <li>Drop the first run dialog</li>
+ <li>Improvements to dark theming</li>
+ <li>Support viewing a specific metainfo file using <code>--show-metainfo</code></li>
+ <li>Several more threading improvements</li>
+ <li>Icon updates</li>
+ <li>Drop the hardcoded-popular plugin in favour of an appstream file</li>
+ <li>The background image for upgrades is now looked for using several
+ well-known (and distribution-specific) names in
+ <code>${DATADIR}/gnome-software/backgrounds</code>,
+ and the previous Fedora-specific default background image is
+ no longer distributed. Similarly, the <code>upgrade-background-uri</code>
+ GSettings key has been removed. Distributions may need to
+ update how they ship background images.
+ See <em>doc/vendor-customisation.md</em>.</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Chinese (China)</li>
+ <li>Galician</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Japanese</li>
+ <li>Occitan (post 1500)</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2022-01-07" version="42~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 42.</p>
+ <ul>
+ <li>Various UI parts updated</li>
+ <li>Support more markup in the application description</li>
+ <li>Ask about package signature with PackageKit on signing issue</li>
+ <li>Show better System Update progress</li>
+ <li>Remove various cultural sensitivity badges</li>
+ <li>Fix a crash when processing age ratings</li>
+ <li>Reload application details only when not installing/removing the application</li>
+ <li>Do not follow symlinks when calculating disk size usage</li>
+ <li>Fix addons section, which could show addons for different application</li>
+ <li>Fix showing a ‘transaction in progress’ error when using the rpm-ostree plugin</li>
+ <li>Don’t recommend a reboot if firmware updates fail</li>
+ <li>Fix flathub repo being considered present on Fedora 35 with filtered flathub</li>
+ <li>Allow searching for extensions</li>
+ <li>Fix translation of main button on updates page</li>
+ <li>Fix codec installation process</li>
+ <li>Add new GNOME Circle apps to the featured carousel</li>
+ <li>Improve metadata support for snaps</li>
+ <li>Fix update checks being missed across suspend/hibernation</li>
+ <li>Ensure application lists are updated when repositories are enabled/installed or disabled/removed</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Belarusian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hebrew</li>
+ <li>Icelandic</li>
+ <li>Indonesian</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Slovak</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-09-17" version="41.0" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Instead of showing all package-based apps as "potentially unsafe", only use that language for 3rd party ones</li>
+ <li>Fix a bug where the "Show more" button on an app details page would flicker when the window is resized</li>
+ <li>Fix a bug where Software sometimes shows an Uninstall button after uninstalling something</li>
+ <li>Add GNOME Circle apps to the featured carousel</li>
+ <li>Fix a bug where Software would sometimes fail to execute an install/remove operation for PackageKit software rather than showing a PolicyKit password prompt</li>
+ <li>Fix a bug where Software would fail to upgrade the distribution via PackageKit</li>
+ <li>Fix the hiding of rows on the Updates tab after they have been updated</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Danish</li>
+ <li>Dutch</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Russian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-09-07" version="41~rc" type="development">
+ <description>
+ <p>This is the third unstable release for GNOME 41.</p>
+ <ul>
+ <li>Tweaks to the context tiles and dialogs</li>
+ <li>Fixes to the details page for non-desktop apps</li>
+ <li>Re-add support for the add-ons categories</li>
+ <li>Sort new and updated apps by release date on the category page</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Croatian</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>Galician</li>
+ <li>Indonesian</li>
+ <li>Kazakh</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-08-13" version="41~beta" type="development">
+ <description>
+ <p>This is the second unstable release for GNOME 41.</p>
+ <ul>
+ <li>Many parts of the user interface reworked</li>
+ <li>Fix when the 'Launch' button is shown after an application install</li>
+ <li>Fix appstream:// URL handling</li>
+ <li>Fix application freeze on Flatpak application install/remove/update</li>
+ <li>Disable automatic update downloads when in power saver mode</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Belarusian</li>
+ <li>Bulgarian</li>
+ <li>Catalan</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Slovenian</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-07-20" version="41~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 41.</p>
+ <ul>
+ <li>Many parts of the user interface reworked</li>
+ <li>Improve error reporting from flatpak when low on disk space</li>
+ <li>Fix issues with updating the UI when uninstalling apps with add-ons</li>
+ <li>Don’t keep rpm-ostreed alive forever</li>
+ <li>Prevent polkit checks showing up for background operations</li>
+ <li>Disallow submitting reviews for an app you haven’t installed</li>
+ <li>Show download size in the Updates page</li>
+ <li>Notify when restart is needed when uninstalling an app</li>
+ <li>Fix some issues with searches not running</li>
+ <li>Allow non-integer average star ratings for apps</li>
+ <li>Reduce number of categories in the UI</li>
+ <li>Improve ‘pending updates’ notifications</li>
+ <li>Refine presentation of download and installed size on details page</li>
+ <li>Remove left over gnome-online-account dependencies</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Belarusian</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Catalan</li>
+ <li>Chinese (China)</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>Friulian</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Hebrew</li>
+ <li>Italian</li>
+ <li>Lithuanian</li>
+ <li>Nepali</li>
+ <li>Occitan (post 1500)</li>
+ <li>Persian</li>
+ <li>Polish</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Russian</li>
+ <li>Serbian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-03-19" version="40" type="stable">
+ <description>
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix handling of invalid or incomplete application icons</li>
+ <li>Fix the plugin documentation to reflect reality</li>
+ <li>Fix the Snap plugin to actually load icons</li>
+ <li>Set download size to 0 after the package is downloaded</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>British English</li>
+ <li>Danish</li>
+ <li>Greek</li>
+ <li>Italian</li>
+ <li>Norwegian Bokmål</li>
+ <li>Polish</li>
+ <li>Punjabi</li>
+ <li>Serbian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-03-12" version="40~rc" type="development">
+ <description>
+ <p>This is an unstable release with the following changes:</p>
+ <ul>
+ <li>Implement new featured apps carousel.</li>
+ <li>List of Flatpak repositories is updated when changed using the Flatpak command line tool.</li>
+ <li>The loading page now shows the full color icon instead of the symbolic one.</li>
+ <li>Show release date in version history for releases that use the 'date' attribute.</li>
+ <li>Improved icon handling, including with hiDPI screens.</li>
+ <li>Fixed a bug in remembering when update notifications were shown.</li>
+ <li>Build as a dynamic rather than a static library, and rearrange installation paths.</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Catalan</li>
+ <li>Croatian</li>
+ <li>Czech</li>
+ <li>Dutch</li>
+ <li>English (United Kingdom)</li>
+ <li>Finnish</li>
+ <li>French</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Hungarian</li>
+ <li>Indonesian</li>
+ <li>Kazakh</li>
+ <li>Korean</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Serbian</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-02-16" version="40~beta" type="development">
+ <description>
+ <p>This is an unstable release with the following changes:</p>
+ <ul>
+ <li>GNOME Software now uses libappstream instead of libappstream-glib to work with appstream data which provides information about apps and other components.</li>
+ <li>App details pages show version history information when it's available.</li>
+ <li>The loading page now shows the full color icon instead of the symbolic one.</li>
+ <li>UI elements for displaying app add-ons have been tweaked to more closely match the designs.</li>
+ <li>Installed icons and the badge showing the number of updates available were changed back to blue from green.</li>
+ <li>The dropdown showing the available sources of an application includes the packaging format (e.g. Flatpak vs RPM).</li>
+ <li>A bug was fixed that prevented installation of .flatpakref files</li>
+ </ul>
+ <p>Translation updates:</p>
+ <ul>
+ <li>Catalan</li>
+ <li>Czech</li>
+ <li>Galician</li>
+ <li>Indonesian</li>
+ <li>Panjabi</li>
+ <li>Portuguese</li>
+ <li>Slovenian</li>
+ <li>Spanish</li>
+ <li>Swedish</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2021-01-27" version="40~alpha" type="development">
+ <description>
+ <p>This is the first unstable release for GNOME 40.</p>
+ <ul>
+ <li>Small updates to how app descriptions and addons are presented on the details page</li>
+ <li>Fix handling of pending app installations when going online</li>
+ <li>Better support for dark themes (particularly Adwaita-Dark)</li>
+ <li>Improvements to how app screenshots are loaded and presented</li>
+ <li>Hide ‘Launch’ button if an application (for example, Wine) cannot be launched</li>
+ <li>Make the UI clearer when loading information from flatpakref files</li>
+ <li>Don’t update app metadata on start when download-updates is disabled</li>
+ <li>Fix opening the updates list when clicking on an updates notification</li>
+ <li>Fix state updates when installing flatpak apps or repos which are already installed</li>
+ <li>Add Ctrl+Q as a keyboard shortcut for closing the window</li>
+ <li>Rework timing and content of software update notifications</li>
+ <li>Prevent uninstalled local apps from appearing in the installed apps list</li>
+ <li>Support installation/uninstallation of addons for flatpak apps</li>
+ <li>Improve presentation of age ratings for apps</li>
+ <li>Fix a crash in the updates page</li>
+ <li>Fix presentation of app permissions for fully sandboxed flatpak apps</li>
+ <li>Fix deadlock on rpm-ostree systems</li>
+ <li>Fix presentation of version number changes in right-to-left locales</li>
+ <li>Error handling improvements for fwupd</li>
+ <li>Performance improvements for ODRS on startup</li>
+ <li>Improve presentation of firmware warning messages</li>
+ <li>XML parsing performance improvements</li>
+ <li>Automatically remove end-of-life flatpak runtimes</li>
+ <li>Support updating flatpaks to their new name when they are renamed</li>
+ <li>Update the GNOME Software icon</li>
+ <li>Support more search results in the snap store</li>
+ <li>Drop libgnome-desktop-3 dependency in favour of gsettings-desktop-schemas</li>
+ </ul>
+ <p>This release also updates translations:</p>
+ <ul>
+ <li>Basque</li>
+ <li>Bokmål, Norwegian</li>
+ <li>Catalan</li>
+ <li>Chinese (Taiwan)</li>
+ <li>Czech</li>
+ <li>Friulian</li>
+ <li>Galician</li>
+ <li>German</li>
+ <li>Greek, Modern (1453-)</li>
+ <li>Hebrew</li>
+ <li>Indonesian</li>
+ <li>Italian</li>
+ <li>Kabyle</li>
+ <li>Kazakh</li>
+ <li>Latvian</li>
+ <li>Lithuanian</li>
+ <li>Persian</li>
+ <li>Portuguese</li>
+ <li>Portuguese (Brazil)</li>
+ <li>Romanian</li>
+ <li>Slovak</li>
+ <li>Spanish</li>
+ <li>Turkish</li>
+ <li>Ukrainian</li>
+ <li>Vietnamese</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2020-09-01" version="3.37.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add sysprof support for profiling jobs</li>
+ <li>Add webflow and basic auth support to flatpak plugin</li>
+ <li>Coalesce refresh operations where possible</li>
+ <li>Correctly mark layered rpm-ostree local packages as removable</li>
+ <li>Fix flatpak bundle installation</li>
+ <li>Handle invalid snap auth data</li>
+ <li>Improve flatpak progress reporting for transactions</li>
+ <li>Improve the heuristic for detecting old-style AppStream override files</li>
+ <li>Many performance improvements in many areas of the code</li>
+ <li>Only delete the firmware archive if we downloaded it to the cache</li>
+ <li>Show a pulsing progress bar if progress is unknown</li>
+ <li>Support loading appstream files from custom install prefix</li>
+ <li>Use the runtime fwupd version for the user agent</li>
+ </ul>
+ <p>This release also updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2020-03-11" version="3.36.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.36.</p>
+ </description>
+ </release>
+ <release date="2020-03-04" version="3.35.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Fix crash when viewing application details</li>
+ <li>Fix “thrice daily” check running every 3 days</li>
+ <li>Improve the appearance of the front page banners</li>
+ <li>Show the correct upgrade banner contents when a reboot is requried</li>
+ </ul>
+ <p>This release also updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2020-02-19" version="3.35.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add an info bar about automatic updates</li>
+ <li>Avoid rpm-ostree downgrade error when doing distro upgrade</li>
+ <li>Click on stars to open review dialog in the details view</li>
+ <li>Fix loading of icons from AppStream YAML</li>
+ <li>Fix weird font sizes in the batter</li>
+ <li>Hide any in-app notifications when closing the main window</li>
+ <li>Integrate better with snapd</li>
+ <li>Only ignore flatpak estimated progress if >10%</li>
+ <li>Remove color stripes on categories in the Explore page</li>
+ <li>Remove support for Shell extensions</li>
+ <li>Remove webapp support</li>
+ <li>Reset star rating when loading an unrated app</li>
+ <li>Sort applications using locale based algorithms</li>
+ <li>Stop snaps from being automatically updated</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-11-25" version="3.35.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable stable release with the following changes:</p>
+ <ul>
+ <li>Add missing OARS content rating descriptions</li>
+ <li>Add new plugin for restricting access to apps</li>
+ <li>Avoid a UI crash when switching modes</li>
+ <li>Build libmalcontent dependency on Fedora CI</li>
+ <li>Correctly distinguish empty content ratings from missing ones</li>
+ <li>Correctly set the application state if autoupdate is in progress</li>
+ <li>Do not show a crazy error when installing packages</li>
+ <li>Do not show non-applications in the installed panel</li>
+ <li>Download Flatpak updates in the correct installation</li>
+ <li>Expose snap channels as app alternates</li>
+ <li>Fix a crash on 32-bit systems</li>
+ <li>Fix langpacks autoinstall on Fedora SilverBlue</li>
+ <li>Fix manual detach when updating removable device firmware</li>
+ <li>Fix third party repo enabling not working</li>
+ <li>Hide add/remove shortcut buttons for parentally filtered apps</li>
+ <li>Improve some front page banners</li>
+ <li>Invalidate caches when adding or removing remotes</li>
+ <li>Make flatpak more thread-safe to fix some crashes</li>
+ <li>Match the exact ID when refining a wildcard</li>
+ <li>Only set the app row's buttons as destructive when they remove an app</li>
+ <li>Remove hardcoded-featured plugin</li>
+ <li>Remove the app folder functionality as this is now built-in to the shell</li>
+ <li>Remove the banner editor as this is now an app on it's own</li>
+ <li>Rework age ratings handling to avoid hard-coded list</li>
+ <li>Set the shell extension origin correctly in all cases</li>
+ <li>Show the channel for snaps</li>
+ <li>Speed up the flatpak plugin in some situations</li>
+ <li>Use plugin API to launch apps from install notification.</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-09-09" version="3.34.0" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add a link to the privacy policy in the review dialog</li>
+ <li>Add and improve many overview banners</li>
+ <li>Add support for download scheduling using Mogwai</li>
+ <li>Allow installing locale data automatically</li>
+ <li>Allow snaps to be shown by AppStream ID</li>
+ <li>Don't apply drop shadow on stock symbolic icons</li>
+ <li>Don't install queued apps when the network changes and is metered</li>
+ <li>Fix the 'localised in my language' kudo</li>
+ <li>Hide addons that are not available in repos</li>
+ <li>Localize ESRB content rating strings</li>
+ <li>Never show the installation progress bar going backwards</li>
+ <li>Notify the user when an application can escape the sandbox</li>
+ <li>Refactor screenshots and hide those unavailable when offline</li>
+ <li>Select the rating systems selected based by territory</li>
+ <li>Use smaller default size for main window when required</li>
+ </ul>
+ <p>This release also adds and updates existing translations.</p>
+ </description>
+ </release>
+ <release date="2019-07-11" version="3.32.4" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix an issue that led to some packages with multiple appdata files not correctly showing up on the updates page</li>
+ <li>Fix various problems with flatpak branch handling that were causing issues with freedesktop.org runtime updates</li>
+ <li>Fix flatpak update versions to correctly show up</li>
+ <li>Various other minor bug fixes</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-05-24" version="3.32.3" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add missing XbSilo locking, hopefully fixing a large number of reported crashes</li>
+ <li>Fix a regression that caused the fonts category to go missing</li>
+ <li>Show a placeholder on the details page when we don't have the actual icon</li>
+ <li>Plug a large memory leak</li>
+ <li>Use nicer arrows for version numbers on the updates page</li>
+ <li>Fix an issue that led to screenshots not being correctly scaled on hidpi</li>
+ <li>flatpak: Fix several double-uses of GErrors</li>
+ <li>flatpak: Handle failure of a libflatpak function updating permissions</li>
+ <li>rpm-ostree: Implement what-provides decompose</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-05-07" version="3.32.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Avoid showing a review more than once</li>
+ <li>Correctly update progress bar when downloading packagekit distro upgrades</li>
+ <li>Fix a crash when closing the updates dialog before the content has loaded</li>
+ <li>Fix CTRL+F not working right in certains conditions</li>
+ <li>Set 022 umask to make sure flatpak system helper process can read the files we've written</li>
+ <li>rpm-ostree: Implement getting the repo list, and enabling and disabling repos</li>
+ <li>rpm-ostree: Implement provides search</li>
+ <li>rpm-ostree: Make layered apps not discoverable in the UI</li>
+ <li>Various other minor bug fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-04-15" version="3.32.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add drop shadows to app icons</li>
+ <li>Various fixes to initial loading screen</li>
+ <li>Show a generic icon instead of empty space if we failed to load the app icon</li>
+ <li>Update featured banners for Maps and Blender</li>
+ <li>Update featured app IDs</li>
+ <li>Fix a crash due to missing locking</li>
+ <li>Fix missing back button under certain conditions</li>
+ <li>Fix loading AppSteam data from .yml.gz files</li>
+ <li>Fix an issue that caused flatpak repo to not be correctly shown when it matched an existing packagekit repo name</li>
+ <li>Hide the fwupd Vendor repo in the repos dialog</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-03-11" version="3.32.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.32. Notable changes compared to 3.30 include:</p>
+ <ul>
+ <li>Appstream parsing is completely rewritten and now uses the new libxmlb library, instead of appstream-glib</li>
+ <li>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</li>
+ <li>New source selection drop down on the details pages</li>
+ <li>Flatpak apps now list the permissions they need on the details pages, and also show new permissions when updating</li>
+ <li>The flatpak backend received a large number of bug fixes</li>
+ <li>The rpm-ostree backend has grown many new features and bug fixes, including support for installing layered packages and doing distro upgrades</li>
+ <li>Numerous fixes for error reporting, including making error messages more useful and avoiding showing network errors from background operations</li>
+ <li>The items in the app menu were all moved to the window menu</li>
+ <li>New redesigned icon</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2019-03-05" version="3.31.92" type="development">
+ <description translatable="no">
+ <p>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!</p>
+ <ul>
+ <li>Add two missing description strings for flatpak permissions</li>
+ <li>Only show permissions for flatpak apps and not for e.g. fonts</li>
+ <li>Fix flatpak permissions to correctly show up for available apps</li>
+ <li>Hide various details page items that don't make sense when showing .flatpakrepo files</li>
+ <li>Fix an issue that caused descriptions to sometimes not get correctly loaded</li>
+ <li>Sort the items in the Source drop down</li>
+ <li>Don't show error notifications for background download and refresh errors</li>
+ <li>Fix an issue that could cause an explosion of "A restart is required" notifications</li>
+ <li>Various flatpak plugin fixes to make it correctly match the data when multiple flatpak repos are available</li>
+ <li>Fix the rpm-ostree plugin to correctly convert remote dbus errors</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-02-24" version="3.31.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix showing the installed check mark on tiles</li>
+ <li>Fix crashes in the packagekit plugin due to missing locking</li>
+ <li>Add back support for appstream data in /var/{cache,lib}/app-info directories that accidentally got left out with the libxmlb rewrite</li>
+ <li>Update the featured banner for gnome-chess</li>
+ <li>Fix the details page alignment when only one screenshot is shown</li>
+ <li>Move the Update button to the right hand side on the details page</li>
+ <li>Fix enabling repos when installing codecs through the extras page</li>
+ <li>Remove the Sundry folder and sync the apps in the Utilities folder with gnome-menus 3.31.90</li>
+ <li>Improve various content rating texts</li>
+ <li>Drop workarounds for locales with codesets</li>
+ <li>Use the currently selected icon theme for stock icons</li>
+ <li>Don't hide compulsory apps in the category views</li>
+ <li>Use the SPDX-License-Identifier in all source files</li>
+ <li>Remove various useless error prefixes, making flatpak and packagekit error messages shorter and easier to read</li>
+ <li>flatpak: Show the installation type (user, system) in the Source dropdown</li>
+ <li>flatpak: Let apps control the name suffix/prefix they have and don't force (Nightly) suffix for everything on the master branch</li>
+ <li>flatpak: Various fixes for matching flatpaks to appstream entries</li>
+ <li>flatpak: Distinguish between the same app coming from multiple remotes</li>
+ <li>rpm-ostree: Correctly resolve installed appdata files to package names</li>
+ <li>rpm-ostree: Hook up percentage progress for install and remove</li>
+ <li>rpm-ostree: Implement layered package install</li>
+ <li>rpm-ostree: Implement locally downloaded rpm install</li>
+ <li>rpm-ostree: Show the source of the packages when installing layered packages</li>
+ <li>rpm-ostree: Various fixes making things more robust</li>
+ <li>snap: Use new media API</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2019-01-16" version="3.31.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Show permissions for installed flatpaks, and new permissions for updates</li>
+ <li>Use libxmlb to parse AppStream XML, making gnome-software start up faster and use less memory</li>
+ <li>Update the app icon</li>
+ <li>Update categories for ESRA rating system</li>
+ <li>Improve various error messages to have more details</li>
+ <li>Fix an issue that caused incorrect version numbers to be shown for installed flatpaks</li>
+ <li>Fix various thread safety related crashes</li>
+ <li>Fix row unrevealing to not leave behind 2 pixels on the updates page</li>
+ <li>Make the refresh button to actually refresh packagekit cache</li>
+ <li>Fix various issues that could lead to cache refresh getting stuck</li>
+ <li>Show updates available notifications even when automatic updates are disabled</li>
+ <li>Fix counting apps in the updates applied notification</li>
+ <li>Improve packagekit update loading code, hopefully making it more robust</li>
+ <li>Fix an issue that could lead to the packagekit plugin activating on rpm-ostree based systems</li>
+ <li>Switch flatpak updates to use a single transaction, which lets us share more code (and bugs) with the command line flatpak utility</li>
+ <li>Fix various issues with transitioning from the "Download" state to "Restart &amp; Update"</li>
+ <li>Don't error out from update downloads if the ODRS server is unavailable</li>
+ <li>Fix old updates accumulating in the OS Updates item</li>
+ <li>Various flatpakref installation fixes</li>
+ <li>Fix opening the details page when clicking on "Show Details" in GNOME Shell</li>
+ <li>Fix opening shell extensions details from GNOME Tweaks</li>
+ <li>Various fixes for initial loading state</li>
+ <li>Add a separate "Download" step for packagekit offline updates, so that "Restart &amp; Update" is instant</li>
+ <li>Fix a version comparison issue that led to package updates sometimes showing as downgrades in the OS Updates section (this needs latest appstream-glib)</li>
+ <li>Show the refresh button when the updates page is in the failed state</li>
+ <li>Notify about offline updates only after they are fully downloaded</li>
+ <li>Fix a memory corruption issue on 32-bit arches that made gnome-software very crashy</li>
+ <li>Fix an issue with stuck back button on the details page after closing and reopening gnome-software</li>
+ <li>Make distro upgrades to Fedora N+2 release show up correctly</li>
+ <li>Various flatpak plugin fixes</li>
+ <li>Allow opening CAB files that include more than one update</li>
+ <li>Fix critical warnings when quickly switching between category pages</li>
+ <li>Small memory leak fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-10-09" version="3.31.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.31 development series, with the following improvements:</p>
+ <ul>
+ <li>Icon redesign</li>
+ <li>Switch to using window menus instead of app menu</li>
+ <li>Add a source selection drop down to details pages</li>
+ <li>Move the search button to the left side in the header bar</li>
+ <li>Various other minor UI tweaks</li>
+ <li>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!)</li>
+ <li>Various internal plugin loader fixes and cleanups</li>
+ <li>Remove the steam plugin</li>
+ <li>Simplify the details page loading</li>
+ <li>Fix an issue that caused icons to not get loaded for locally installed flatpaks</li>
+ <li>Update Fedora distro upgrades text</li>
+ <li>Avoid a critical warning in the fwupd plugin when the device vendor is not set</li>
+ <li>Show verified developers for snaps</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-10-05" version="3.30.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Localize the polkit policy file</li>
+ <li>Display ongoing app-installation at top of the list</li>
+ <li>Update apps in display order</li>
+ <li>Fix autoupdates triggering in a feedback loop</li>
+ <li>Tweak the prefs dialog layout</li>
+ <li>Various fixes to the flatpak plugin, making its state keeping more robust</li>
+ <li>Fix flatpak errors to show up instead of a generic "Aborted" error</li>
+ <li>Avoid triggering reboots for online updatable apps (flatpak)</li>
+ <li>Make rpm-ostree updates work again</li>
+ <li>Fix an issue that caused duplicate lines in 'OS Updates' on rpm-ostree based systems</li>
+ <li>Compiler warning fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-09-25" version="3.30.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix an issue that caused duplicate lines in 'OS Updates'</li>
+ <li>Filter the application restart notification to actual desktop apps</li>
+ <li>Fix an issue that caused automatic updates to fail during download phase</li>
+ <li>Avoid showing duplicates in the featured apps when an app is available as both flatpak and a package</li>
+ <li>Fix an issue that caused gnome-software to use 100% of CPU when doing automatic updates</li>
+ <li>Lower IO priority for gnome-software so that other apps stay responsive during flatpak installs</li>
+ <li>Various fixes and wording changes to automatic updates notifications</li>
+ <li>Only show "Examine Disk" button when baobab is available</li>
+ <li>Leak and correctness fixes in the snap plugin</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-09-04" version="3.30.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.30.</p>
+ </description>
+ </release>
+ <release date="2018-08-28" version="3.29.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Do not go 'back' to a previous application details panel</li>
+ <li>Don't crash if when getting the fwupd locked status</li>
+ <li>Download updates automatically when required</li>
+ <li>Fix dark theme support</li>
+ <li>Hide screenshot and support widgets when no screenshots</li>
+ <li>Ignore non-interactive generic errors</li>
+ <li>Implement distro upgrade downloading when using rpm-ostree</li>
+ <li>Only update the update check timestamp when it succeeds</li>
+ <li>Open the WiFi panel when clicking the Network Settings button</li>
+ <li>Rotate featured apps on the overview page</li>
+ <li>Simplify the updates panel</li>
+ <li>Use FlatpakTransaction to install, remove and update</li>
+ <li>Use new display name for the Snap publisher</li>
+ <li>Use the full name for the ESRB ratings descripion</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-05" version="3.29.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Show a better notification when a local file or URI is not supported</li>
+ <li>snap: Use ODRS for reviews</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-05-09" version="3.28.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Add a warning when enabling the LVFS remote</li>
+ <li>Show a notification when failing to open an url or a local file</li>
+ <li>Fix multiple flatpak refreshes with new libflatpak</li>
+ <li>Build fixes for FreeBSD</li>
+ <li>Icon loading fixes for snap</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-04-09" version="3.28.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix a regression with opening results from gnome-shell search</li>
+ <li>Show "Source: " tag in gnome-shell search when we have multiple matches</li>
+ <li>Improve unknown license tag color scheme on details page</li>
+ <li>Don't show installed icon on app tiles while still installing</li>
+ <li>Fix empty items appearing under OS Updates</li>
+ <li>Fix a regression that caused duplicate results in codec search</li>
+ <li>Fix an issue with passing username/password to packagekit proxy</li>
+ <li>Avoid crashing during first run with no network access</li>
+ <li>A number of rpm-ostree fixes, making it possible to trigger offline updates</li>
+ <li>Stop searching multiple times on search page</li>
+ <li>Update Fedora third party repositories "Find out more..." link</li>
+ <li>Fix an issue with in-app notifications failing with invalid markup errors</li>
+ <li>Improve purchase failure handling for the snap store</li>
+ <li>Fix a possible crash in snap plugin when adding screenshots</li>
+ <li>Various other crash and correctness fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-12" version="3.28.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.28, with the following improvements:</p>
+ <ul>
+ <li>Fix the build on NixOS</li>
+ <li>Fix purchasing not working after authentication</li>
+ <li>Revert a commit that led to flatpak updates failing without any feedback</li>
+ <li>Make front page featured tile corners round to match other tiles</li>
+ <li>Fix in-app notification close button alignment</li>
+ <li>Several fixes to make error notifications more useful</li>
+ <li>snap: Fix invalid metadata after cancelled refine</li>
+ <li>snap: Launch command line snaps with 'snap run'</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-03-05" version="3.27.92" type="development">
+ <description translatable="no">
+ <p>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!</p>
+ <ul>
+ <li>Removal of global plugin cache, simplifying gnome-software internals</li>
+ <li>Software Repositories dialog got another batch of improvements and UI changes</li>
+ <li>GNOME Shell Extensions repository and fwupd repositories are now shown in the Software Repositories dialog</li>
+ <li>Shell extensions handling through PackageKit was improved, fixing a long standing bug where we were unable to remove shell extension packages</li>
+ <li>Category page rewrite that landed earlier this cycle went through UI review and got a number of fixes</li>
+ <li>Package version comparison in the updates dialog was fixed and should no longer incorrectly show updates as downgrades</li>
+ <li>Distro upgrade notifications are now rate limited to once per week</li>
+ <li>Install buttons in codec install view that got lost in the 3.22 cycle are now back</li>
+ <li>Various paper cuts with distro upgrades were fixed</li>
+ <li>Various fixes to installing apps from yum repos that have enabled=0 enabled_metadata=1</li>
+ <li>Various other correctness and warning fixes</li>
+ <li>Distros: Minimum supported fwupd version is now 1.0.3</li>
+ <li>Distros: We've released PackageKit 1.1.9 that has string changes to match gnome-software 3.28</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-02-14" version="3.27.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>The Software Sources dialog was renamed to Software Repositories and rewritten</li>
+ <li>Fedora Workstation third party repository handling was rewritten and should be more robust</li>
+ <li>Improved handling of metered network connections, making sure we cancel any downloads when changing to a metered connection</li>
+ <li>Limit the number of parallel operations depending on the installed CPU</li>
+ <li>Improved handling of pending installs when there's no network connection</li>
+ <li>Unused ostree and rpm plugins were dropped</li>
+ <li>Switch from GtkSpell to gspell</li>
+ <li>Improve alignment on the updates page</li>
+ <li>Do not show missing screenshot error for fonts that have screenshots</li>
+ <li>Fix various issues on Ubuntu when purchasing apps</li>
+ <li>Fix an issue that led to duplicate categories appearing on the overview page</li>
+ <li>Various memory leak and correctness fixes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2018-01-08" version="3.27.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Add missing locking to gs_plugin_cache_remove(), fixing a possible crash</li>
+ <li>Fix various memory leaks spotted by valgrind</li>
+ <li>Fix a possible crash triggered by the fwupd plugin</li>
+ <li>Do not emit critical warnings when reviewing OS Updates</li>
+ <li>fwupd: Use the custom user-agent when downloading firmware</li>
+ <li>overview page: Fix a crash when we have no featured apps</li>
+ <li>packagekit: Implement repository enabling</li>
+ <li>Fix hover CSS for "unknown" and "nonfree" license buttons</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-13" version="3.27.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix crashes in the repos plugin due to missing locking</li>
+ <li>Add translated strings for the new OARS v1.1 additions</li>
+ <li>Work around Firefox deleting rpm/deb files downloaded to /tmp when closing</li>
+ <li>Log errors to console when starting from command line</li>
+ <li>Do not enable distro-upgrades when updates are disabled</li>
+ <li>Do not require the user to keep clicking 'More reviews' after each click</li>
+ <li>Fix a critical when updating (flatpak) packages live</li>
+ <li>fwupd: Do not crash when trying to list a locked device</li>
+ <li>fwupd: Prepend the vendor name to the device name if not included</li>
+ <li>Improve SPDX ID parsing when working out if it is 'free'</li>
+ <li>packagekit: Do not crash when getting an invalid ID from PackageKit</li>
+ <li>packagekit: Support apt:// URLs</li>
+ <li>Various fixes to the snap plugin</li>
+ <li>Do not crash when closing the source dialog while it is loading</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-13" version="3.27.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.27 development series, with the following improvements:</p>
+ <ul>
+ <li>Redesigned category view</li>
+ <li>Better notifications for completed distro upgrades</li>
+ <li>Number of test suite fixes to pave way for continuous integration tests</li>
+ <li>Improved support for running on low res displays</li>
+ <li>Various fixes to internal state handling</li>
+ <li>Allow linking to specified proprietary licenses</li>
+ <li>Don't use versioned subdirectories under ~/.cache/gnome-software</li>
+ <li>Only show in-app notifications for interactive user actions</li>
+ <li>Various fixes for flatpak, fwupd, and snap support</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-11-09" version="3.26.2" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Various fixes to cancellable handling, making it more robust to cancel install/remove operations</li>
+ <li>Fix a common crash in Fedora distro upgrades plugin</li>
+ <li>Fix showing N+2 Fedora upgrades</li>
+ <li>Fix flatpak updates inadvertently triggering a reboot</li>
+ <li>Revert plugin GType registering changes that broke app "adopting"</li>
+ <li>Various flatpak plugin fixes</li>
+ <li>Various snap plugin fixes</li>
+ <li>Bump fwupd required dep to 0.9.7 and support building with new 1.0.0 API</li>
+ <li>Avoid erroring out for operations that return more than 500 results (distro upgrades, getting gnome-shell extensions list)</li>
+ <li>Fix a few memory leaks</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-10-02" version="3.26.1" type="stable">
+ <description translatable="no">
+ <p>This is a stable release with the following changes:</p>
+ <ul>
+ <li>Fix memory leak in "external appstream" plugin</li>
+ <li>Don't translate an icon name in the Punjabi translation</li>
+ <li>Fix critical warning in the fwupd plugin if the update URI isn't set</li>
+ <li>Fix Addon categories not showing</li>
+ <li>Fix crash in PackageKit plugin if reporting progress with no current application</li>
+ <li>Revert a change in the snapd plugin which can cause operations to fail or hang in some situations</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-09-11" version="3.26.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.26, with the following improvements:</p>
+ <ul>
+ <li>Use the new fwupd API in 0.9.7 to avoid when a reboot is required</li>
+ <li>Pass the complete proxy settings to PackageKit</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash when emitting an uncommon error message</li>
+ <li>Do not show a critical warning with new versions of fwupd</li>
+ <li>Do not show an error for a remote-less flatpakref application</li>
+ <li>Don't refine PackageKit packages after we've been cancelled</li>
+ <li>Fix a possible crash on 32 bit systems</li>
+ <li>Fix GNOME Shell search results for snap applications</li>
+ <li>Properly disable shell-extensions when not running GNOME Shell</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-08-21" version="3.25.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a simple donation button on the details page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Allow plugins to say that installation cannot be cancelled</li>
+ <li>Fix displaying the info bar for the Shell Extensions category</li>
+ <li>Use first featured snap as the featured app</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-08-07" version="3.25.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a simple donation button on the details page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash if the child schema is invalid</li>
+ <li>Don't log a warning when clicking the the 'more results' search entry</li>
+ <li>Fixed subcategory names localization</li>
+ <li>Ensure flatpak remote names are valid</li>
+ <li>Fix critical warning with new versions of the fwupd daemon</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-07-21" version="3.25.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add new rpm-ostree integration for Fedora Atomic Workstation</li>
+ <li>Install the Flatpak runtime as part of the application install phase</li>
+ <li>Split OS updates up into multiple sections and show the target version</li>
+ <li>Support compatibility IDs when getting reviews from the ODRS</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Cancel plugin jobs if they take too much time</li>
+ <li>Correctly find already installed flatpak runtimes</li>
+ <li>Do not show an error for a flatpakref when broken remotes exist</li>
+ <li>Don't show the screenshot section for runtimes</li>
+ <li>Fix authentication prompt not showing when using snapd</li>
+ <li>Make license buttons buttons actually look clickable</li>
+ <li>Make the review moderator panel easier to use</li>
+ <li>Only show snaps as sandboxed if snapd supports confinement</li>
+ <li>Respect the per-user or per-system install preferences</li>
+ <li>Return the correct installed state for user/system flatpak remotes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-06-22" version="3.25.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a banner designer utility</li>
+ <li>Add the initial support to support purchasable apps</li>
+ <li>Automatically install flatpak icon themes and GTK themes</li>
+ <li>Restyle the updates panel to have a separate sections</li>
+ <li>Show a notification in the updates page when the OS is end of life</li>
+ <li>Show recently updated applications on the overview page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add snap self tests and provide more data to the details panel</li>
+ <li>Allow compiling with newer versions of meson</li>
+ <li>Do not crash when sending progress reports while refreshing</li>
+ <li>Don't trigger systemd for every single offline update</li>
+ <li>Ensure all related flatpak applications get installed</li>
+ <li>Ensure we use the gnome-desktop support if enabled</li>
+ <li>Fix searching for codecs on Ubuntu</li>
+ <li>Show a better status messages when downloading metadata</li>
+ <li>Show a pulsing progressbar if plugins do not report progress</li>
+ <li>Show the PackageKit interactive dialog when required</li>
+ <li>Support updating metadata from multiple fwupd remotes</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-05-08" version="3.25.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Allow AppStream to be downloaded out-of-band per-user</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not initialize plugins in every instance</li>
+ <li>Fix the 'Show Details' context menu item in GNOME Shell</li>
+ <li>Use headerbar in toolbar-mode in Unity</li>
+ <li>Do not allow plugins to set the origin title in the UI</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-04-28" version="3.25.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.25 development series, with the following improvements:</p>
+ <ul>
+ <li>Truncate the search results if there are a large number</li>
+ <li>Use the complete source as a search keyword</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Fall back to a stock icon for hardware drivers</li>
+ <li>Fix a crash when removing an addon</li>
+ <li>Fix a critical warning in the shell search provider</li>
+ <li>Fix popular-overrides to show the correct applications</li>
+ <li>Fix various failures to read from snapd</li>
+ <li>Make offline updates work when online updates are available</li>
+ <li>Never include the size of the runtime in the installed size</li>
+ <li>Respect the install preference when for flatpakref files</li>
+ <li>Use the developer name in preference to the project group</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-03-13" version="3.23.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following bug fixes:</p>
+ <ul>
+ <li>Allow installing broken flatpakref files</li>
+ <li>Do not reload the updates list when updates are in progress</li>
+ <li>Reset the headerbar title when switching to the details page</li>
+ <li>Unconditionally show things that are in progress in the Installed page</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-02-27" version="3.23.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add support for RuntimeRepo in flatpakref files</li>
+ <li>Allow the user to restart the currently running gnome-software instance</li>
+ <li>Never show components without AppData files</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Initialize progress to zero right before and after processing an action</li>
+ <li>Animate the removal of live updates</li>
+ <li>Add YaST as a default folder in gnome-shell overview</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2017-02-13" version="3.23.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Handle apt and snap URLs</li>
+ <li>Show the updates panel with sections</li>
+ <li>Sort the apps in the installed panel by kind</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a more detailed error message when AC power is required</li>
+ <li>Do not hardcode the gnome-software application name</li>
+ <li>Ensure firmware is downloaded when not cached</li>
+ <li>Fix a rather large memory leak when loading Steam data</li>
+ <li>Fix launching Flatpak apps after updating</li>
+ <li>Install needed Flatpak runtimes when updating an app</li>
+ <li>Only show the scary firmware warning for removable devices</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-12-15" version="3.23.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an --install and --interaction CLI options</li>
+ <li>Add the installed size of the apps in the installed view</li>
+ <li>Always set a description for each notification</li>
+ <li>Show an in-app notification when installed plugins are changed</li>
+ <li>Use a set of stars to show the different star ratings</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a missing error check to fix a common crash on LiveDVD media</li>
+ <li>Add thread locking in GsApp to fix some common crashes</li>
+ <li>Allow upgrading to Fedora EOL releases</li>
+ <li>Don't allow review actions when offline</li>
+ <li>Ensure we actually schedule firmware updates for download</li>
+ <li>Fix the getting of PackageKit and flatpak update details</li>
+ <li>Hide some notifications when the new app is launched or the window is closed</li>
+ <li>Hide the screenshot placeholder for input methods and langpacks</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-11-21" version="3.23.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.23 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a setting for downloading updates on metered connections</li>
+ <li>Add content rating interface for games</li>
+ <li>Add support for pending updates that are applied on demand</li>
+ <li>Add support for the flatpak DefaultBranch feature</li>
+ <li>Allow showing an application review without a display name</li>
+ <li>Convert the modal failure dialogs to in-app notifications</li>
+ <li>Switch to using the ODRS server hosted by GNOME</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Always get the newest screenshot for GNOME Shell extensions</li>
+ <li>Avoid redownloading the same screenshots for different images</li>
+ <li>Don't download updates when low on power</li>
+ <li>Fix the growth in memory usage for every search request</li>
+ <li>Never show a 'back' button when showing search results</li>
+ <li>Show the search bar when the user does ctrl+f</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-11-07" version="3.22.2" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Large number of fixes and improvements for flatpak support</li>
+ <li>Improved handling for flatpak repos with multiple branches</li>
+ <li>Initial support for installing flatpakrepo files</li>
+ <li>Fix a crash when searching for codecs</li>
+ <li>Fix a crash when de-duplicating applications</li>
+ <li>Speed improvements for loading appstream data</li>
+ <li>Refactor snapd handling code using snapd-glib</li>
+ <li>Show the search bar when the user does Ctrl+f</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-10-12" version="3.22.1" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Fix several issues with flatpak bundles</li>
+ <li>Fix installing local packages</li>
+ <li>Fix a crash when failing to get an installed flatpak ref</li>
+ <li>Speed up loading the details and overview pages</li>
+ <li>Switch to using the ODRS server hosted by GNOME</li>
+ </ul>
+ <p>This release also updates translations.</p>
+ </description>
+ </release>
+ <release date="2016-09-19" version="3.22.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for GNOME 3.22 and updates several translations.</p>
+ </description>
+ </release>
+ <release date="2016-09-13" version="3.21.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a new section name in the Addons category for drivers</li>
+ <li>Add a plugin to match a hardware modalias</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not hide the origin when installing or removing an app</li>
+ <li>Do not show the screenshot fallback image for firmware or drivers</li>
+ <li>Fix launching app's details from the installed notification</li>
+ <li>Fix showing the source line in the installed panel</li>
+ <li>Unbreak the GNOME Shell search provider</li>
+ <li>Use the same padding as a GtkStackSwitcher</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-08-31" version="3.21.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add functionality to enable non-free sources</li>
+ <li>Show the device bootloader screenshot when required</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Always return consistent results by allowing plugins to share a cache</li>
+ <li>Ensure the search text is showing when going back to search results</li>
+ <li>Only enable the firmware 'Install' button when the device is in the right mode</li>
+ <li>Remove an app from the installed view when it's uninstalled</li>
+ <li>Show percentage progress when installing firmware</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-08-15" version="3.21.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Limit the ODRS moderation queue to a specific language</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Correctly load .flatpakrepo files</li>
+ <li>Don't get the download size for installed flatpak packages</li>
+ <li>Fix showing the progress bar when installing apps</li>
+ <li>Never try to modify the application name</li>
+ <li>Only notify about upgrades once per month</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-07-18" version="3.21.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a cancel button and progress information to the details page</li>
+ <li>Add a dialog to confirm upgrade removals</li>
+ <li>Add support for authenticating in plugins</li>
+ <li>Add support for snaps</li>
+ <li>Enable gtk-doc generation for documentation</li>
+ <li>Show a new-style category list on the overview page</li>
+ <li>Show origin information when applications are available from multiple sources</li>
+ <li>Show sandboxing information for selected applications</li>
+ <li>Show the star ratings in more places</li>
+ <li>Support installing .flatpakrepo files</li>
+ <li>Support launching applicatins using a appstream:// URL</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Allow plugins to be enabled and disabled at runtime</li>
+ <li>Always show the 'MyLanguage' kudo when in en_US locale</li>
+ <li>Correctly trigger systemd offline updates when only processing OS updates</li>
+ <li>Disable app folders feature when run outside GNOME</li>
+ <li>Do not show buttons on the search results</li>
+ <li>Do not use deprecated CSS properties</li>
+ <li>Do not use deprecated fwupd API</li>
+ <li>Ensure reviews are shown in the correct order</li>
+ <li>Fix a crash when double clicking files</li>
+ <li>Fix several UX issues when upgrading</li>
+ <li>Show the 'More Reviews' button in the details panel</li>
+ <li>Try really hard to have two rows of important categories</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-05-23" version="3.21.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a --details-pkg option to the gnome-software binary</li>
+ <li>Add support for flatpak packages</li>
+ <li>Add a plugin to auto-add some license information</li>
+ <li>Add depends, requires and conflicts at initialize time</li>
+ <li>Add support for application key colors</li>
+ <li>Export a set of headers to allow external plugins to be built</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash if plugins are badly behaved</li>
+ <li>Do not directly load pixbufs in the AppStream plugin</li>
+ <li>Do not unconditionally invalidate the updates list on hardware hotplug</li>
+ <li>Find the best AppSteam component when matching any prefixes</li>
+ <li>Fix crash due to network change before app activation</li>
+ <li>Fix launching various KDE4 applications</li>
+ <li>Support getting cached content from /var/cache and /usr/share</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-04-25" version="3.21.1" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.21 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an initial loading panel when there is no metadata</li>
+ <li>Add an outline ostree plugin that just adds remotes as sources</li>
+ <li>Add an unreviewable application quirk</li>
+ <li>Add initial Steam support</li>
+ <li>Add support for app shortcut addition/removal</li>
+ <li>Add support for GNOME Shell extensions</li>
+ <li>Allow free-but-unspecified SPDX tokens</li>
+ <li>Allow widgets to use custom CSS in a generic way</li>
+ <li>Do the PackageKit refresh as a background transaction</li>
+ <li>Hide "Software Sources" menu when its action is disabled</li>
+ <li>Make the distro upgrades dialog match the new mockup</li>
+ <li>Split the 'size' property into size-installed and size-download</li>
+ <li>Use a link instead of a button for history</li>
+ <li>Use AppStream files for the popular, featured and extra category data</li>
+ <li>Use dpkg-deb info to create a GsApp when double clicking on a .deb file</li>
+ <li>Use FwupdClient from fwupd 0.7.0</li>
+ <li>Use GdkPixbuf to parse icns files</li>
+ <li>Use gsettings to enable/disable the 'sources' action</li>
+ <li>Use the Fedora themed image for the upgrade banner</li>
+ <li>When there are no trusted sources mark everything as non-3rd-party</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Actually show the error dialog for an invalid file</li>
+ <li>Allow all functions called by g_module_symbol() to fail</li>
+ <li>Allow popular and featured apps to match any prefix</li>
+ <li>Do not maintain a cache of applications in the plugin loader</li>
+ <li>Do not make the ODRS plugin depend on xdg-app</li>
+ <li>Do not re-request the distro-upgrade when switching pages</li>
+ <li>Do not show ratings and reviews for some component kinds</li>
+ <li>Do not show the distro-upgrade notification if the window is open</li>
+ <li>Do not use the header bar on Unity</li>
+ <li>Fix a crash when double clicking package files</li>
+ <li>Fix live installing firmware</li>
+ <li>Get the correct icon size when installing xdg-app bundles on HiDPI</li>
+ <li>Hide the kudo details panel for non desktop components</li>
+ <li>Load screenshots directly if their URLs point to local files</li>
+ <li>Lower the limits for review text</li>
+ <li>Make all the plugins more threadsafe</li>
+ <li>Make the provenance plugin non-specific to Fedora</li>
+ <li>Move header bar button creation into individual pages</li>
+ <li>Move the Install &amp; Restart button below the upgrade banner</li>
+ <li>Never show star ratings on the category app tiles</li>
+ <li>Only show one modal dialog at a time</li>
+ <li>Only show the session manager restart if there were any non-live updates</li>
+ <li>Properly support multi-line .deb descriptions</li>
+ <li>Show a 'Install All' button when all the updates can be installed live</li>
+ <li>Show a modal dialog when downloading the distro-upgrade failed</li>
+ <li>Show the upgrades banner even if there are no updates to show</li>
+ <li>Use a cache file to respect the fedora-distro-upgrades cache-age</li>
+ <li>Use GFile instead of a filename when converting apps</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-02-29" version="3.19.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add an 'All' subcategory in the category shell</li>
+ <li>Add ratings and review functionality for Ubuntu</li>
+ <li>Install the xdg-app runtime as required automatically</li>
+ <li>Show a confirmation dialog before reporting a review</li>
+ <li>Show a guide label for the different star values</li>
+ <li>Support installing local xdg-app bundles</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Correctly identify local packages with sources</li>
+ <li>Do not add multiple search results for the same app</li>
+ <li>Do not show xdg-app runtimes in the installed panel</li>
+ <li>Escape markup before showing modal dialogs</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-02-15" version="3.19.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add end-user application review functionality</li>
+ <li>Add support for upgrading the OS from one release to another</li>
+ <li>Add support for xdg-app and Limba bundles</li>
+ <li>Add tags to applications, and explain them in the details page</li>
+ <li>Update the list of featured applications on the front page</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Add a missing tag to the software center metadata file</li>
+ <li>PackageKit support is now optional</li>
+ <li>Temporarily remove the remove button in the sources dialog</li>
+ <li>Use versioned user cache directories to pick up new screenshots</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2016-01-15" version="3.19.4" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.19 development series, with the following improvements:</p>
+ <ul>
+ <li>Add a link to Wikipedia to explain proprietary and public domain software</li>
+ <li>Allow administrators to override the default popular applications</li>
+ <li>Improve the interface for device firmware updates and some can be done live</li>
+ <li>Make sure Characters and Disks show up in Utilities</li>
+ <li>Show 3rd party applications in the search results</li>
+ <li>Show a nicer installation dialog when installing local files</li>
+ <li>Speed up the application first-start and also speed up switching pages</li>
+ <li>Try to show if an application is free software</li>
+ </ul>
+ <p>The following bugs are also fixed:</p>
+ <ul>
+ <li>Do not crash on refresh if the fwupd daemon is not available</li>
+ <li>Fix installing web applications</li>
+ <li>Rework several windows to fit better on small screens</li>
+ <li>Use the correct user agent string when downloading firmware</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-11-05" version="3.18.3" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Use the correct user agent string when downloading firmware</li>
+ <li>Fix a crash in the limba plugin</li>
+ <li>Fix installing web applications</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-10-15" version="3.18.2" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Fix a regression that could lead to never finding any updates</li>
+ <li>Fix an issue with getting package details for apps without AppData</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-10-13" version="3.18.1" type="stable">
+ <description translatable="no">
+ <p>This stable release fixes the following bugs:</p>
+ <ul>
+ <li>Do not force the cache refresh and delete otherwise valid packages</li>
+ <li>Fix several potential crashes when navigating and when installing</li>
+ <li>Get the new application icon for local packages after installation</li>
+ <li>Improve cold start time by only parsing AppStream data once</li>
+ <li>Make sure Characters and Disks show up in Utilities</li>
+ <li>Only download the fwupd metadata signature once per day</li>
+ <li>Show an empty space for no category results</li>
+ <li>Show applications without AppData in the installed panel</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-09-21" version="3.18.0" type="stable">
+ <description translatable="no">
+ <p>This is the first stable release for the GNOME 3.18 desktop!</p>
+ </description>
+ </release>
+ <release date="2015-09-15" version="3.17.92" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Fix getting firmware updates by parsing the metadata correctly</li>
+ <li>Make the application menu path correct in RTL locales</li>
+ <li>Don't keep the application running forever when run as a search provider</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-09-03" version="3.17.91" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Better theming for the category sidebar</li>
+ <li>Use standard size icon in the about dialog</li>
+ <li>Support mouse back button for going back in dialogs</li>
+ <li>Fix incorrect alignment on the front page in RTL languages</li>
+ <li>Misc other minor bugs fixed</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-08-19" version="3.17.90" type="development">
+ <description translatable="no">
+ <p>This is an unstable release with the following bugs fixed:</p>
+ <ul>
+ <li>Use CSS to style the error message details</li>
+ <li>Correctly align labels in the Add to Folder dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-08-12" version="3.17.3" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Add basic support for Limba bundles</li>
+ <li>Automatically download new firmware metadata from LVFS</li>
+ <li>Hide updates UI on managed systems</li>
+ <li>Show a new notification when security updates remain unapplied</li>
+ <li>Show installation progress when installing applications</li>
+ <li>Use some new applications to the picked category</li>
+ </ul>
+ <p>Bugs fixed in this release:</p>
+ <ul>
+ <li>Do not show applications that are not available when searching by category</li>
+ <li>Don't crash when launching an app that has no desktop ID</li>
+ <li>Don't show applications without AppData in the category view</li>
+ <li>Fix a possible race and crash when loading icons</li>
+ <li>Fix locking in the AppStream code to fix several crashes</li>
+ <li>Use better error messages on offline update failure</li>
+ <li>Withdraw the notification when prepared update gets invalidated</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-06-05" version="3.17.2" type="development">
+ <description translatable="no">
+ <p>This is an unstable release in the 3.17 development series, with the following improvements:</p>
+ <ul>
+ <li>Make fwupd dependency automagic</li>
+ </ul>
+ <p>Bugs fixed in this release:</p>
+ <ul>
+ <li>Fix a regression from the previous unstable release that made it impossible to install updates</li>
+ <li>Fix a crash in the screenshot loader</li>
+ <li>Fix a crash in the sources dialog</li>
+ <li>Fix a crash when installing rpms that lack description</li>
+ <li>Wrap long descriptions in the update dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-05-25" version="3.17.1" type="development">
+ <description translatable="no">
+ <p>This is the first unstable release in the 3.17 development series, with a number of new features:</p>
+ <ul>
+ <li>Support getting firmware updates through the fwupd daemon</li>
+ <li>Use a smaller number of tiles on the front page on small monitors</li>
+ <li>Rework internal modulesets, making it easier to edit the list of featured apps</li>
+ <li>Revert back to using a hand-picked list of featured apps</li>
+ <li>Several improvements to the sources dialog</li>
+ <li>Show better human readable names when searching for font scripts</li>
+ <li>Show a spinner while loading the data for the update history dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-05-11" version="3.16.2" type="stable">
+ <description translatable="no">
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Remove redundant OK button from the updates installed notification</li>
+ <li>Display a better human readable title for printer drivers</li>
+ <li>Show a better UI for offline update failure dialog</li>
+ <li>Set default actions for the update done notifications</li>
+ <li>Allow searching for packages via the API without appdata</li>
+ <li>Fix showing webapps with non-local icons</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-04-14" version="3.16.1" type="stable">
+ <description translatable="no">
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Correctly save HiDPI images to HiDPI directories</li>
+ <li>Scroll the contents of the error message dialog</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-03-23" version="3.16.0" type="stable">
+ <description translatable="no">
+ <p>This stable release marks the release of GNOME 3.16!</p>
+ </description>
+ </release>
+ <release date="2015-03-16" version="3.15.92" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>React to theme changes</li>
+ <li>Rebase the HighContrast theme</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Fix HiDPI scale factor calculation</li>
+ <li>Align section headings in all views</li>
+ <li>Fix 'installed' overlays when using the HighContrast theme</li>
+ <li>Fall back to showing the top level category when no sub category exists</li>
+ <li>Fix a crash when using the pending applications feature</li>
+ </ul>
+ <p>This release also updates translations for many languages.</p>
+ </description>
+ </release>
+ <release date="2015-03-02" version="3.15.91" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Enable kinetic scrolling in updates dialog</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Always ensure that the back entry focus widget is valid</li>
+ <li>Don't show small screenshots on HiDPI hardware</li>
+ <li>Fix a crash when starting GNOME Software for the first time</li>
+ <li>Only show compatible projects when getting the featured list</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2015-02-16" version="3.15.90" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Add a new panel for displaying session service results</li>
+ <li>Add a new version of the Modify interface</li>
+ <li>Require AppData for all available packages</li>
+ </ul>
+ <p>This release fixes the following bug:</p>
+ <ul>
+ <li>Use the new mockups for the 3rd party source install dialogs</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2015-01-19" version="3.15.4" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Fix searching with very small search terms</li>
+ </ul>
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Do case-insensitive searching of suitable keywords</li>
+ <li>Fix a crash in the screenshot loader</li>
+ <li>Fix a crash when clicking the back button</li>
+ <li>Fix searching for keyworks with special chars</li>
+ <li>Show an error message when we fail to load details about a local file</li>
+ </ul>
+ </description>
+ </release>
+ <release date="2014-11-24" version="3.15.2" type="development">
+ <description translatable="no">
+ <p>This unstable release adds the following features:</p>
+ <ul>
+ <li>Show a blurred low-resolution screenshot while loading the HiDPI one</li>
+ </ul>
+ <p>This release fixes the following bugs:</p>
+ <ul>
+ <li>Do not show a random white line above the star rating widget</li>
+ <li>Do not show empty app boxes if no popular results are available</li>
+ <li>Do not try to download local web-app icons</li>
+ <li>Use blue stars for the user-ratings rather than gold</li>
+ </ul>
+ </description>
+ </release>
+ </releases>
+ <provides>
+ <id>gnome-software.desktop</id>
+ </provides>
+ <kudos>
+ <kudo>HiDpiIcon</kudo>
+ <kudo>ModernToolkit</kudo>
+ <kudo>Notifications</kudo>
+ <kudo>SearchProvider</kudo>
+ </kudos>
+ <url type="bugtracker">https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new</url>
+ <url type="donation">https://www.gnome.org/donate/</url>
+ <url type="homepage">https://wiki.gnome.org/Design/Apps/Software</url>
+ <url type="translate">https://wiki.gnome.org/TranslationProject</url>
+ <url type="vcs-browser">https://gitlab.gnome.org/GNOME/gnome-software/</url>
+ <update_contact>richard_at_hughsie.com</update_contact>
+ <compulsory_for_desktop>GNOME</compulsory_for_desktop>
+ <project_group>GNOME</project_group>
+ <translation type="gettext">gnome-software</translation>
+ <developer_name>The GNOME Project</developer_name>
+ <content_rating type="oars-1.0">
+ <content_attribute id="violence-cartoon">none</content_attribute>
+ <content_attribute id="violence-fantasy">none</content_attribute>
+ <content_attribute id="violence-realistic">none</content_attribute>
+ <content_attribute id="violence-bloodshed">none</content_attribute>
+ <content_attribute id="violence-sexual">none</content_attribute>
+ <content_attribute id="drugs-alcohol">none</content_attribute>
+ <content_attribute id="drugs-narcotics">none</content_attribute>
+ <content_attribute id="drugs-tobacco">none</content_attribute>
+ <content_attribute id="sex-nudity">none</content_attribute>
+ <content_attribute id="sex-themes">none</content_attribute>
+ <content_attribute id="language-profanity">none</content_attribute>
+ <content_attribute id="language-humor">none</content_attribute>
+ <content_attribute id="language-discrimination">none</content_attribute>
+ <content_attribute id="social-chat">moderate</content_attribute>
+ <content_attribute id="social-info">mild</content_attribute>
+ <content_attribute id="social-audio">none</content_attribute>
+ <content_attribute id="social-location">none</content_attribute>
+ <content_attribute id="social-contacts">none</content_attribute>
+ <content_attribute id="money-purchasing">none</content_attribute>
+ <content_attribute id="money-gambling">none</content_attribute>
+ </content_rating>
+ <launchable type="desktop-id">org.gnome.Software.desktop</launchable>
+</component>
diff --git a/data/metainfo/ss-details.png b/data/metainfo/ss-details.png
new file mode 100644
index 0000000..4d9ee04
--- /dev/null
+++ b/data/metainfo/ss-details.png
Binary files differ
diff --git a/data/metainfo/ss-details2.png b/data/metainfo/ss-details2.png
new file mode 100644
index 0000000..b51795c
--- /dev/null
+++ b/data/metainfo/ss-details2.png
Binary files differ
diff --git a/data/metainfo/ss-installed.png b/data/metainfo/ss-installed.png
new file mode 100644
index 0000000..05283af
--- /dev/null
+++ b/data/metainfo/ss-installed.png
Binary files differ
diff --git a/data/metainfo/ss-overview.png b/data/metainfo/ss-overview.png
new file mode 100644
index 0000000..c8f6091
--- /dev/null
+++ b/data/metainfo/ss-overview.png
Binary files differ
diff --git a/data/metainfo/ss-up-to-date.png b/data/metainfo/ss-up-to-date.png
new file mode 100644
index 0000000..8ebe00d
--- /dev/null
+++ b/data/metainfo/ss-up-to-date.png
Binary files differ
diff --git a/data/metainfo/ss-updates-details.png b/data/metainfo/ss-updates-details.png
new file mode 100644
index 0000000..9582490
--- /dev/null
+++ b/data/metainfo/ss-updates-details.png
Binary files differ
diff --git a/data/metainfo/ss-updates.png b/data/metainfo/ss-updates.png
new file mode 100644
index 0000000..62bb4d5
--- /dev/null
+++ b/data/metainfo/ss-updates.png
Binary files differ
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+ <vendor>GNOME</vendor>
+ <vendor_url>https://www.gnome.org/</vendor_url>
+
+ <action id="org.gnome.software.install-appstream">
+ <description>Install an appstream file into a system location</description>
+ <message>Installing an appstream file into a system location</message>
+ <defaults>
+ <allow_any>yes</allow_any>
+ <allow_active>yes</allow_active>
+ <allow_inactive>no</allow_inactive>
+ </defaults>
+ <annotate key="org.freedesktop.policykit.exec.path">@libexecdir@/gnome-software-install-appstream</annotate>
+ </action>
+</policyconfig>
diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml
new file mode 100644
index 0000000..aa074f1
--- /dev/null
+++ b/data/org.gnome.software.gschema.xml
@@ -0,0 +1,149 @@
+<schemalist>
+ <schema id="org.gnome.software" path="/org/gnome/software/" gettext-domain="gnome-software">
+ <key name="compatible-projects" type="as">
+ <default>['GNOME', 'KDE', 'XFCE']</default>
+ <summary>A list of compatible projects</summary>
+ <description>This is a list of compatible projects we should show such as GNOME, KDE and XFCE.</description>
+ </key>
+ <key name="allow-updates" type="b">
+ <default>true</default>
+ <summary>Whether to manage updates and upgrades in GNOME Software</summary>
+ <description>If disabled, GNOME Software will hide the updates panel, not perform any automatic updates actions or prompt for upgrades.</description>
+ </key>
+ <key name="download-updates" type="b">
+ <default>true</default>
+ <summary>Automatically download and install updates</summary>
+ <description>If enabled, GNOME Software automatically downloads software updates in the background, also installing ones that do not require a reboot.</description>
+ </key>
+ <key name="download-updates-notify" type="b">
+ <default>true</default>
+ <summary>Notify the user about software updated in the background</summary>
+ <description>If enabled, GNOME Software notifies the user about updates that happened whilst the user was idle.</description>
+ </key>
+ <key name="refresh-when-metered" type="b">
+ <default>false</default>
+ <summary>Whether to automatically refresh when on a metered connection</summary>
+ <description>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).</description>
+ </key>
+ <key name="first-run" type="b">
+ <default>true</default>
+ <summary>Whether it’s the very first run of GNOME Software</summary>
+ </key>
+ <key name="show-ratings" type="b">
+ <default>false</default>
+ <summary>Show star ratings next to applications</summary>
+ </key>
+ <key name="filter-default-branch" type="b">
+ <default>true</default>
+ <summary>Filter applications based on the default branch set for the remote</summary>
+ </key>
+ <key name="prompt-for-nonfree" type="b">
+ <default>true</default>
+ <summary>Non-free applications show a warning dialog before install</summary>
+ <description>When non-free applications are installed a warning dialog can be shown. This controls if that dialog is suppressed.</description>
+ </key>
+ <key name="check-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update check timestamp</summary>
+ </key>
+ <key name="upgrade-notification-timestamp" type="x">
+ <default>0</default>
+ <summary>The last upgrade notification timestamp</summary>
+ </key>
+ <key name="update-notification-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update notification timestamp</summary>
+ </key>
+ <key name="security-timestamp" type="x">
+ <default>0</default>
+ <summary>The timestamp of the first security update, cleared after update</summary>
+ </key>
+ <key name="install-timestamp" type="x">
+ <default>0</default>
+ <summary>The last update timestamp</summary>
+ </key>
+ <key name="online-updates-timestamp" type="x">
+ <default>0</default>
+ <summary>The last timestamp when the system was online and got any updates</summary>
+ </key>
+ <key name="screenshot-cache-age-maximum" type="u">
+ <default>2592000</default>
+ <summary>The age in seconds to verify the upstream screenshot is still valid</summary>
+ <description>
+ 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.
+ </description>
+ </key>
+ <key name="review-server" type="s">
+ <default>'https://odrs.gnome.org/1.0/reviews/api'</default>
+ <summary>The server to use for application reviews</summary>
+ </key>
+ <key name="review-karma-required" type="i">
+ <default>0</default>
+ <summary>The minimum karma score for reviews</summary>
+ <description>Reviews with karma less than this number will not be shown.</description>
+ </key>
+ <key name="official-repos" type="as">
+ <default>[]</default>
+ <summary>A list of official repositories that should not be considered 3rd party</summary>
+ </key>
+ <key name="required-repos" type="as">
+ <default>[]</default>
+ <summary>A list of required repositories that cannot be disabled or removed</summary>
+ </key>
+ <key name="free-repos" type="as">
+ <default>[]</default>
+ <summary>A list of official repositories that should be considered free software</summary>
+ </key>
+ <key name="free-repos-url" type="s">
+ <default>''</default>
+ <summary>The licence URL to use when an application should be considered free software</summary>
+ </key>
+ <key name="install-bundles-system-wide" type="b">
+ <default>true</default>
+ <summary>Install bundled applications for all users on the system where possible</summary>
+ </key>
+ <key name="enable-repos-dialog" type="b">
+ <default>true</default>
+ <summary>Allow access to the Software Repositories dialog</summary>
+ </key>
+ <key name="show-upgrade-prerelease" type="b">
+ <default>false</default>
+ <summary>Offer upgrades for pre-releases</summary>
+ </key>
+ <key name="show-nonfree-ui" type="b">
+ <default>true</default>
+ <summary>Show some UI elements informing the user that an app is non-free</summary>
+ </key>
+ <key name="installed-page-show-size" type="b">
+ <default>true</default>
+ <summary>Show the installed size for apps in the list of installed applications</summary>
+ </key>
+ <key name="nonfree-software-uri" type="s">
+ <!-- Translators: Replace the link with a version in your language, e.g. 'https://de.wikipedia.org/wiki/Proprietäre_Software'. Remember to include ''. -->
+ <default l10n="messages">'https://en.wikipedia.org/wiki/Proprietary_software'</default>
+ <summary>The URI that explains nonfree and proprietary software</summary>
+ </key>
+ <key name="external-appstream-urls" type="as">
+ <default>[]</default>
+ <summary>A list of URLs pointing to appstream files that will be downloaded into an swcatalog folder</summary>
+ </key>
+ <key name="external-appstream-system-wide" type="b">
+ <default>false</default>
+ <summary>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</summary>
+ </key>
+ <key name="packaging-format-preference" type="as">
+ <default>['']</default>
+ <summary>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.</summary>
+ </key>
+ <child name="auth" schema="org.gnome.software.auth"/>
+ </schema>
+ <schema id="org.gnome.software.auth" gettext-domain="gnome-software">
+ <key name="account-id" type="s">
+ <default>''</default>
+ <summary>A string storing the gnome-online-account id used to login</summary>
+ </key>
+ </schema>
+</schemalist>
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..aa16279
--- /dev/null
+++ b/doc/api/gnome-software-docs.xml
@@ -0,0 +1,778 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+ <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+]>
+<book id="index">
+ <bookinfo>
+ <title>GNOME Software Reference Manual</title>
+ </bookinfo>
+
+ <reference id="tutorial">
+ <title>GNOME Software Plugin Tutorial</title>
+ <partintro>
+ <para>
+ GNOME Software is a software installer designed to be easy to use.
+ </para>
+
+ <section>
+ <title>Introduction</title>
+ <para>
+ 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.
+ </para>
+ <para>
+ There are broadly 3 types of plugin methods:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis role="strong">Actions</emphasis>: Do something on a specific GsApp</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">Refine</emphasis>: Get details about a specific GsApp</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">Adopt</emphasis>: Can this plugin handle this GsApp</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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 <emphasis>application is a desktop-file</emphasis> paradigm.
+ This is where a plugin makes sense.
+ </para>
+
+ <para>
+ The plugin needs to create a class derived from <type>GsPlugin</type>,
+ and define the vfuncs that it needs. The
+ plugin name is taken automatically from the suffix of the
+ <filename>.so</filename> file. The type of the plugin is exposed to
+ gnome-software using <function>gs_plugin_query_type()</function>, which
+ must be exported from the module.
+ </para>
+ <example>
+ <title>A sample plugin</title>
+ <programlisting>
+/*
+ * Copyright (C) 2016 Richard Hughes
+ */
+
+#include &lt;glib.h&gt;
+#include &lt;gnome-software.h&gt;
+
+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 (&amp;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;
+}
+ </programlisting>
+ </example>
+
+ <para>
+ We have to define when our plugin is run in reference to other plugins,
+ in this case, making sure we run before <code>appstream</code>.
+ As we're such a simple plugin we're relying on another plugin to run
+ after us to actually make the GsApp <emphasis>complete</emphasis>,
+ i.e. loading icons and setting a localised long description.
+ </para>
+ <para>
+ 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
+ <code>fotoshop</code>.
+ </para>
+ <para>
+ We can then build and install the plugin using:
+ </para>
+ <informalexample>
+ <programlisting>
+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 &amp;&amp; \
+cp libgs_plugin_example.so $(pkg-config gnome-software --variable=plugindir)
+ </programlisting>
+ </informalexample>
+
+ <mediaobject id="gs-example-search">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-search.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ </section>
+
+ <section>
+ <title>Distribution Specific Functionality</title>
+ <para>
+ Some plugins should only run on specific distributions, for instance
+ the <code>fedora-pkgdb-collections</code> plugin should only be used on
+ Fedora systems.
+ This can be achieved with a simple runtime check using the helper
+ <code>gs_plugin_check_distro_id()</code> method or the <code>GsOsRelease</code>
+ object where more complicated rules are required.
+ </para>
+ <example>
+ <title>Self disabling on other distributions</title>
+ <programlisting>
+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. */
+}
+ </programlisting>
+ </example>
+
+ </section>
+
+ <section>
+ <title>Custom Applications in the Installed List</title>
+ <para>
+ 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.
+ </para>
+ <example>
+ <title>Example showing a custom installed application</title>
+ <programlisting>
+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 (&amp;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_add_kudo (app, GS_APP_KUDO_INSTALLS_USER_DOCS);
+ gs_app_set_license (app, GS_APP_QUALITY_NORMAL, "GPL-2.0+ and LGPL-2.1+");
+
+ /* 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 (&amp;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);
+}
+ </programlisting>
+ </example>
+ <para>
+ This shows a lot of the plugin architecture in action. Some notable points:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Setting the management plugin means we can check for this string
+ when working out if we can handle the install or remove action.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Most applications want a kind of <code>AS_COMPONENT_KIND_DESKTOP_APP</code>
+ to be visible as an application.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The origin is where the application originated from — usually
+ this will be something like <emphasis>Fedora Updates</emphasis>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <code>GS_APP_KUDO_INSTALLS_USER_DOCS</code> means we get the
+ blue "Documentation" award in the details page; there are many
+ kudos to award to deserving apps.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Setting the license means we don't get the non-free warning —
+ removing the 3rd party warning can be done using
+ <code>GS_APP_QUIRK_PROVENANCE</code>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 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 <code>GsRemoteIcon</code>, the
+ <code>icons</code> plugin will download and cache the icon
+ locally.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ To show this fake application just compile and install the plugin,
+ <code>touch ~/chiron</code> and then restart gnome-software.
+ To avoid restarting <filename>gnome-software</filename> each time a
+ proper plugin would create a <code>GFileMonitor</code> object to
+ monitor files.
+ </para>
+
+ <mediaobject id="gs-example-installed">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-installed.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ By filling in the optional details (which can also be filled in using
+ <code>refine_async()</code> 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.
+ </para>
+
+ <mediaobject id="gs-example-details">
+ <imageobject>
+ <imagedata format="PNG" fileref="gs-example-details.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ </section>
+
+ <section>
+ <title>Downloading Metadata and Updates</title>
+
+ <para>
+ The plugin loader supports a <code>refresh_metadata_async()</code> 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 <emphasis>infinite</emphasis>.
+ This basically means the plugin must just ensure that
+ <emphasis role="strong">any</emphasis> data exists no matter what the age.
+ </para>
+ <para>
+ Usually once per hour, we'll call <code>refresh_metadata_async()</code> 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 <code>gs_utils_get_file_age()</code> utility helper can help you
+ work out the cache age of a file, or the plugin can handle it some other
+ way.
+ </para>
+ <para>
+ 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 <code>gs_plugin_get_updates()</code> method is called,
+ and then <code>gs_plugin_download_app()</code> may be called 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
+ <code>refresh_metadata_async()</code> and then downloads the large firmware
+ files themselves when <code>gs_plugin_download()</code> or
+ <code>gs_plugin_download_app()</code> is called.
+ </para>
+ <para>
+ Note, if the downloading fails it's okay to return <code>FALSE</code>;
+ the plugin loader continues to run all plugins and just logs an error
+ to the console. We'll be calling into <code>refresh_metadata_async()</code>
+ again in only another hour, so there's no need to bother the user.
+ For actions like <code>gs_plugin_app_install</code> 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.
+ </para>
+ <example>
+ <title>Refresh example</title>
+ <programlisting>
+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) &gt; 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 (&amp;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 (&amp;user_data);
+
+ if (!gs_download_file_finish (result, &amp;local_error)) {
+ g_task_return_error (task, g_steal_pointer (&amp;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);
+}
+ </programlisting>
+ </example>
+ </section>
+
+ <section>
+ <title>Adding Application Information Using Refine</title>
+
+ <para>
+ 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.
+ </para>
+ <example>
+ <title>Refine example</title>
+ <programlisting>
+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 &amp; GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) == 0) {
+ g_task_return_boolean (task, TRUE);
+ return;
+ }
+
+ for (guint i = 0; i &lt; 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.0+");
+ }
+
+ 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);
+}
+ </programlisting>
+ </example>
+ <para>
+ This is a simple example, but shows what a plugin needs to do.
+ It first checks if the action is required, in this case
+ <code>GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE</code>.
+ 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 <code>gs_app_list_add()</code>.
+ Think of refine as <emphasis>adding things that cost time to
+ calculate only when really required</emphasis>.
+ </para>
+ <para>
+ 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 <code>gnome-software --verbose</code> on the
+ command line will tell you why an application isn't shown along with
+ any extra data.
+ </para>
+
+ </section>
+
+ <section>
+ <title>Adopting AppStream Applications</title>
+
+ <para>
+ 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 <code>appstream</code> plugin.
+ To do this you just save an AppStream-format XML file in either
+ <filename>/usr/share/swcatalog/xml/</filename>,
+ <filename>/var/cache/swcatalog/xml/</filename> or
+ <filename>~/.local/share/swcatalog/xml/</filename>.
+ GNOME Software will immediately notice any new files, or changes to
+ existing files as it has set up the various inotify watches.
+ </para>
+ <para>
+ This allows plugins to care a lot less about how applications are
+ going to be shown.
+ For example, the <code>flatpak</code> plugin downloads AppStream data
+ for configured remotes during <code>refresh_metadata_async()</code>.
+ </para>
+ <para>
+ The only extra step a plugin providing its own apps needs to do
+ is to implement the <code>gs_plugin_adopt_app()</code> function.
+ This is called when an application does not have a management plugin
+ set, and allows the plugin to <emphasis>claim</emphasis> the
+ application for itself so it can handle installation, removal and
+ updating.
+ </para>
+ <para>
+ Another good example is the <code>fwupd</code> 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:
+ </para>
+
+ <informalexample>
+ <programlisting>
+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);
+}
+ </programlisting>
+ </informalexample>
+ </section>
+
+ <section>
+ <title>Using The Plugin Cache</title>
+
+ <para>
+ 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:
+ </para>
+ <informalexample>
+ <programlisting>
+ /* 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);
++ }
+ </programlisting>
+ </informalexample>
+ <para>
+ 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 <code>list_apps()</code>
+ 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 <emphasis>migrating</emphasis>
+ the UI widgets as the object changes and things like progress bars just
+ magically work.
+ </para>
+ <para>
+ 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 <code>gs_plugin_cache_invalidate()</code> 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.
+ </para>
+ </section>
+
+ </partintro>
+ </reference>
+
+ <reference id="api">
+ <partintro>
+ <para>
+ This documentation is auto-generated.
+ If you see any issues, please file bugs.
+ </para>
+ </partintro>
+ <title>GNOME Software Plugin API</title>
+ <xi:include href="xml/gs-app.xml"/>
+ <xi:include href="xml/gs-app-collation.xml"/>
+ <xi:include href="xml/gs-app-list.xml"/>
+ <xi:include href="xml/gs-app-query.xml"/>
+ <xi:include href="xml/gs-appstream.xml"/>
+ <xi:include href="xml/gs-category.xml"/>
+ <xi:include href="xml/gs-category-manager.xml"/>
+ <xi:include href="xml/gs-debug.xml"/>
+ <xi:include href="xml/gs-desktop-data.xml"/>
+ <xi:include href="xml/gs-download-utils.xml"/>
+ <xi:include href="xml/gs-external-appstream-utils.xml"/>
+ <xi:include href="xml/gs-fedora-third-party.xml"/>
+ <xi:include href="xml/gs-icon.xml"/>
+ <xi:include href="xml/gs-ioprio.xml"/>
+ <xi:include href="xml/gs-key-colors.xml"/>
+ <xi:include href="xml/gs-metered.xml"/>
+ <xi:include href="xml/gs-odrs-provider.xml"/>
+ <xi:include href="xml/gs-os-release.xml"/>
+ <xi:include href="xml/gs-plugin.xml"/>
+ <xi:include href="xml/gs-plugin-event.xml"/>
+ <xi:include href="xml/gs-plugin-helpers.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-apps.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-categories.xml"/>
+ <xi:include href="xml/gs-plugin-job-list-distro-upgrades.xml"/>
+ <xi:include href="xml/gs-plugin-job-refine.xml"/>
+ <xi:include href="xml/gs-plugin-job-refresh-metadata.xml"/>
+ <xi:include href="xml/gs-plugin-job.xml"/>
+ <xi:include href="xml/gs-plugin-loader-sync.xml"/>
+ <xi:include href="xml/gs-plugin-loader.xml"/>
+ <xi:include href="xml/gs-plugin-types.xml"/>
+ <xi:include href="xml/gs-plugin-vfuncs.xml"/>
+ <xi:include href="xml/gs-remote-icon.xml"/>
+ <xi:include href="xml/gs-test.xml"/>
+ <xi:include href="xml/gs-worker-thread.xml"/>
+ <xi:include href="xml/gs-utils.xml"/>
+ </reference>
+
+</book>
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 0000000..88c29e4
--- /dev/null
+++ b/doc/api/gs-example-details.png
Binary files differ
diff --git a/doc/api/gs-example-installed.png b/doc/api/gs-example-installed.png
new file mode 100644
index 0000000..0cd424a
--- /dev/null
+++ b/doc/api/gs-example-installed.png
Binary files differ
diff --git a/doc/api/gs-example-search.png b/doc/api/gs-example-search.png
new file mode 100644
index 0000000..77611bd
--- /dev/null
+++ b/doc/api/gs-example-search.png
Binary files differ
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..dad5da7
--- /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, [on the GNOME Software wiki](https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Software-metadata).
+
+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/design.svg b/doc/design.svg
new file mode 100644
index 0000000..4f9a181
--- /dev/null
+++ b/doc/design.svg
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="design.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.9899495"
+ inkscape:cx="290.74866"
+ inkscape:cy="1216.6706"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1200"
+ inkscape:window-height="1881"
+ inkscape:window-x="1600"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.51179862;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5"
+ width="115.2915"
+ height="34.988201"
+ x="179.70259"
+ y="127.36808"
+ ry="1.8272164"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5-3"
+ width="110"
+ height="210"
+ x="75"
+ y="127.36218"
+ ry="4.6491089"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <path
+ style="fill:#000000;fill-opacity:0.97695851;stroke:none"
+ d="m 295,145.69551 0,3.33334 65,0 0,3.33333 20,-5 -20,-5 0,3.33333 z"
+ id="path3757-0"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="240"
+ y="152.36218"
+ id="text3801-0"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8"
+ x="240"
+ y="152.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Plugins</tspan></text>
+ <rect
+ style="opacity:0.97154474999999996;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3900"
+ width="75"
+ height="75"
+ x="380"
+ y="92.362183"
+ ry="11.155499"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="152.36218"
+ id="text3801-0-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6"
+ x="130"
+ y="152.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">PackageKit</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5"
+ width="110"
+ height="35"
+ x="75"
+ y="162.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="187.36218"
+ id="text3801-0-7-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7"
+ x="130"
+ y="187.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">AppStream</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="222.36218"
+ id="text3801-0-7-4"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-3"
+ x="130"
+ y="222.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">glick2</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-5-4"
+ width="110"
+ height="35"
+ x="75"
+ y="232.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="257.36218"
+ id="text3801-0-7-9-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7-3"
+ x="130"
+ y="257.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">epiphany</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#cef1d7;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-5-2"
+ width="110"
+ height="35"
+ x="75"
+ y="267.36218"
+ ry="0"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="292.36218"
+ id="text3801-0-7-1"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-8"
+ x="130"
+ y="292.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">listaller</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="130"
+ y="327.36218"
+ id="text3801-0-7-9-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-6-7-2"
+ x="130"
+ y="327.36218"
+ style="font-size:18px;text-align:center;text-anchor:middle;font-weight:normal;-inkscape-font-specification:Liberation Sans;font-family:Liberation Sans;font-style:normal;font-stretch:normal;font-variant:normal">ostree</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="190"
+ y="172.36218"
+ id="text3801-0-7-9-5"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ x="190"
+ y="172.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3913">list = Search(text)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="186.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3951">list = AddInstalled()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="199.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3917">list = AddUpdates()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="213.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4121">list = AddPopular()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="227.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3947">bool = AppInstall(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="241.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3928">bool = AppUpdate(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="254.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3930">bool = AppRemove(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="268.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3934">bool = Refine(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="282.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3941">bool = SetRating(app)</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="296.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3943">list = AddCategories()</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="309.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4050">:str name</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="323.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3044">:list deps</tspan><tspan
+ sodipodi:role="line"
+ x="190"
+ y="337.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3914">:bool enabled</tspan></text>
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-6-0"
+ width="110"
+ height="35"
+ x="365"
+ y="197.36218"
+ ry="1.8278326"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <rect
+ style="opacity:0.97154475;fill:#c3cdee;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect2987-5-6"
+ width="110"
+ height="35"
+ x="360"
+ y="202.36218"
+ ry="1.8278326"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="415"
+ y="225.36218"
+ id="text3801-0-3"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ id="tspan3803-8-7"
+ x="415"
+ y="225.36218"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:PakType Naqsh;-inkscape-font-specification:PakType Naqsh">Applications</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="360"
+ y="247.36218"
+ id="text3801-0-7-9-5-7"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957"><tspan
+ sodipodi:role="line"
+ x="360"
+ y="247.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4073">:str app-id (e.g. foo.desktop)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="261.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4046">:ptr source (e.g. pkgname)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="274.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4048">:str management_plugin</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="288.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4052">:str title (localized)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="302.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4054">:str description (localized)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="316.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4056">:str screenshots</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="329.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4058">:str icon_uri</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="343.61218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4093">:int rating</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="357.36218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan4064">:int state (e.g. installed)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="371.11218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3037">:int app-kind (e.g. codec)</tspan><tspan
+ sodipodi:role="line"
+ x="360"
+ y="384.86218"
+ style="font-size:11px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Nimbus Mono L;-inkscape-font-specification:Nimbus Mono L"
+ id="tspan3959">:int install_date</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0.97695851;stroke:none"
+ d="m 405,167.36218 -5,0 0.37902,15.83248 -3.33333,0 5,20 5,-20 -3.33333,0 z"
+ id="path3757-0-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:export-filename="/home/hughsie/Code/gnome3/gnome-software/design.png"
+ inkscape:export-xdpi="120.03957"
+ inkscape:export-ydpi="120.03957" />
+ <image
+ y="96.362183"
+ x="385"
+ id="image3134"
+ xlink:href="file:///home/hughsie/Code/gnome3/gnome-software/data/icons/256x256/gnome-software.png"
+ height="66"
+ width="66" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3137"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Abyssinica SIL;font-style:normal;font-weight:normal;font-size:8px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Abyssinica SIL;font-stretch:normal;font-variant:normal"><flowRegion
+ id="flowRegion3139"><rect
+ id="rect3141"
+ width="118.69292"
+ height="96.469566"
+ x="349.00769"
+ y="375.0549" /></flowRegion><flowPara
+ id="flowPara3143"></flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/kudos.md b/doc/kudos.md
new file mode 100644
index 0000000..f43aa51
--- /dev/null
+++ b/doc/kudos.md
@@ -0,0 +1,70 @@
+Kudos used in Software
+======================
+
+As part of the AppStream generation process we explode various parts of the
+distro binary package and try to build metadata by merging various sources
+together, for example AppData, desktop files and icons.
+
+As part of this we also have access to the finished binary and libraries, and
+so can also run tools on them to get a metric of awesomeness. So far, the
+metrics of awesomeness (here-on known as "kudos") are:
+
+ * `HiDpiIcon` — installs a 128x128 or larger application icon
+ * `HighContrast` — uses hicontrast or scalable icons for visually impaired users
+ * `ModernToolkit` — uses a modern toolkit like Gtk-3 or QT-5
+ * `Notifications` — registers desktop notifications
+ * `SearchProvider` — provides a search provider for GNOME Shell or KDE Plasma
+ * `UserDocs` — provides user documentation
+
+These attempt to define how tightly the application is integrated with the
+platform, which is usually a pretty good metric of awesomeness. Of course,
+some applications like Blender are an island in terms of integration, but of
+course are awesome.
+
+There are some other "run-time" kudos used as well. These are not encoded by
+the builder as they require some user information or are too specific to
+GNOME Software. These include:
+
+ * `FeaturedRecommended` — One of the design team chose to feature this
+ * `HasKeywords` — there are keywords in the desktop file used for searching
+ * `HasScreenshots` — more than one screenshot is supplied
+ * `MyLanguage` — has a populated translation in my locale, or a locale fallback
+ * `PerfectScreenshots` — screenshots are perfectly sized, in 16:9 aspect
+ * `Popular` — lots of people have downloaded this (only available on Fedora)
+ * `RecentRelease` — there been an upstream release in the last year
+
+You can verify the kudos your application is getting by doing something like:
+
+ killall gnome-software
+ gnome-software --verbose
+
+and then navigating to the details for an application you'll see on the console:
+
+ id-kind: desktop
+ state: available
+ id: blender.desktop
+ kudo: recent-release
+ kudo: featured-recommended
+ kudo: has-screenshots
+ kudo: popular
+
+Manually Adding Kudos
+---------------------
+
+If the AppStream generator fails to detect a specific kudo then you can add them
+manually in the AppData file and they will be used in the AppStream metadata.
+To do this, just add something like:
+
+ <kudos>
+ <kudo>ModernToolkit</kudo>
+ <kudo>UserDocs</kudo>
+ </kudos>
+
+Although, please bear in mind any application that is found cheating, i.e.
+adding kudos artificially will have **all** the kudos manually removed
+with a blocklist rule in the AppStream builder.
+
+If you are a vendor, or a system distributor and just want to increase the
+number of kudos for your pet proprietary application that's essential to
+business function, a good kudo to manually add would be `FeaturedRecommended`,
+or `GnomeSoftware::popular`.
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 @@
+<html>
+<head>
+ <title>GNOME Software Privacy Policy</title>
+</head>
+<body>
+ <h1>Policy</h1>
+ <p>
+ 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.
+ </p>
+ <p>
+ 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.
+ </p>
+ <p>
+ 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.
+ </p>
+ <h1>History of Changes</h1>
+ <p>
+ Modified 2014-02-04 by Richard Hughes
+ </p>
+</html>
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..8866910
--- /dev/null
+++ b/doc/vendor-customisation.md
@@ -0,0 +1,214 @@
+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/new)
+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/new?issue%5Bmilestone_id%5D=)
+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:
+ * 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 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.
+
+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 applications in GNOME
+Software. On the overview page, there’s a carousel of featured applications
+(`featured_carousel`), and an “Editor’s Choice” section (`box_curated`). Both of
+them highlight curated sets of applications. The same is true on each category
+page: a carousel (`top_carousel`) and an “Editor’s Choice” section
+(`featured_flow_box`) are present.
+
+Both pages also have a “New & Updated” section (`box_recent` or
+`recently_updated_flow_box`) presented below “Editor’s Choice”. The applications
+listed in the new and updated section are not curated: they are chosen as the
+applications 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.
+
+Applications 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 overview page: Applications 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 applications 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 overview page: Applications 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: Applications 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 applications shown in the carousel
+ is randomised and limited to (for example) 5.
+ * “Editor’s Choice” on the category page: Applications are included if they
+ meet the requirements for being in the carousel, but weren’t chosen as part
+ of the randomisation process.
+
+Example:
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<components>
+ <component merge="append">
+ <!-- The ID must always be present to allow merging -->
+ <id>org.gnome.Podcasts</id>
+
+ <!-- Make the app a candidate for inclusion in the carousel on the
+ overview page (if it has a hi-res icon). -->
+ <custom>
+ <value key="GnomeSoftware::FeatureTile">True</value>
+ </custom>
+
+ <!-- Include the app in the “Editor’s Choice” section on the overview page. -->
+ <kudos>
+ <kudo>GnomeSoftware::popular</kudo>
+ </kudos>
+
+ <!-- Make the app a candidate for inclusion in the carousel or
+ “Editor’s Choice” section on category pages (if it has a hi-res icon). -->
+ <categories>
+ <!-- Note that, due to a bug (https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1649),
+ currently all the other categories for the app must also be listed
+ here, as well as the additional ‘Featured’ category. -->
+ <category>AudioVideo</category>
+ <category>Player</category>
+ <!-- This category has been added: -->
+ <category>Featured</category>
+ </categories>
+ </component>
+ <!-- more components -->
+</components>
+```
+
+There are several ways to modify the metainfo for applications so that they are
+highlighted as required, all of which involve providing an additional appstream
+file which sets the additional metainfo for those applications.
+
+The main approach is to ship an additional distro-specific appstream file in
+`${DATADIR}/swcatalog/xml`, providing and updating it via normal distribution
+channels. For example, by packaging it in its own package which is updated
+regularly.
+
+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.
+
+GNOME Software ships a default list of featured applications, 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 applications. See
+`data/assets/org.gnome.Software.Curated.xml` for a default hard-coded list of
+curated high quality applications, which is displayed in the “Editor’s Choice”
+section of the overview page.
+
+Pass `-Ddefault_featured_apps=false` when configuring GNOME Software to disable
+the default list of featured applications. Pass `-Dhardcoded_curated=false` to
+disable the default list of “Editor’s Choice” applications.
+
+Deployment Featured Apps
+------------------------
+
+Deployments can feature their own applications, 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. 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..a277963
--- /dev/null
+++ b/gnome-software.doap
@@ -0,0 +1,54 @@
+<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:gnome="http://api.gnome.org/doap-extensions#"
+ xmlns="http://usefulinc.com/ns/doap#">
+
+ <name xml:lang="en">gnome-software</name>
+ <shortdesc xml:lang="en">GNOME Software Tools</shortdesc>
+ <category rdf:resource="http://api.gnome.org/doap-extensions#apps" />
+ <programming-language>C</programming-language>
+ <description xml:lang="en">
+ GNOME Software is for installing, removing and updating software.
+ </description>
+
+ <homepage rdf:resource="https://wiki.gnome.org/Apps/Software" />
+ <download-page rdf:resource="https://download.gnome.org/sources/gnome-software/" />
+ <bug-database rdf:resource="https://gitlab.gnome.org/GNOME/gnome-software/issues" />
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Milan Crha</foaf:name>
+ <foaf:mbox rdf:resource="mailto:mcrha@redhat.com" />
+ <gnome:userid>mcrha</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Phaedrus Leeds</foaf:name>
+ <foaf:mbox rdf:resource="mailto:mwleeds@endlessos.org" />
+ <gnome:userid>mwleeds</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Philip Withnall</foaf:name>
+ <foaf:mbox rdf:resource="mailto:pwithnall@endlessos.org" />
+ <gnome:userid>pwithnall</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <maintainer>
+ <foaf:Person>
+ <foaf:name>Richard Hughes</foaf:name>
+ <foaf:mbox rdf:resource="mailto:richard@hughsie.com" />
+ <foaf:homepage rdf:resource="http://www.hughsie.com/" />
+ <gnome:userid>rhughes</gnome:userid>
+ </foaf:Person>
+ </maintainer>
+
+ <license rdf:resource="http://www.gnu.org/licenses/gpl-2.0.txt" />
+
+</Project>
diff --git a/gs-install-appstream/gs-install-appstream.c b/gs-install-appstream/gs-install-appstream.c
new file mode 100644
index 0000000..fd17584
--- /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 <richard@hughsie.com>
+ *
+ * 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 <errno.h>
+#include <locale.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <xmlb.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
+#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 applications 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/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..1e3addf
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <gnome-software.h>
+
+#include <gs-app-list-private.h>
+#include <gs-app-private.h>
+#include <gs-category-private.h>
+#include <gs-fedora-third-party.h>
+#include <gs-os-release.h>
+#include <gs-plugin-loader.h>
+#include <gs-plugin-loader-sync.h>
+#include <gs-plugin-private.h>
diff --git a/lib/gnome-software.h b/lib/gnome-software.h
new file mode 100644
index 0000000..b57e257
--- /dev/null
+++ b/lib/gnome-software.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) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <gs-app.h>
+#include <gs-app-list.h>
+#include <gs-app-collation.h>
+#include <gs-app-permissions.h>
+#include <gs-app-query.h>
+#include <gs-category.h>
+#include <gs-category-manager.h>
+#include <gs-desktop-data.h>
+#include <gs-download-utils.h>
+#include <gs-enums.h>
+#include <gs-icon.h>
+#include <gs-metered.h>
+#include <gs-odrs-provider.h>
+#include <gs-os-release.h>
+#include <gs-plugin.h>
+#include <gs-plugin-helpers.h>
+#include <gs-plugin-job.h>
+#include <gs-plugin-job-list-apps.h>
+#include <gs-plugin-job-list-categories.h>
+#include <gs-plugin-job-list-distro-upgrades.h>
+#include <gs-plugin-job-manage-repository.h>
+#include <gs-plugin-job-refine.h>
+#include <gs-plugin-job-refresh-metadata.h>
+#include <gs-plugin-vfuncs.h>
+#include <gs-remote-icon.h>
+#include <gs-utils.h>
+#include <gs-worker-thread.h>
diff --git a/lib/gs-app-collation.h b/lib/gs-app-collation.h
new file mode 100644
index 0000000..876ae54
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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..5335173
--- /dev/null
+++ b/lib/gs-app-list-private.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) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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_remove_all (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..a5f6785
--- /dev/null
+++ b/lib/gs-app-list.c
@@ -0,0 +1,1025 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+
+#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_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) {
+ if (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);
+ continue;
+ }
+ continue;
+ }
+ continue;
+ }
+
+ /* 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..adf85f7
--- /dev/null
+++ b/lib/gs-app-list.h
@@ -0,0 +1,89 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#include "gs-app.h"
+
+G_BEGIN_DECLS
+
+/**
+ * GsAppListFilterFlags:
+ * @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);
+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..bbae07c
--- /dev/null
+++ b/lib/gs-app-permissions.c
@@ -0,0 +1,430 @@
+/* -*- 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+
+ */
+
+/**
+ * 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 <stdlib.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#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 utf-8) */
+ GPtrArray *filesystem_full; /* (owner) (nullable) (element-type utf-8) */
+};
+
+G_DEFINE_TYPE (GsAppPermissions, gs_app_permissions, G_TYPE_OBJECT)
+
+static gint
+cmp_filename_qsort (gconstpointer item1,
+ gconstpointer item2)
+{
+ const gchar * const *pitem1 = item1;
+ const gchar * const *pitem2 = item2;
+ return strcmp (*pitem1, *pitem2);
+}
+
+static gint
+cmp_filename_bsearch (gconstpointer item1,
+ gconstpointer item2)
+{
+ return strcmp (item1, item2);
+}
+
+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_qsort);
+
+ if (self->filesystem_full)
+ qsort (self->filesystem_full->pdata, self->filesystem_full->len, sizeof (gpointer), cmp_filename_qsort);
+}
+
+/**
+ * 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_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_UNKNOWN);
+
+ 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 contain
+ * #GS_APP_PERMISSIONS_FLAGS_NONE, neither cannot be #GS_APP_PERMISSIONS_FLAGS_UNKNOWN.
+ * To set these two 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_UNKNOWN);
+ g_return_if_fail ((flags & GS_APP_PERMISSIONS_FLAGS_NONE) == 0);
+
+ g_assert (!self->is_sealed);
+
+ self->flags = (self->flags & (~GS_APP_PERMISSIONS_FLAGS_NONE)) | 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 contain
+ * #GS_APP_PERMISSIONS_FLAGS_NONE, neither cannot be #GS_APP_PERMISSIONS_FLAGS_UNKNOWN.
+ * To set these two 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_UNKNOWN);
+ g_return_if_fail ((flags & GS_APP_PERMISSIONS_FLAGS_NONE) == 0);
+
+ g_assert (!self->is_sealed);
+
+ self->flags = (self->flags & (~flags));
+
+ if (!self->flags)
+ self->flags = GS_APP_PERMISSIONS_FLAGS_NONE;
+}
+
+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 utf-8): 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_bsearch) != 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 utf-8): 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..96c482b
--- /dev/null
+++ b/lib/gs-app-permissions.h
@@ -0,0 +1,74 @@
+/* -*- 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+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+ GS_APP_PERMISSIONS_FLAGS_UNKNOWN = 0,
+ GS_APP_PERMISSIONS_FLAGS_NONE = 1 << 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_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)
+
+#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);
+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..1163bf3
--- /dev/null
+++ b/lib/gs-app-private.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 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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);
+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);
+
+G_END_DECLS
diff --git a/lib/gs-app-query.c b/lib/gs-app-query.c
new file mode 100644
index 0000000..cd2fc93
--- /dev/null
+++ b/lib/gs-app-query.c
@@ -0,0 +1,1173 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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;
+};
+
+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,
+} GsAppQueryProperty;
+
+static GParamSpec *props[PROP_PROVIDES_TYPE + 1] = { 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;
+ 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 = g_value_dup_boxed (value);
+
+ /* Squash empty arrays to %NULL. */
+ if (self->keywords != NULL && self->keywords[0] == NULL)
+ g_clear_pointer (&self->keywords, g_strfreev);
+
+ 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;
+ 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);
+
+ 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->provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN;
+}
+
+/**
+ * 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).
+ *
+ * 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++;
+
+ 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;
+}
diff --git a/lib/gs-app-query.h b/lib/gs-app-query.h
new file mode 100644
index 0000000..b66c56e
--- /dev/null
+++ b/lib/gs-app-query.h
@@ -0,0 +1,108 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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;
+
+#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);
+
+G_END_DECLS
diff --git a/lib/gs-app.c b/lib/gs-app.c
new file mode 100644
index 0000000..51215c7
--- /dev/null
+++ b/lib/gs-app.c
@@ -0,0 +1,6714 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <string.h>
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#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;
+ 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;
+} 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,
+} GsAppProperty;
+
+static GParamSpec *obj_props[PROP_HAS_TRANSLATIONS + 1] = { NULL, };
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsApp, gs_app, G_TYPE_OBJECT)
+
+static gboolean
+_g_set_str (gchar **str_ptr, const gchar *new_str)
+{
+ if (*str_ptr == new_str || g_strcmp0 (*str_ptr, new_str) == 0)
+ return FALSE;
+ g_free (*str_ptr);
+ *str_ptr = g_strdup (new_str);
+ return TRUE;
+}
+
+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";
+ 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_REMOVABLE_HARDWARE:
+ return "removable-hardware";
+ 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 ();
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+ if ((kudos & GS_APP_KUDO_MY_LANGUAGE) > 0)
+ g_ptr_array_add (array, "my-language");
+ if ((kudos & GS_APP_KUDO_RECENT_RELEASE) > 0)
+ g_ptr_array_add (array, "recent-release");
+ if ((kudos & GS_APP_KUDO_FEATURED_RECOMMENDED) > 0)
+ g_ptr_array_add (array, "featured-recommended");
+ if ((kudos & GS_APP_KUDO_MODERN_TOOLKIT) > 0)
+ g_ptr_array_add (array, "modern-toolkit");
+ if ((kudos & GS_APP_KUDO_SEARCH_PROVIDER) > 0)
+ g_ptr_array_add (array, "search-provider");
+ if ((kudos & GS_APP_KUDO_INSTALLS_USER_DOCS) > 0)
+ g_ptr_array_add (array, "installs-user-docs");
+ if ((kudos & GS_APP_KUDO_USES_NOTIFICATIONS) > 0)
+ g_ptr_array_add (array, "uses-notifications");
+ if ((kudos & GS_APP_KUDO_HAS_KEYWORDS) > 0)
+ g_ptr_array_add (array, "has-keywords");
+ if ((kudos & GS_APP_KUDO_HAS_SCREENSHOTS) > 0)
+ g_ptr_array_add (array, "has-screenshots");
+ if ((kudos & GS_APP_KUDO_HIGH_CONTRAST) > 0)
+ g_ptr_array_add (array, "high-contrast");
+ if ((kudos & GS_APP_KUDO_HI_DPI_ICON) > 0)
+ g_ptr_array_add (array, "hi-dpi-icon");
+ if ((kudos & GS_APP_KUDO_SANDBOXED) > 0)
+ g_ptr_array_add (array, "sandboxed");
+ if ((kudos & GS_APP_KUDO_SANDBOXED_SECURE) > 0)
+ g_ptr_array_add (array, "sandboxed-secure");
+#pragma GCC diagnostic pop
+ 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);
+ im = as_screenshot_get_image (ss, 0, 0);
+ 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 : "<none>");
+ }
+ 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);
+ }
+ 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);
+ gboolean state_change_ok = FALSE;
+
+ /* same */
+ if (priv->state == state)
+ return FALSE;
+
+ /* check the state change is allowed */
+ switch (priv->state) {
+ case GS_APP_STATE_UNKNOWN:
+ /* unknown has to go into one of the stable states */
+ if (state == GS_APP_STATE_INSTALLED ||
+ state == GS_APP_STATE_QUEUED_FOR_INSTALL ||
+ state == GS_APP_STATE_AVAILABLE ||
+ state == GS_APP_STATE_AVAILABLE_LOCAL ||
+ state == GS_APP_STATE_UPDATABLE ||
+ state == GS_APP_STATE_UPDATABLE_LIVE ||
+ state == GS_APP_STATE_UNAVAILABLE ||
+ state == GS_APP_STATE_PENDING_INSTALL ||
+ state == GS_APP_STATE_PENDING_REMOVE)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_INSTALLED:
+ /* installed has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_REMOVING ||
+ state == GS_APP_STATE_UNAVAILABLE ||
+ state == GS_APP_STATE_UPDATABLE ||
+ state == GS_APP_STATE_UPDATABLE_LIVE)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_INSTALLING ||
+ state == GS_APP_STATE_AVAILABLE)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_AVAILABLE:
+ /* available has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_QUEUED_FOR_INSTALL ||
+ state == GS_APP_STATE_INSTALLING)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_INSTALLING:
+ /* installing has to go into an stable state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_INSTALLED ||
+ state == GS_APP_STATE_UPDATABLE ||
+ state == GS_APP_STATE_UPDATABLE_LIVE ||
+ state == GS_APP_STATE_AVAILABLE ||
+ state == GS_APP_STATE_PENDING_INSTALL)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_REMOVING:
+ /* removing has to go into an stable state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_UNAVAILABLE ||
+ state == GS_APP_STATE_AVAILABLE ||
+ state == GS_APP_STATE_INSTALLED ||
+ state == GS_APP_STATE_PENDING_REMOVE)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_UPDATABLE:
+ /* updatable has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_REMOVING ||
+ state == GS_APP_STATE_INSTALLING)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_UPDATABLE_LIVE:
+ /* updatable-live has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_REMOVING ||
+ state == GS_APP_STATE_INSTALLING)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_UNAVAILABLE:
+ /* updatable has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_AVAILABLE)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_AVAILABLE_LOCAL:
+ /* local has to go into an action state */
+ if (state == GS_APP_STATE_UNKNOWN ||
+ state == GS_APP_STATE_QUEUED_FOR_INSTALL ||
+ state == GS_APP_STATE_INSTALLING)
+ state_change_ok = TRUE;
+ break;
+ case GS_APP_STATE_PENDING_INSTALL:
+ case GS_APP_STATE_PENDING_REMOVE:
+ state_change_ok = TRUE;
+ break;
+ default:
+ g_warning ("state %s unhandled",
+ gs_app_state_to_string (priv->state));
+ g_assert_not_reached ();
+ }
+
+ /* this state change was unexpected */
+ if (!state_change_ok) {
+ g_warning ("State change on %s (%s) from %s to %s is not OK",
+ gs_app_get_unique_id_unlocked (app),
+ priv->name,
+ gs_app_state_to_string (priv->state),
+ gs_app_state_to_string (state));
+ }
+
+ 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_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 "&lt;scope&gt;/&lt;kind&gt;/&lt;origin&gt;/&lt;id&gt;/&lt;branch&gt;". 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);
+}
+
+/**
+ * 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_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);
+
+ /* See if there’s an icon 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_height = gs_icon_get_height (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);
+
+ /* Appstream only guarantees the 64x64@1 cached icon is present, ignore other icons that aren't installed. */
+ if (G_IS_FILE_ICON (icon) && !(icon_width == 64 && icon_height == 64 && icon_scale == 1)) {
+ 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);
+ }
+
+ g_debug ("Found no icons of the right size; checking themed icons");
+
+ /* If there’s a themed icon with no width set, use that, as typically
+ * themed icons are available in all the right sizes. */
+ 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))
+ return g_object_ref (icon);
+ }
+
+ 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
+ **/
+GPtrArray *
+gs_app_get_icons (GsApp *app)
+{
+ GsAppPrivate *priv = gs_app_get_instance_private (app);
+ g_return_val_if_fail (GS_IS_APP (app), NULL);
+
+ if (priv->icons != NULL && priv->icons->len == 0)
+ return NULL;
+
+ return priv->icons;
+}
+
+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);
+
+ 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. "<p>Foobar</p>"
+ *
+ * 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: a web URL, e.g. "http://www.hughsie.com/"
+ *
+ * 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;
+ 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);
+
+ g_hash_table_insert (priv->urls,
+ GINT_TO_POINTER (kind),
+ g_strdup (url));
+
+ 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, &current_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+"
+ *
+ * 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)
+ 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: 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: 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);
+ _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);
+ 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_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);
+ }
+ 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
+ **/
+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
+ **/
+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:
+ * |[
+ * <component>
+ * <custom>
+ * <value key="GnomeSoftware::key-colors">[(124, 53, 77), (99, 16, 0)]</value>
+ * </custom>
+ * </component>
+ * ]|
+ */
+ 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 = NULL;
+ GdkDisplay *display;
+
+ 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);
+
+ }
+ }
+
+ 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 {
+ g_autoptr(GskRenderNode) render_node = NULL;
+ g_autoptr(GtkSnapshot) snapshot = NULL;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 32, 32);
+ cr = cairo_create (surface);
+
+ /* TODO: this can be done entirely on the GPU using shaders */
+ snapshot = gtk_snapshot_new ();
+ gdk_paintable_snapshot (GDK_PAINTABLE (icon_paintable),
+ GDK_SNAPSHOT (snapshot),
+ 32.0,
+ 32.0);
+
+ render_node = gtk_snapshot_free_to_node (g_steal_pointer (&snapshot));
+ gsk_render_node_draw (render_node, cr);
+
+ pb_small = gdk_pixbuf_get_from_surface (surface, 0, 0, 32, 32);
+
+ cairo_surface_destroy (surface);
+ cairo_destroy (cr);
+ }
+ }
+
+ } 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_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_MODERN_TOOLKIT) > 0)
+ percentage += 20;
+ if ((priv->kudos & GS_APP_KUDO_SEARCH_PROVIDER) > 0)
+ percentage += 10;
+ if ((priv->kudos & GS_APP_KUDO_INSTALLS_USER_DOCS) > 0)
+ percentage += 10;
+ if ((priv->kudos & GS_APP_KUDO_USES_NOTIFICATIONS) > 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_HIGH_CONTRAST) > 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_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;
+ 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:
+ gs_app_set_is_update_downloaded (app, g_value_get_boolean (value));
+ 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;
+ 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:
+ */
+ obj_props[PROP_IS_UPDATE_DOWNLOADED] = g_param_spec_boolean ("is-update-downloaded", NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ /**
+ * 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);
+
+ 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_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
+ * @cancellable: (nullable): optional #GCancellable object
+ *
+ * Ensure all remote icons in the @app's icons are locally cached.
+ *
+ * Since: 41
+ **/
+void
+gs_app_ensure_icons_downloaded (GsApp *app,
+ SoupSession *soup_session,
+ guint maximum_icon_size,
+ 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,
+ 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;
+}
diff --git a/lib/gs-app.h b/lib/gs-app.h
new file mode 100644
index 0000000..5240b2e
--- /dev/null
+++ b/lib/gs-app.h
@@ -0,0 +1,524 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <libsoup/soup.h>
+#include <appstream.h>
+
+#include <gs-app-permissions.h>
+
+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
+ *
+ * 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_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_MODERN_TOOLKIT: Uses a modern toolkit
+ * @GS_APP_KUDO_SEARCH_PROVIDER: Provides a search provider
+ * @GS_APP_KUDO_INSTALLS_USER_DOCS: Installs user docs
+ * @GS_APP_KUDO_USES_NOTIFICATIONS: Registers notifications
+ * @GS_APP_KUDO_HAS_KEYWORDS: Has at least 1 keyword
+ * @GS_APP_KUDO_HAS_SCREENSHOTS: Supplies screenshots
+ * @GS_APP_KUDO_HIGH_CONTRAST: Installs a high contrast icon
+ * @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_MODERN_TOOLKIT = 1 << 3,
+ GS_APP_KUDO_SEARCH_PROVIDER = 1 << 4,
+ GS_APP_KUDO_INSTALLS_USER_DOCS = 1 << 5,
+ GS_APP_KUDO_USES_NOTIFICATIONS = 1 << 6,
+ GS_APP_KUDO_HAS_KEYWORDS = 1 << 7,
+ GS_APP_KUDO_HAS_SCREENSHOTS = 1 << 9,
+ GS_APP_KUDO_HIGH_CONTRAST = 1 << 13,
+ 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_REMOVABLE_HARDWARE: 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_REMOVABLE_HARDWARE = 1 << 10, /* Since: 3.32 */
+ 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;
+
+/**
+ * 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);
+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);
+GPtrArray *gs_app_get_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_is_update_downloaded (GsApp *app,
+ gboolean is_update_downloaded);
+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,
+ 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);
+
+G_END_DECLS
diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
new file mode 100644
index 0000000..fa94a6e
--- /dev/null
+++ b/lib/gs-appstream.c
@@ -0,0 +1,2165 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2018-2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <gnome-software.h>
+#include <locale.h>
+
+#include "gs-appstream.h"
+
+#define GS_APPSTREAM_MAX_SCREENSHOTS 5
+
+GsApp *
+gs_appstream_create_app (GsPlugin *plugin, XbSilo *silo, XbNode *component, 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,
+ 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);
+ 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 = "<i>";
+ end_elem = "</i>";
+ } else if (g_strcmp0 (xb_node_get_element (n), "code") == 0) {
+ start_elem = "<tt>";
+ end_elem = "</tt>";
+ }
+
+ /* 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 gchar *
+gs_appstream_format_description (XbNode *root, GError **error)
+{
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ for (g_autoptr(XbNode) n = xb_node_get_child (root); n != NULL; node_set_to_next (&n)) {
+ /* support <p>, <em>, <code>, <ul>, <ol> and <li>, 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 (`<p/>`) 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(GPtrArray) children = xb_node_get_children (n);
+
+ for (guint i = 0; i < children->len; i++) {
+ XbNode *nc = g_ptr_array_index (children, i);
+ if (g_strcmp0 (xb_node_get_element (nc), "li") == 0) {
+ g_autofree gchar *escaped = gs_appstream_format_description_text (nc);
+
+ /* Treat a self-closing `<li/>` as an empty
+ * list element (equivalent to `<li></li>`).
+ * 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(GPtrArray) children = xb_node_get_children (n);
+ for (guint i = 0; i < children->len; i++) {
+ XbNode *nc = g_ptr_array_index (children, i);
+ if (g_strcmp0 (xb_node_get_element (nc), "li") == 0) {
+ g_autofree gchar *escaped = gs_appstream_format_description_text (nc);
+
+ /* Treat self-closing elements as with `<ul>` 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);
+
+ /* 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;
+ 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);
+ }
+
+ 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
+app_add_icon (GsApp *app,
+ AsIcon *as_icon)
+{
+ g_autoptr(GIcon) icon = gs_icon_new_for_appstream_icon (as_icon);
+ if (icon != NULL)
+ gs_app_add_icon (app, icon);
+}
+
+static void
+traverse_component_icons (GsApp *app,
+ XbNode *component,
+ GPtrArray *icons)
+{
+ if (!icons)
+ return;
+
+ /* 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. */
+ for (guint i = 0; i < icons->len; i++) {
+ XbNode *icon_node = g_ptr_array_index (icons, i);
+ g_autoptr(AsIcon) icon = NULL;
+ const gchar *icon_kind_str = xb_node_get_attr (icon_node, "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;
+ }
+
+ icon = gs_appstream_new_icon (component, icon_node, icon_kind, 0);
+ app_add_icon (app, icon);
+ }
+}
+
+static void
+traverse_components_xpath_for_icons (GsApp *app,
+ XbSilo *silo,
+ const gchar *xpath,
+ gboolean try_with_launchable)
+{
+ g_autoptr(GPtrArray) components = NULL;
+ g_autoptr(GError) local_error = NULL;
+
+ components = xb_silo_query (silo, xpath, 0, &local_error);
+ if (components) {
+ for (guint i = 0; i < components->len; i++) {
+ g_autoptr(GPtrArray) icons = NULL; /* (element-type XbNode) */
+ XbNode *component = g_ptr_array_index (components, i);
+ g_autofree gchar *xml = xb_node_export (component, 0, NULL);
+ icons = xb_node_query (component, "icon", 0, NULL);
+ traverse_component_icons (app, component, icons);
+
+ if (try_with_launchable && gs_app_get_icons (app) == NULL) {
+ const gchar *launchable_id = xb_node_query_text (component, "launchable[@type='desktop-id']", NULL);
+ if (launchable_id != NULL) {
+ g_autofree gchar *xpath2 = NULL;
+
+ /* Inherit the icon from the .desktop file */
+ xpath2 = g_strdup_printf ("/component[@type='desktop-application']/launchable[@type='desktop-id'][text()='%s']/..",
+ launchable_id);
+ traverse_components_xpath_for_icons (app, silo, xpath2, FALSE);
+ }
+ }
+ }
+ }
+}
+
+static void
+gs_appstream_refine_icon (GsApp *app,
+ XbSilo *silo,
+ XbNode *component)
+{
+ g_autoptr(GError) local_error = NULL;
+ g_autoptr(GPtrArray) icons = NULL; /* (element-type XbNode) */
+
+ icons = xb_node_query (component, "icon", 0, &local_error);
+ traverse_component_icons (app, component, icons);
+ g_clear_pointer (&icons, g_ptr_array_unref);
+
+ /* If no icon found, try to inherit the icon from the .desktop file */
+ if (gs_app_get_icons (app) == NULL) {
+ g_autofree gchar *xpath = NULL;
+ const gchar *launchable_id = xb_node_query_text (component, "launchable[@type='desktop-id']", NULL);
+ if (launchable_id != NULL) {
+ xpath = g_strdup_printf ("/component[@type='desktop-application']/launchable[@type='desktop-id'][text()='%s']/..",
+ launchable_id);
+ traverse_components_xpath_for_icons (app, silo, xpath, FALSE);
+ g_clear_pointer (&xpath, g_free);
+ }
+
+ xpath = g_strdup_printf ("/component[@type='desktop-application']/launchable[@type='desktop-id'][text()='%s']/..",
+ gs_app_get_id (app));
+ traverse_components_xpath_for_icons (app, silo, xpath, FALSE);
+ }
+}
+
+static gboolean
+gs_appstream_refine_add_addons (GsPlugin *plugin,
+ GsApp *app,
+ XbSilo *silo,
+ GError **error)
+{
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) addons = NULL;
+ g_autoptr(GsAppList) addons_list = NULL;
+
+ /* get all components */
+ xpath = g_strdup_printf ("components/component/extends[text()='%s']/..",
+ gs_app_get_id (app));
+ 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, 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 gboolean
+gs_appstream_refine_add_images (GsApp *app,
+ AsScreenshot *ss,
+ XbNode *screenshot,
+ gboolean *out_any_added,
+ GError **error)
+{
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) images = NULL;
+
+ /* get all components */
+ images = xb_node_query (screenshot, "image", 0, &error_local);
+ if (images == 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 < images->len; i++) {
+ XbNode *image = g_ptr_array_index (images, i);
+ g_autoptr(AsImage) im = as_image_new ();
+ as_image_set_height (im, xb_node_get_attr_as_uint (image, "height"));
+ as_image_set_width (im, xb_node_get_attr_as_uint (image, "width"));
+ as_image_set_kind (im, as_image_kind_from_string (xb_node_get_attr (image, "type")));
+ as_image_set_url (im, xb_node_get_text (image));
+ as_screenshot_add_image (ss, im);
+ }
+
+ *out_any_added = *out_any_added || images->len > 0;
+
+ /* success */
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_add_videos (GsApp *app,
+ AsScreenshot *ss,
+ XbNode *screenshot,
+ gboolean *out_any_added,
+ GError **error)
+{
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) videos = NULL;
+
+ videos = xb_node_query (screenshot, "video", 0, &error_local);
+ if (videos == 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 < videos->len; i++) {
+ XbNode *video = g_ptr_array_index (videos, i);
+ g_autoptr(AsVideo) vid = as_video_new ();
+ as_video_set_height (vid, xb_node_get_attr_as_uint (video, "height"));
+ as_video_set_width (vid, xb_node_get_attr_as_uint (video, "width"));
+ as_video_set_codec_kind (vid, as_video_codec_kind_from_string (xb_node_get_attr (video, "codec")));
+ as_video_set_container_kind (vid, as_video_container_kind_from_string (xb_node_get_attr (video, "container")));
+ as_video_set_url (vid, xb_node_get_text (video));
+ as_screenshot_add_video (ss, vid);
+ }
+
+ *out_any_added = *out_any_added || videos->len > 0;
+
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_add_screenshots (GsApp *app, XbNode *component, GError **error)
+{
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) screenshots = NULL;
+
+ /* get all components */
+ screenshots = xb_node_query (component, "screenshots/screenshot", 0, &error_local);
+ if (screenshots == 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 < screenshots->len; i++) {
+ XbNode *screenshot = g_ptr_array_index (screenshots, i);
+ g_autoptr(AsScreenshot) ss = as_screenshot_new ();
+ gboolean any_added = FALSE;
+ if (!gs_appstream_refine_add_images (app, ss, screenshot, &any_added, error) ||
+ !gs_appstream_refine_add_videos (app, ss, screenshot, &any_added, error))
+ return FALSE;
+ if (any_added)
+ gs_app_add_screenshot (app, ss);
+ }
+
+ /* FIXME: move into no refine flags section? */
+ if (screenshots ->len > 0)
+ gs_app_add_kudo (app, GS_APP_KUDO_HAS_SCREENSHOTS);
+
+ /* success */
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_add_provides (GsApp *app, XbNode *component, GError **error)
+{
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) provides = NULL;
+
+ /* get all components */
+ provides = xb_node_query (component, "provides/*", 0, &error_local);
+ if (provides == 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 < provides->len; i++) {
+ AsProvidedKind kind;
+ const gchar *element_name;
+ XbNode *provide = g_ptr_array_index (provides, i);
+ element_name = xb_node_get_element (provide);
+
+ /* 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 (provide, "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, "python2") == 0) {
+ kind = AS_PROVIDED_KIND_PYTHON_2;
+ } 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 (provide, "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 (provide) == NULL) {
+ /* give up */
+ g_warning ("ignoring unknown or empty provided item type: %s", element_name);
+ continue;
+ }
+
+ gs_app_add_provided_item (app,
+ kind,
+ xb_node_get_text (provide));
+ }
+
+ /* success */
+ 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;
+}
+
+static gboolean
+gs_appstream_refine_app_updates (GsApp *app,
+ XbSilo *silo,
+ XbNode *component,
+ GError **error)
+{
+ AsUrgencyKind urgency_best = AS_URGENCY_KIND_UNKNOWN;
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GHashTable) installed = g_hash_table_new (g_str_hash, g_str_equal);
+ g_autoptr(GPtrArray) releases_inst = NULL;
+ g_autoptr(GPtrArray) releases = NULL;
+ g_autoptr(GPtrArray) updates_list = g_ptr_array_new ();
+
+ /* only for UPDATABLE apps */
+ if (!gs_app_is_updatable (app))
+ return TRUE;
+
+ /* 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, &error_local);
+ if (releases_inst == NULL) {
+ if (!g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ return FALSE;
+ }
+ } else {
+ for (guint 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"),
+ (gpointer) release);
+ }
+ }
+ g_clear_error (&error_local);
+
+ /* get all components */
+ releases = xb_node_query (component, "releases/*", 0, &error_local);
+ if (releases == 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 < releases->len; i++) {
+ XbNode *release = g_ptr_array_index (releases, i);
+ const gchar *version = xb_node_get_attr (release, "version");
+ g_autoptr(XbNode) description = NULL;
+ AsUrgencyKind urgency_tmp;
+
+ /* ignore releases with no version */
+ if (version == NULL)
+ continue;
+
+ /* 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)
+ break;
+
+ /* use the 'worst' urgency, e.g. critical over enhancement */
+ urgency_tmp = as_urgency_kind_from_string (xb_node_get_attr (release, "urgency"));
+ if (urgency_tmp > urgency_best)
+ urgency_best = urgency_tmp;
+
+ /* add updates with a description */
+ description = xb_node_query_first (release, "description", NULL);
+ if (description == NULL)
+ continue;
+ g_ptr_array_add (updates_list, release);
+ }
+
+ /* 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) n = NULL;
+ g_autofree gchar *desc = NULL;
+ n = xb_node_query_first (release, "description", NULL);
+ desc = gs_appstream_format_description (n, NULL);
+ 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 i = 0; i < updates_list->len; i++) {
+ XbNode *release = g_ptr_array_index (updates_list, i);
+ const gchar *release_version = xb_node_get_attr (release, "version");
+ g_autofree gchar *desc = NULL;
+ g_autoptr(XbNode) n = NULL;
+
+ /* skip the currently installed version and all below it */
+ if (version != NULL && as_vercmp_simple (version, release_version) >= 0)
+ continue;
+
+ n = xb_node_query_first (release, "description", NULL);
+ desc = gs_appstream_format_description (n, NULL);
+ 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"));
+ }
+
+ /* success */
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_add_version_history (GsApp *app, XbNode *component, GError **error)
+{
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) version_history = NULL; /* (element-type AsRelease) */
+ g_autoptr(GPtrArray) releases = NULL; /* (element-type XbNode) */
+
+ /* get all components */
+ releases = xb_node_query (component, "releases/*", 0, &error_local);
+ if (releases == 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;
+ }
+
+ version_history = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+ for (guint i = 0; i < releases->len; i++) {
+ XbNode *release_node = g_ptr_array_index (releases, i);
+ const gchar *version = xb_node_get_attr (release_node, "version");
+ g_autoptr(XbNode) description_node = NULL;
+ g_autofree gchar *description = NULL;
+ guint64 timestamp;
+ const gchar *date_str;
+ g_autoptr(AsRelease) release = NULL;
+ g_autofree char *timestamp_xpath = NULL;
+
+ /* ignore releases with no version */
+ if (version == NULL)
+ continue;
+
+ timestamp_xpath = g_strdup_printf ("releases/release[%u]", i+1);
+ timestamp = xb_node_query_attr_as_uint (component, timestamp_xpath, "timestamp", NULL);
+ date_str = xb_node_query_attr (component, timestamp_xpath, "date", NULL);
+
+ /* include updates with or without a description */
+ description_node = xb_node_query_first (release_node, "description", NULL);
+ if (description_node != NULL)
+ description = gs_appstream_format_description (description_node, NULL);
+
+ 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 (version_history->len > 0)
+ gs_app_set_version_history (app, version_history);
+
+ /* success */
+ 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_content_rating (GsApp *app,
+ XbNode *content_rating,
+ GError **error)
+{
+ g_autoptr(AsContentRating) cr = as_content_rating_new ();
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) content_attributes = NULL;
+ const gchar *content_rating_kind = NULL;
+
+ /* get kind */
+ content_rating_kind = xb_node_get_attr (content_rating, "type");
+ /* we only really expect/support OARS 1.0 and 1.1 */
+ if (content_rating_kind == NULL ||
+ (g_strcmp0 (content_rating_kind, "oars-1.0") != 0 &&
+ g_strcmp0 (content_rating_kind, "oars-1.1") != 0)) {
+ return TRUE;
+ }
+
+ as_content_rating_set_kind (cr, content_rating_kind);
+
+ /* get attributes; no attributes being found (i.e.
+ * `<content_rating type="*"/>`) is OK: it means that all attributes have
+ * value `none`, as per the
+ * [OARS semantics](https://github.com/hughsie/oars/blob/HEAD/specification/oars-1.1.md) */
+ content_attributes = xb_node_query (content_rating, "content_attribute", 0, &error_local);
+ if (content_attributes == NULL &&
+ g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
+ g_clear_error (&error_local);
+ } else if (content_attributes == NULL) {
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ return FALSE;
+ }
+
+ for (guint i = 0; content_attributes != NULL && i < content_attributes->len; i++) {
+ XbNode *content_attribute = g_ptr_array_index (content_attributes, i);
+ as_content_rating_add_attribute (cr,
+ xb_node_get_attr (content_attribute, "id"),
+ as_content_rating_value_from_string (xb_node_get_text (content_attribute)));
+ }
+
+ gs_app_set_content_rating (app, cr);
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_app_content_ratings (GsApp *app,
+ XbNode *component,
+ GError **error)
+{
+ g_autoptr(GPtrArray) content_ratings = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ /* find any content ratings */
+ content_ratings = xb_node_query (component, "content_rating", 0, &error_local);
+ if (content_ratings == 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 < content_ratings->len; i++) {
+ XbNode *content_rating = g_ptr_array_index (content_ratings, i);
+ if (!gs_appstream_refine_app_content_rating (app, content_rating, error))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_app_relation (GsApp *app,
+ XbNode *relation_node,
+ AsRelationKind kind,
+ GError **error)
+{
+ /* Iterate over the children, which might be any combination of zero or
+ * more <id/>, <modalias/>, <kernel/>, <memory/>, <firmware/>,
+ * <control/> or <display_length/> 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")) {
+ AsDisplayLengthKind display_length_kind;
+ const gchar *compare;
+
+ /* 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);
+
+ 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 {
+ const gchar *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 {
+ g_debug ("Relation type ‘%s’ not currently supported for %s; ignoring",
+ item_kind, gs_app_get_id (app));
+ continue;
+ }
+
+ gs_app_add_relation (app, relation);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gs_appstream_refine_app_relations (GsApp *app,
+ XbNode *component,
+ GError **error)
+{
+ const struct {
+ const gchar *element_name;
+ AsRelationKind relation_kind;
+ } relation_types[] = {
+#if AS_CHECK_VERSION(0, 15, 0)
+ { "supports", AS_RELATION_KIND_SUPPORTS },
+#endif
+ { "recommends", AS_RELATION_KIND_RECOMMENDS },
+ { "requires", AS_RELATION_KIND_REQUIRES },
+ };
+
+ for (gsize i = 0; i < G_N_ELEMENTS (relation_types); i++) {
+ g_autoptr(GPtrArray) relations = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ /* find any instances of this @element_name */
+ relations = xb_node_query (component, relation_types[i].element_name, 0, &error_local);
+ if (relations == NULL &&
+ !g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ return FALSE;
+ }
+
+ for (guint j = 0; relations != NULL && j < relations->len; j++) {
+ XbNode *relation = g_ptr_array_index (relations, j);
+ if (!gs_appstream_refine_app_relation (app, relation, relation_types[i].relation_kind, error))
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+gboolean
+gs_appstream_refine_app (GsPlugin *plugin,
+ GsApp *app,
+ XbSilo *silo,
+ XbNode *component,
+ GsPluginRefineFlags refine_flags,
+ GError **error)
+{
+ const gchar *tmp;
+ guint64 timestamp;
+ g_autoptr(GPtrArray) bundles = NULL;
+ g_autoptr(GPtrArray) launchables = NULL;
+ g_autoptr(XbNode) req = 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);
+
+ /* is compatible */
+ req = xb_node_query_first (component,
+ "requires/id[@type='id']"
+ "[text()='org.gnome.Software.desktop']", NULL);
+ if (req != NULL) {
+ gint rc = as_vercmp_simple (xb_node_get_attr (req, "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;
+ }
+ }
+
+ /* 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_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:
+ 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);
+ }
+
+ /* try to detect old-style AppStream 'override'
+ * files without the merge attribute */
+ if (xb_node_query_text (component, "name", NULL) == NULL &&
+ xb_node_query_text (component, "metadata_license", NULL) == NULL) {
+ gs_app_add_quirk (app, GS_APP_QUIRK_IS_WILDCARD);
+ }
+
+ /* set id */
+ tmp = xb_node_query_text (component, "id", NULL);
+ if (tmp != NULL && gs_app_get_id (app) == NULL)
+ gs_app_set_id (app, tmp);
+
+ /* set source */
+ tmp = xb_node_query_text (component, "info/filename", NULL);
+ if (tmp == NULL)
+ tmp = xb_node_query_text (component, "../info/filename", NULL);
+ if (tmp != NULL && gs_app_get_metadata_item (app, "appstream::source-file") == NULL) {
+ gs_app_set_metadata (app, "appstream::source-file", tmp);
+ }
+
+ /* set scope */
+ tmp = xb_node_query_text (component, "../info/scope", NULL);
+ if (tmp != NULL)
+ gs_app_set_scope (app, as_component_scope_from_string (tmp));
+
+ /* set content rating */
+ if (TRUE) {
+ if (!gs_appstream_refine_app_content_ratings (app, component, error))
+ return FALSE;
+ }
+
+ /* recommends/requires
+ * FIXME: Technically this could do with a more specific refine flag,
+ * but essentially the relations are used on the details page and so
+ * are the permissions. It would be good to eliminate refine flags at
+ * some point in the future. */
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS) {
+ if (!gs_appstream_refine_app_relations (app, component, error))
+ return FALSE;
+ }
+
+ /* set name */
+ tmp = xb_node_query_text (component, "name", NULL);
+ if (tmp != NULL)
+ gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, tmp);
+
+ /* set summary */
+ tmp = xb_node_query_text (component, "summary", NULL);
+ if (tmp != NULL)
+ gs_app_set_summary (app, GS_APP_QUALITY_HIGHEST, tmp);
+
+ /* add urls */
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL) {
+ g_autoptr(GPtrArray) urls = NULL;
+ urls = xb_node_query (component, "url", 0, NULL);
+ if (urls != NULL) {
+ for (guint i = 0; i < urls->len; i++) {
+ XbNode *url = g_ptr_array_index (urls, i);
+ const gchar *kind = xb_node_get_attr (url, "type");
+ if (kind == NULL)
+ continue;
+ gs_app_set_url (app,
+ as_url_kind_from_string (kind),
+ xb_node_get_text (url));
+ }
+ }
+ }
+
+ /* add launchables */
+ launchables = xb_node_query (component, "launchable", 0, NULL);
+ if (launchables != NULL) {
+ for (guint i = 0; i < launchables->len; i++) {
+ XbNode *launchable = g_ptr_array_index (launchables, i);
+ const gchar *kind = xb_node_get_attr (launchable, "type");
+ if (g_strcmp0 (kind, "desktop-id") == 0) {
+ gs_app_set_launchable (app,
+ AS_LAUNCHABLE_KIND_DESKTOP_ID,
+ xb_node_get_text (launchable));
+ break;
+ } else if (g_strcmp0 (kind, "url") == 0) {
+ gs_app_set_launchable (app,
+ AS_LAUNCHABLE_KIND_URL,
+ xb_node_get_text (launchable));
+ }
+ }
+ }
+
+ /* set license */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE) > 0 &&
+ gs_app_get_license (app) == NULL) {
+ tmp = xb_node_query_text (component, "project_license", NULL);
+ if (tmp != NULL)
+ gs_app_set_license (app, GS_APP_QUALITY_HIGHEST, tmp);
+ }
+
+ /* set description */
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION) {
+ g_autofree gchar *description = NULL;
+ g_autoptr(XbNode) n = xb_node_query_first (component, "description", NULL);
+ if (n != NULL)
+ description = gs_appstream_format_description (n, NULL);
+ if (description != NULL)
+ gs_app_set_description (app, GS_APP_QUALITY_HIGHEST, description);
+ }
+
+ /* set icon */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) > 0 &&
+ gs_app_get_icons (app) == NULL)
+ gs_appstream_refine_icon (app, silo, component);
+
+ /* set categories */
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES) {
+ g_autoptr(GPtrArray) categories = NULL;
+ categories = xb_node_query (component, "categories/category", 0, NULL);
+ if (categories != NULL) {
+ for (guint i = 0; i < categories->len; i++) {
+ XbNode *category = g_ptr_array_index (categories, i);
+ gs_app_add_category (app, xb_node_get_text (category));
+
+ /* 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 (xb_node_get_text (category), "Blacklisted") == 0)
+ gs_app_add_quirk (app, GS_APP_QUIRK_HIDE_EVERYWHERE);
+ }
+ }
+ }
+
+ /* set project group */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP) > 0 &&
+ gs_app_get_project_group (app) == NULL) {
+ tmp = xb_node_query_text (component, "project_group", NULL);
+ if (tmp != NULL && gs_appstream_is_valid_project_group (tmp))
+ gs_app_set_project_group (app, tmp);
+ }
+
+ /* set developer name */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME) > 0 &&
+ gs_app_get_developer_name (app) == NULL) {
+ tmp = xb_node_query_text (component, "developer_name", NULL);
+ if (tmp != NULL)
+ gs_app_set_developer_name (app, tmp);
+ }
+
+ /* set the release date */
+ timestamp = component_get_release_timestamp (component);
+ if (timestamp != G_MAXUINT64)
+ gs_app_set_release_date (app, timestamp);
+
+ /* set the version history */
+ if (!gs_appstream_refine_add_version_history (app, component, error))
+ return FALSE;
+
+ /* copy all the metadata */
+ if (!gs_appstream_copy_metadata (app, component, error))
+ return FALSE;
+
+ /* add bundles */
+ bundles = xb_node_query (component, "bundle", 0, NULL);
+ if (bundles != NULL && gs_app_get_sources(app)->len == 0) {
+ for (guint i = 0; i < bundles->len; i++) {
+ XbNode *bundle = g_ptr_array_index (bundles, i);
+ const gchar *kind = xb_node_get_attr (bundle, "type");
+ const gchar *bundle_id = xb_node_get_text (bundle);
+
+ 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]);
+ }
+ }
+ }
+
+ /* add legacy package names */
+ if (gs_app_get_bundle_kind (app) == AS_BUNDLE_KIND_UNKNOWN) {
+ g_autoptr(GPtrArray) pkgnames = NULL;
+ pkgnames = xb_node_query (component, "pkgname", 0, NULL);
+ if (pkgnames != NULL && gs_app_get_sources(app)->len == 0) {
+ for (guint i = 0; i < pkgnames->len; i++) {
+ XbNode *pkgname = g_ptr_array_index (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 */
+ tmp = xb_node_query_attr (component, "..", "origin", NULL);
+ if (gs_appstream_origin_valid (tmp)) {
+ 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, error))
+ return FALSE;
+ }
+
+ /* set screenshots */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS) > 0 &&
+ gs_app_get_screenshots(app)->len == 0) {
+ if (!gs_appstream_refine_add_screenshots (app, component, error))
+ return FALSE;
+ }
+
+ /* set provides */
+ if (!gs_appstream_refine_add_provides (app, component, error))
+ return FALSE;
+
+ /* add kudos */
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS) {
+ g_autoptr(GPtrArray) kudos = NULL;
+ tmp = setlocale (LC_MESSAGES, NULL);
+ if (!_gs_utils_locale_has_translations (tmp)) {
+ gs_app_add_kudo (app, GS_APP_KUDO_MY_LANGUAGE);
+ } else {
+
+ g_autoptr(GString) xpath = g_string_new (NULL);
+ g_auto(GStrv) variants = g_get_locale_variants (tmp);
+
+ /* @variants includes @tmp */
+ for (gsize i = 0; variants[i] != NULL; i++)
+ xb_string_append_union (xpath, "languages/lang[(text()='%s') and (@percentage>50)]", variants[i]);
+
+ if (xb_node_query_text (component, xpath->str, NULL) != NULL)
+ gs_app_add_kudo (app, GS_APP_KUDO_MY_LANGUAGE);
+ }
+
+ /* Set this under the FLAGS_REQUIRE_KUDOS flag because it’s
+ * only useful in combination with KUDO_MY_LANGUAGE */
+ if (xb_node_query_text (component, "languages/lang", NULL) != NULL)
+ gs_app_set_has_translations (app, TRUE);
+
+ /* any keywords */
+ if (xb_node_query_text (component, "keywords/keyword", NULL) != NULL)
+ gs_app_add_kudo (app, GS_APP_KUDO_HAS_KEYWORDS);
+
+ /* HiDPI icon */
+ if (xb_node_query_text (component, "icon[@width='128']", NULL) != NULL)
+ gs_app_add_kudo (app, GS_APP_KUDO_HI_DPI_ICON);
+
+ /* was this application released recently */
+ if (gs_appstream_is_recent_release (component))
+ gs_app_add_kudo (app, GS_APP_KUDO_RECENT_RELEASE);
+
+ /* add a kudo to featured and popular apps */
+ if (xb_node_query_text (component, "kudos/kudo[text()='GnomeSoftware::popular']", NULL) != NULL)
+ gs_app_add_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED);
+ if (xb_node_query_text (component, "categories/category[text()='Featured']", NULL) != NULL)
+ gs_app_add_kudo (app, GS_APP_KUDO_FEATURED_RECOMMENDED);
+ }
+
+ /* we have an origin in the XML */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN) > 0 &&
+ gs_app_get_origin_appstream (app) == NULL) {
+ g_autoptr(XbNode) parent = xb_node_get_parent (component);
+ if (parent != NULL) {
+ tmp = xb_node_get_attr (parent, "origin");
+ if (gs_appstream_origin_valid (tmp))
+ gs_app_set_origin_appstream (app, tmp);
+ }
+ }
+
+ /* is there any update information */
+ if ((refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) != 0 &&
+ silo != NULL) {
+ if (!gs_appstream_refine_app_updates (app,
+ silo,
+ component,
+ error))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+typedef struct {
+ AsSearchTokenMatch 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);
+#if LIBXMLB_CHECK_VERSION(0, 3, 0)
+ 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);
+#else
+ xb_query_bind_str (helper->query, 0, search, NULL);
+ n = xb_node_query_full (component, helper->query, NULL);
+#endif
+ 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 {
+ AsSearchTokenMatch 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)
+{
+ 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 ();
+
+ 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;
+ }
+ 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, 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 & (~AS_SEARCH_TOKEN_MATCH_ID));
+ 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)
+{
+ const Query queries[] = {
+ { AS_SEARCH_TOKEN_MATCH_MIMETYPE, "mimetypes/mimetype[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_PKGNAME, "pkgname[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_SUMMARY, "summary[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_NAME, "name[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 }
+ };
+
+ 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)
+{
+ 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 }
+ };
+
+ 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/categories/"
+ "category[text()='%s']/../..",
+ split[0]);
+ } else if (g_strv_length (split) == 2) {
+ xpath = g_strdup_printf ("components/component/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)
+{
+ guint limit = 10;
+ 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/categories/"
+ "category[text()='%s']/../..",
+ split[0]);
+ } else if (g_strv_length (split) == 2) {
+ xpath = g_strdup_printf ("components/component/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
+ * applications 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);
+ }
+ }
+ }
+ }
+ continue;
+ }
+ return TRUE;
+}
+
+gboolean
+gs_appstream_add_installed (GsPlugin *plugin,
+ XbSilo *silo,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GPtrArray) components = NULL;
+ g_autoptr(GError) local_error = 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, 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)
+{
+ guint64 now = (guint64) g_get_real_time () / G_USEC_PER_SEC;
+ g_autofree gchar *xpath = 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;
+ }
+ for (guint i = 0; i < array->len; i++) {
+ XbNode *component = g_ptr_array_index (array, i);
+ g_autoptr(GsApp) app = gs_appstream_create_app (plugin, silo, component, error);
+ guint64 timestamp;
+ if (app == NULL)
+ return FALSE;
+ /* set the release date */
+ timestamp = component_get_release_timestamp (component);
+ if (timestamp != G_MAXUINT64)
+ 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, error);
+ if (app == NULL)
+ return FALSE;
+ gs_app_set_scope (app, AS_COMPONENT_SCOPE_SYSTEM);
+ gs_app_list_add (list, app);
+ }
+
+ return TRUE;
+}
+
+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 <keywords> 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 <keyword>str</keyword> 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 <provides> 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 <id>str</id> 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 <categories> 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 <category>str</category> 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 <icon>str</icon> 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..d0d6ea2
--- /dev/null
+++ b/lib/gs-appstream.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) 2015-2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gnome-software.h>
+#include <xmlb.h>
+
+G_BEGIN_DECLS
+
+GsApp *gs_appstream_create_app (GsPlugin *plugin,
+ XbSilo *silo,
+ XbNode *component,
+ GError **error);
+gboolean gs_appstream_refine_app (GsPlugin *plugin,
+ GsApp *app,
+ XbSilo *silo,
+ XbNode *component,
+ GsPluginRefineFlags flags,
+ 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);
+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..92cd79a
--- /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 <mwleeds@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+
+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..0e37264
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#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..8e85fa3
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+#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..1c9c292
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..befc167
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib/gi18n.h>
+
+#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 applications 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..1e82591
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+#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..895e1b8
--- /dev/null
+++ b/lib/gs-cmd.c
@@ -0,0 +1,847 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#include "gnome-software-private.h"
+
+#include "gs-debug.h"
+
+typedef struct {
+ GsPluginLoader *plugin_loader;
+ guint64 refine_flags;
+ guint max_results;
+ gboolean interactive;
+} 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 guint
+gs_cmd_prompt_for_number (guint maxnum)
+{
+ gint retval;
+ guint answer = 0;
+
+ do {
+ char buffer[64];
+
+ /* swallow the \n at end of line too */
+ if (!fgets (buffer, sizeof (buffer), stdin))
+ break;
+ if (strlen (buffer) == sizeof (buffer) - 1)
+ continue;
+
+ /* get a number */
+ retval = sscanf (buffer, "%u", &answer);
+
+ /* positive */
+ if (retval == 1 && answer > 0 && answer <= maxnum)
+ break;
+
+ /* TRANSLATORS: the user isn't reading the question */
+ g_print (_("Please enter a number from 1 to %u: "), maxnum);
+ } while (TRUE);
+ return answer;
+}
+
+static gboolean
+gs_cmd_action_exec (GsCmdSelf *self, GsPluginAction action, 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 };
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ /* 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, flags);
+ 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 (action == GS_PLUGIN_ACTION_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'",
+ gs_plugin_action_to_string (action), name);
+ return FALSE;
+ }
+
+ /* get one GsApp */
+ if (gs_app_list_length (list_filtered) == 1) {
+ app = g_object_ref (gs_app_list_index (list_filtered, 0));
+ } else {
+ guint idx;
+ /* TRANSLATORS: asking the user to choose an app from a list */
+ g_print ("%s\n", _("Choose an application:"));
+ for (guint i = 0; i < gs_app_list_length (list_filtered); i++) {
+ GsApp *app_tmp = gs_app_list_index (list_filtered, i);
+ g_print ("%u.\t%s\n",
+ i + 1,
+ gs_app_get_unique_id (app_tmp));
+ }
+ idx = gs_cmd_prompt_for_number (gs_app_list_length (list_filtered));
+ app = g_object_ref (gs_app_list_index (list_filtered, idx - 1));
+ }
+
+ /* install */
+ plugin_job2 = gs_plugin_job_newv (action,
+ "app", app,
+ "interactive", self->interactive,
+ NULL);
+ 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 },
+ { 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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, flags);
+ 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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, flags);
+ 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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, flags);
+ list = gs_plugin_loader_job_process (self->plugin_loader, plugin_job, NULL, &error);
+ if (list == NULL) {
+ ret = FALSE;
+ break;
+ }
+ }
+ } else if (argc == 4 && g_strcmp0 (argv[1], "action") == 0) {
+ GsPluginAction action = gs_plugin_action_from_string (argv[2]);
+ if (action == GS_PLUGIN_ACTION_UNKNOWN) {
+ ret = FALSE;
+ g_set_error (&error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "Did not recognise action '%s'", argv[2]);
+ } else {
+ ret = gs_cmd_action_exec (self, action, argv[3], &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_newv (GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "app", app,
+ "interactive", self->interactive,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_LAUNCH,
+ "app", app,
+ "interactive", self->interactive,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", self->refine_flags,
+ "max-results", self->max_results,
+ "interactive", self->interactive,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_URL_TO_APP,
+ "search", argv[2],
+ "refine-flags", self->refine_flags,
+ "max-results", self->max_results,
+ "interactive", self->interactive,
+ NULL);
+ 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(GsPluginJob) plugin_job = NULL;
+ if (list != NULL)
+ g_object_unref (list);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "refine-flags", self->refine_flags,
+ "max-results", self->max_results,
+ "interactive", self->interactive,
+ NULL);
+ 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(GsPluginJob) plugin_job = NULL;
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES,
+ "refine-flags", self->refine_flags,
+ "max-results", self->max_results,
+ "interactive", self->interactive,
+ NULL);
+ 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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, 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], "featured") == 0) {
+ for (i = 0; i < repeat; i++) {
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+ g_autoptr(GsAppQuery) query = NULL;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, flags);
+ 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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, 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], "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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, 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], "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;
+ GsPluginListAppsFlags flags = GS_PLUGIN_LIST_APPS_FLAGS_NONE;
+
+ 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,
+ NULL);
+
+ if (self->interactive)
+ flags |= GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE;
+
+ plugin_job = gs_plugin_job_list_apps_new (query, 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], "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', "
+ "'action install', 'action 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..f76788a
--- /dev/null
+++ b/lib/gs-debug.c
@@ -0,0 +1,295 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <unistd.h>
+
+#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);
+ }
+
+ /* make these shorter */
+ if (g_strcmp0 (log_domain, "PackageKit") == 0) {
+ log_domain = "PK";
+ } else if (g_strcmp0 (log_domain, "GsPlugin") == 0) {
+ log_domain = "Gs";
+ }
+
+ /* 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)
+{
+ /* important enough to force to the journal */
+ switch (log_level) {
+ case G_LOG_LEVEL_ERROR:
+ case G_LOG_LEVEL_CRITICAL:
+ case G_LOG_LEVEL_WARNING:
+ case G_LOG_LEVEL_INFO:
+ return g_log_writer_journald (log_level, fields, n_fields, user_data);
+ break;
+ 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..d927f81
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..c2ee93b
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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..049656a
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+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-download-utils.c b/lib/gs-download-utils.c
new file mode 100644
index 0000000..4949064
--- /dev/null
+++ b/lib/gs-download-utils.c
@@ -0,0 +1,870 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <libsoup/soup.h>
+
+#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)
+{
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ return soup_date_time_to_string (date_time, SOUP_DATE_HTTP);
+#else
+ const gchar *day_names[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+ const gchar *month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+ /* We can’t just use g_date_time_format() here because its output
+ * (particularly day and month names) is locale-dependent.
+ * #SoupDate is also a pain to use because there’s no easy way to
+ * convert from a #GDateTime with libsoup-2.4, while preserving the timezone. */
+ g_autofree gchar *time_str = g_date_time_format (date_time, "%H:%M:%S %Z");
+
+ return g_strdup_printf ("%s, %02d %s %d %s",
+ day_names[g_date_time_get_day_of_week (date_time) - 1],
+ g_date_time_get_day_of_month (date_time),
+ month_names[g_date_time_get_month (date_time) - 1],
+ g_date_time_get_year (date_time),
+ time_str);
+#endif
+}
+
+static GDateTime *
+date_time_from_rfc7231 (const gchar *rfc7231_str)
+{
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ return soup_date_time_new_from_http_string (rfc7231_str);
+#else
+ g_autoptr(SoupDate) soup_date = NULL;
+ g_autoptr(GTimeZone) tz = NULL;
+
+ soup_date = soup_date_new_from_string (rfc7231_str);
+ if (soup_date == NULL)
+ return NULL;
+
+ if (soup_date->utc)
+ tz = g_time_zone_new_utc ();
+ else
+ tz = g_time_zone_new_offset (soup_date->offset * 60);
+
+ return g_date_time_new (tz, soup_date->year, soup_date->month,
+ soup_date->day, soup_date->hour,
+ soup_date->minute, soup_date->second);
+#endif
+}
+
+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(GError) local_error = 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) {
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ soup_message_headers_append (soup_message_get_request_headers (msg), "If-None-Match", last_etag);
+#else
+ soup_message_headers_append (msg->request_headers, "If-None-Match", last_etag);
+#endif
+ } else if (last_modified_date != NULL) {
+ g_autofree gchar *last_modified_date_str = date_time_to_rfc7231 (last_modified_date);
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ soup_message_headers_append (soup_message_get_request_headers (msg), "If-Modified-Since", last_modified_date_str);
+#else
+ soup_message_headers_append (msg->request_headers, "If-Modified-Since", last_modified_date_str);
+#endif
+ }
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ soup_session_send_async (soup_session, msg, data->io_priority, cancellable, open_input_stream_cb, g_steal_pointer (&task));
+#else
+ soup_session_send_async (soup_session, msg, cancellable, open_input_stream_cb, g_steal_pointer (&task));
+#endif
+}
+
+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. */
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ input_stream = soup_session_send_finish (soup_session, result, &local_error);
+ status_code = soup_message_get_status (data->message);
+#else
+ input_stream = soup_session_send_finish (soup_session, result, &local_error);
+ status_code = data->message->status_code;
+#endif
+
+ 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;
+ }
+
+ g_assert (input_stream != NULL);
+
+ /* Get the expected download size. */
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ data->expected_stream_size_bytes = soup_message_headers_get_content_length (soup_message_get_response_headers (data->message));
+#else
+ data->expected_stream_size_bytes = soup_message_headers_get_content_length (data->message->response_headers);
+#endif
+
+ /* Store the new ETag for later use. */
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ new_etag = soup_message_headers_get_one (soup_message_get_response_headers (data->message), "ETag");
+#else
+ new_etag = soup_message_headers_get_one (data->message->response_headers, "ETag");
+#endif
+ 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. */
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ new_last_modified_str = soup_message_headers_get_one (soup_message_get_response_headers (data->message), "Last-Modified");
+#else
+ new_last_modified_str = soup_message_headers_get_one (data->message->response_headers, "Last-Modified");
+#endif
+ 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);
+}
diff --git a/lib/gs-download-utils.h b/lib/gs-download-utils.h
new file mode 100644
index 0000000..cd9dd46
--- /dev/null
+++ b/lib/gs-download-utils.h
@@ -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) 2022 Endless OS Foundation LLC
+ *
+ * Author: Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <libsoup/soup.h>
+
+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);
+
+/**
+ * GsExternalAppstreamError:
+ * @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);
+
+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..24ce3a8
--- /dev/null
+++ b/lib/gs-external-appstream-utils.c
@@ -0,0 +1,627 @@
+ /* -*- 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 <jrocha@endlessm.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * 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 <errno.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <libsoup/soup.h>
+
+#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 *url,
+ SoupSession *soup_session,
+ guint64 cache_age_secs,
+ ProgressTuple *progress_tuple,
+ 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 the user, or the system? */
+ system_wide = g_settings_get_boolean (settings, "external-appstream-system-wide");
+
+ /* Check cache file age. */
+ 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);
+ g_task_return_boolean (task, TRUE);
+ return;
+ }
+
+ /* 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) */
+ gsize n_appstream_urls;
+ GsDownloadProgressCallback progress_callback; /* (nullable) */
+ gpointer progress_user_data; /* (closure progress_callback) */
+ ProgressTuple *progress_tuples; /* (array length=n_appstream_urls) (owned) */
+ GSource *progress_source; /* (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);
+
+ g_free (data);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (RefreshData, refresh_data_free)
+
+/**
+ * gs_external_appstream_refresh_async:
+ * @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 configured external appstream files, if the cache is too old.
+ *
+ * Since: 42
+ */
+void
+gs_external_appstream_refresh_async (guint64 cache_age_secs,
+ GsDownloadProgressCallback progress_callback,
+ gpointer progress_user_data,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_autoptr(GSettings) settings = NULL;
+ g_auto(GStrv) appstream_urls = 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 ();
+ appstream_urls = g_settings_get_strv (settings,
+ "external-appstream-urls");
+ 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);
+ 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++) {
+ if (!g_str_has_prefix (appstream_urls[i], "https")) {
+ 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,
+ appstream_urls[i],
+ soup_session,
+ cache_age_secs,
+ &data->progress_tuples[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 (&parallel_bytes_downloaded,
+ parallel_bytes_downloaded,
+ progress_tuple->bytes_downloaded))
+ parallel_bytes_downloaded = G_MAXSIZE;
+ if (!g_size_checked_add (&parallel_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
+ * @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: 42
+ */
+gboolean
+gs_external_appstream_refresh_finish (GAsyncResult *result,
+ GError **error)
+{
+ g_return_val_if_fail (g_task_is_valid (result, NULL), 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-external-appstream-utils.h b/lib/gs-external-appstream-utils.h
new file mode 100644
index 0000000..63e67f8
--- /dev/null
+++ b/lib/gs-external-appstream-utils.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) 2018 Endless Mobile, Inc.
+ *
+ * Authors: Joaquim Rocha <jrocha@endlessm.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include "config.h"
+
+#include <glib.h>
+#include <gnome-software.h>
+
+#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 (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,
+ GError **error);
diff --git a/lib/gs-fedora-third-party.c b/lib/gs-fedora-third-party.c
new file mode 100644
index 0000000..6afebc0
--- /dev/null
+++ b/lib/gs-fedora-third-party.c
@@ -0,0 +1,497 @@
+/* -*- 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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#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;
+};
+
+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 (void)
+{
+ return g_object_new (GS_TYPE_FEDORA_THIRD_PARTY, NULL);
+}
+
+static gboolean
+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 FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gs_fedora_third_party_is_available (GsFedoraThirdParty *self)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE);
+
+ g_mutex_lock (&self->lock);
+ res = gs_fedora_third_party_ensure_executable_locked (self, NULL);
+ g_mutex_unlock (&self->lock);
+
+ return res;
+}
+
+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)
+{
+ const gchar *args[] = {
+ "", /* executable */
+ "query",
+ "--quiet",
+ NULL
+ };
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE);
+
+ g_mutex_lock (&self->lock);
+ if (gs_fedora_third_party_ensure_executable_locked (self, error)) {
+ gint wait_status = -1;
+ args[0] = self->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;
+ }
+ }
+ g_mutex_unlock (&self->lock);
+
+ 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)
+{
+ const gchar *args[] = {
+ "pkexec",
+ "", /* executable */
+ "", /* command */
+ "", /* config-only */
+ NULL
+ };
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE);
+
+ g_mutex_lock (&self->lock);
+ if (gs_fedora_third_party_ensure_executable_locked (self, error)) {
+ gint wait_status = -1;
+ args[1] = self->executable;
+ args[2] = enable ? "enable" : "disable";
+ args[3] = config_only ? "--config-only" : NULL;
+ success = 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);
+ }
+ g_mutex_unlock (&self->lock);
+
+ return success;
+}
+
+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.
+ */
+ const gchar *args[] = {
+ "pkexec",
+ "/usr/lib/fedora-third-party/fedora-third-party-opt-out",
+ NULL
+ };
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (GS_IS_FEDORA_THIRD_PARTY (self), FALSE);
+
+ g_mutex_lock (&self->lock);
+ if (gs_fedora_third_party_ensure_executable_locked (self, error)) {
+ gint wait_status = -1;
+ success = 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);
+ }
+ g_mutex_unlock (&self->lock);
+
+ return success;
+}
+
+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)
+{
+ const gchar *args[] = {
+ "", /* executable */
+ "list",
+ "--csv",
+ "--columns=type,name",
+ NULL
+ };
+ 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_clear_pointer (&self->repos, g_hash_table_unref);
+ if (gs_fedora_third_party_ensure_executable_locked (self, error)) {
+ gint wait_status = -1;
+ g_autofree gchar *stdoutput = NULL;
+ args[0] = self->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)) {
+ GHashTable *repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ g_auto(GStrv) lines = NULL;
+
+ 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];
+ /* The 'dnf' means 'packagekit' here */
+ if (g_str_equal (repo_type, "dnf"))
+ repo_type = "packagekit";
+ /* Hash them by name, which cannot clash between types */
+ g_hash_table_insert (repos, g_strdup (tokens[1]), g_strdup (repo_type));
+ }
+ }
+
+ self->repos = 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..11a0144
--- /dev/null
+++ b/lib/gs-fedora-third-party.h
@@ -0,0 +1,93 @@
+/* -*- 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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <gio/gio.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 (void);
+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.c b/lib/gs-icon.c
new file mode 100644
index 0000000..955ab02
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <appstream.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..b1b7a89
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <appstream.h>
+#include <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+
+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 <jamiemcc@gnome.org>
+ * Copyright (C) 2006, Anders Aagaard
+ *
+ * Based mostly on code by Robert Love <rml@novell.com>
+ *
+ * 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 <stdio.h>
+#include <errno.h>
+
+#ifdef HAVE_LINUX_UNISTD_H
+#include <linux/unistd.h>
+#endif
+
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#include <glib/gstdio.h>
+
+#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 <ivan.frade@nokia.com>
+ *
+ * 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 <glib.h>
+
+G_BEGIN_DECLS
+
+void gs_ioprio_set (gint priority);
+
+G_END_DECLS
diff --git a/lib/gs-key-colors.c b/lib/gs-key-colors.c
new file mode 100644
index 0000000..fb0850c
--- /dev/null
+++ b/lib/gs-key-colors.c
@@ -0,0 +1,334 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2021 Endless OS Foundation LLC
+ *
+ * Authors:
+ * - Richard Hughes <richard@hughsie.com>
+ * - Kalev Lember <klember@redhat.com>
+ * - Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#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 ClusterPixel8 *
+get_pixel (guint8 *pixels,
+ guint x,
+ guint y,
+ guint rowstride,
+ guint n_channels)
+{
+ return (ClusterPixel8 *) (pixels + y * rowstride + x * n_channels);
+}
+
+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..de1baee
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2021 Endless OS Foundation LLC
+ *
+ * Authors:
+ * - Richard Hughes <richard@hughsie.com>
+ * - Kalev Lember <klember@redhat.com>
+ * - Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+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..e6a82d9
--- /dev/null
+++ b/lib/gs-metered.c
@@ -0,0 +1,312 @@
+/* -*- 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+
+ */
+
+/**
+ * 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 gs_plugin_download() or gs_plugin_download_app()
+ * 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 <glib.h>
+
+#ifdef HAVE_MOGWAI
+#include <libmogwai-schedule-client/scheduler.h>
+#endif
+
+#include "gs-metered.h"
+#include "gs-utils.h"
+
+
+#ifdef HAVE_MOGWAI
+
+typedef struct
+{
+ gboolean *out_download_now; /* (unowned) */
+ GMainContext *context; /* (unowned) */
+} DownloadNowData;
+
+static void
+download_now_cb (GObject *obj,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ DownloadNowData *data = user_data;
+ *data->out_download_now = mwsc_schedule_entry_get_download_now (MWSC_SCHEDULE_ENTRY (obj));
+ g_main_context_wakeup (data->context);
+}
+
+typedef struct
+{
+ GError **out_error; /* (unowned) */
+ GMainContext *context; /* (unowned) */
+} InvalidatedData;
+
+static void
+invalidated_cb (MwscScheduleEntry *entry,
+ const GError *error,
+ gpointer user_data)
+{
+ InvalidatedData *data = user_data;
+ *data->out_error = g_error_copy (error);
+ g_main_context_wakeup (data->context);
+}
+
+#endif /* HAVE_MOGWAI */
+
+/**
+ * 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)
+{
+#ifdef HAVE_MOGWAI
+ g_autoptr(MwscScheduler) scheduler = NULL;
+ g_autoptr(MwscScheduleEntry) schedule_entry = NULL;
+ g_autofree gchar *parameters_str = NULL;
+ g_autoptr(GMainContext) context = NULL;
+ g_autoptr(GMainContextPusher) pusher = NULL;
+
+ g_return_val_if_fail (schedule_entry_handle_out != NULL, FALSE);
+
+ /* set this in case of error */
+ *schedule_entry_handle_out = NULL;
+
+ parameters_str = (parameters != NULL) ? g_variant_print (parameters, TRUE) : g_strdup ("(none)");
+ g_debug ("%s: Waiting with parameters: %s", G_STRFUNC, parameters_str);
+
+ /* Push the context early so that the #MwscScheduler is created to run within it. */
+ context = g_main_context_new ();
+ pusher = g_main_context_pusher_new (context);
+
+ /* 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. */
+ scheduler = mwsc_scheduler_new (cancellable, error);
+ if (scheduler == NULL)
+ return FALSE;
+
+ /* 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. */
+ schedule_entry = mwsc_scheduler_schedule (scheduler, parameters, cancellable,
+ error);
+ if (schedule_entry == NULL)
+ return FALSE;
+
+ /* Wait until the download is allowed to proceed. */
+ if (!mwsc_schedule_entry_get_download_now (schedule_entry)) {
+ gboolean download_now = FALSE;
+ g_autoptr(GError) invalidated_error = NULL;
+ gulong notify_id, invalidated_id;
+ DownloadNowData download_now_data = { &download_now, context };
+ InvalidatedData invalidated_data = { &invalidated_error, context };
+
+ notify_id = g_signal_connect (schedule_entry, "notify::download-now",
+ (GCallback) download_now_cb, &download_now_data);
+ invalidated_id = g_signal_connect (schedule_entry, "invalidated",
+ (GCallback) invalidated_cb, &invalidated_data);
+
+ while (!download_now && invalidated_error == NULL &&
+ !g_cancellable_is_cancelled (cancellable))
+ g_main_context_iteration (context, TRUE);
+
+ g_signal_handler_disconnect (schedule_entry, invalidated_id);
+ g_signal_handler_disconnect (schedule_entry, notify_id);
+
+ if (!download_now && invalidated_error != NULL) {
+ /* no need to remove the schedule entry as it’s been
+ * invalidated */
+ g_propagate_error (error, g_steal_pointer (&invalidated_error));
+ return FALSE;
+ } else if (!download_now && g_cancellable_set_error_if_cancelled (cancellable, error)) {
+ /* remove the schedule entry and fail */
+ gs_metered_remove_from_download_scheduler (schedule_entry, NULL, NULL);
+ return FALSE;
+ }
+
+ g_assert (download_now);
+ }
+
+ *schedule_entry_handle_out = g_object_ref (schedule_entry);
+
+ g_debug ("%s: Allowed to download", G_STRFUNC);
+#else /* if !HAVE_MOGWAI */
+ g_debug ("%s: Allowed to download (Mogwai support compiled out)", G_STRFUNC);
+#endif /* !HAVE_MOGWAI */
+
+ 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
+}
+
+/**
+ * gs_metered_block_app_on_download_scheduler:
+ * @app: a #GsApp 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 given @app.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 3.38
+ */
+gboolean
+gs_metered_block_app_on_download_scheduler (GsApp *app,
+ gpointer *schedule_entry_handle_out,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_auto(GVariantDict) parameters_dict = G_VARIANT_DICT_INIT (NULL);
+ g_autoptr(GVariant) parameters = 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 (&parameters_dict, "resumable", "b", FALSE);
+
+ if (gs_app_get_size_download (app, &download_size) == GS_SIZE_TYPE_VALID) {
+ g_variant_dict_insert (&parameters_dict, "size-minimum", "t", download_size);
+ g_variant_dict_insert (&parameters_dict, "size-maximum", "t", download_size);
+ }
+
+ parameters = g_variant_ref_sink (g_variant_dict_end (&parameters_dict));
+
+ return gs_metered_block_on_download_scheduler (parameters, schedule_entry_handle_out, cancellable, error);
+}
+
+/**
+ * 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 (&parameters_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 (&parameters_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..f81d171
--- /dev/null
+++ b/lib/gs-metered.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) 2019 Endless Mobile, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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);
+gboolean gs_metered_remove_from_download_scheduler (gpointer schedule_entry_handle,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_metered_block_app_on_download_scheduler (GsApp *app,
+ gpointer *schedule_entry_handle_out,
+ GCancellable *cancellable,
+ GError **error);
+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..cb9d37d
--- /dev/null
+++ b/lib/gs-odrs-provider.c
@@ -0,0 +1,1998 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2016-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2021 Endless OS Foundation LLC
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+#include <json-glib/json-glib.h>
+#include <libsoup/soup.h>
+#include <locale.h>
+#include <math.h>
+#include <string.h>
+
+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 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;
+ g_autoptr(GError) local_error = 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;
+}
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+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);
+}
+#endif
+
+static gboolean
+gs_odrs_provider_json_post (SoupSession *session,
+ const gchar *uri,
+ const gchar *data,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint status_code;
+ g_autoptr(SoupMessage) msg = NULL;
+ gconstpointer downloaded_data;
+ gsize downloaded_data_length;
+ g_autoptr(GInputStream) input_stream = NULL;
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ g_autoptr(GBytes) bytes = NULL;
+#endif
+ /* create the GET data */
+ g_debug ("Sending ODRS request to %s: %s", uri, data);
+ msg = soup_message_new (SOUP_METHOD_POST, uri);
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ g_odrs_provider_set_message_request_body (msg, "application/json; charset=utf-8",
+ data, strlen (data));
+ bytes = soup_session_send_and_read (session, msg, cancellable, error);
+ if (bytes == NULL)
+ return FALSE;
+
+ downloaded_data = g_bytes_get_data (bytes, &downloaded_data_length);
+ status_code = soup_message_get_status (msg);
+#else
+ soup_message_set_request (msg, "application/json; charset=utf-8",
+ SOUP_MEMORY_COPY, data, strlen (data));
+
+ /* set sync request */
+ status_code = soup_session_send_message (session, msg);
+ downloaded_data = msg->response_body ? msg->response_body->data : NULL;
+ downloaded_data_length = msg->response_body ? msg->response_body->length : 0;
+#endif
+ g_debug ("ODRS server returned status %u: %.*s", status_code, (gint) downloaded_data_length, (const gchar *) downloaded_data);
+ if (status_code != SOUP_STATUS_OK) {
+ g_warning ("Failed to set rating on ODRS: %s",
+ soup_status_get_phrase (status_code));
+ g_set_error (error,
+ GS_ODRS_PROVIDER_ERROR,
+ GS_ODRS_PROVIDER_ERROR_SERVER_ERROR,
+ "Failed to submit review to ODRS: %s", soup_status_get_phrase (status_code));
+ return FALSE;
+ }
+
+ /* process returned JSON */
+ input_stream = g_memory_input_stream_new_from_data (downloaded_data, downloaded_data_length, NULL);
+ return gs_odrs_provider_parse_success (input_stream, error);
+}
+
+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);
+ if (value == NULL)
+ continue;
+ 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;
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ g_autoptr(GBytes) bytes = NULL;
+#endif
+ 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);
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ 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));
+#else
+ soup_message_set_request (msg, "application/json; charset=utf-8",
+ SOUP_MEMORY_COPY, request_body, strlen (request_body));
+ soup_session_send_async (self->session, msg, cancellable,
+ open_input_stream_cb, g_steal_pointer (&task));
+#endif
+}
+
+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;
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ input_stream = soup_session_send_finish (soup_session, result, &local_error);
+ status_code = soup_message_get_status (data->message);
+#else
+ input_stream = soup_session_send_finish (soup_session, result, &local_error);
+ status_code = data->message->status_code;
+#endif
+
+ 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;
+ }
+
+ if (status_code != SOUP_STATUS_OK) {
+ if (!gs_odrs_provider_parse_success (input_stream, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ /* not sure what to do here */
+ g_task_return_new_error (task,
+ GS_ODRS_PROVIDER_ERROR,
+ GS_ODRS_PROVIDER_ERROR_DOWNLOADING,
+ "status code invalid");
+ 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 application 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 gboolean
+gs_odrs_provider_vote (GsOdrsProvider *self,
+ AsReview *review,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GError **error)
+{
+ 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;
+
+ /* 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;
+ json_builder_set_member_name (builder, "review_id");
+ review_id = g_ascii_strtoll (tmp, NULL, 10);
+ 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)
+ return FALSE;
+
+ /* clear cache */
+ if (!gs_odrs_provider_invalidate_cache (review, error))
+ return FALSE;
+
+ /* send to server */
+ if (!gs_odrs_provider_json_post (self->session, uri, data, cancellable, error))
+ return FALSE;
+
+ /* mark as voted */
+ as_review_add_flags (review, AS_REVIEW_FLAG_VOTED);
+
+ /* success */
+ return TRUE;
+}
+
+static GsApp *
+gs_odrs_provider_create_app_dummy (const gchar *id)
+{
+ GsApp *app = gs_app_new (id);
+ g_autoptr(GString) str = NULL;
+ str = g_string_new (id);
+ as_gstring_replace (str, ".desktop", "");
+ g_string_prepend (str, "No description is available for ");
+ gs_app_set_name (app, GS_APP_QUALITY_LOWEST, "Unknown Application");
+ gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, "Application not found");
+ gs_app_set_description (app, GS_APP_QUALITY_LOWEST, str->str);
+ return app;
+}
+
+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);
+ 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:
+ * @self: a #GsOdrsProvider
+ * @app: the app being reviewed
+ * @review: the review
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Submit a new @review for @app.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_submit_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ 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;
+
+ /* 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));
+ as_review_add_metadata (review, "user_skey",
+ gs_app_get_metadata_item (app, "ODRS::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);
+ 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"));
+ 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);
+
+ /* clear cache */
+ if (!gs_odrs_provider_invalidate_cache (review, error))
+ return FALSE;
+
+ /* POST */
+ uri = g_strdup_printf ("%s/submit", self->review_server);
+ if (!gs_odrs_provider_json_post (self->session, uri, data, cancellable, error))
+ return FALSE;
+
+ /* modify the local app */
+ gs_app_add_review (app, review);
+
+ return TRUE;
+}
+
+/**
+ * gs_odrs_provider_report_review:
+ * @self: a #GsOdrsProvider
+ * @app: the app whose review is being reported
+ * @review: the review to report
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Report the given @review on @app for being incorrect or breaking the code of
+ * conduct.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_report_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *uri = NULL;
+ uri = g_strdup_printf ("%s/report", self->review_server);
+ return gs_odrs_provider_vote (self, review, uri, cancellable, error);
+}
+
+/**
+ * gs_odrs_provider_upvote_review:
+ * @self: a #GsOdrsProvider
+ * @app: the app whose review is being upvoted
+ * @review: the review to upvote
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Add one vote to @review on @app.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_upvote_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *uri = NULL;
+ uri = g_strdup_printf ("%s/upvote", self->review_server);
+ return gs_odrs_provider_vote (self, review, uri, cancellable, error);
+}
+
+/**
+ * gs_odrs_provider_downvote_review:
+ * @self: a #GsOdrsProvider
+ * @app: the app whose review is being downvoted
+ * @review: the review to downvote
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Remove one vote from @review on @app.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_downvote_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *uri = NULL;
+ uri = g_strdup_printf ("%s/downvote", self->review_server);
+ return gs_odrs_provider_vote (self, review, uri, cancellable, error);
+}
+
+/**
+ * gs_odrs_provider_dismiss_review:
+ * @self: a #GsOdrsProvider
+ * @app: the app whose review is being dismissed
+ * @review: the review to dismiss
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Dismiss (ignore) @review on @app when moderating.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_dismiss_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *uri = NULL;
+ uri = g_strdup_printf ("%s/dismiss", self->review_server);
+ return gs_odrs_provider_vote (self, review, uri, cancellable, error);
+}
+
+/**
+ * gs_odrs_provider_remove_review:
+ * @self: a #GsOdrsProvider
+ * @app: the app whose review is being removed
+ * @review: the review to remove
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Remove a @review written by the user, from @app.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_remove_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *uri = NULL;
+ uri = g_strdup_printf ("%s/remove", self->review_server);
+ if (!gs_odrs_provider_vote (self, review, uri, cancellable, error))
+ return FALSE;
+
+ /* update the local app */
+ gs_app_remove_review (app, review);
+
+ return TRUE;
+}
+
+/**
+ * gs_odrs_provider_add_unvoted_reviews:
+ * @self: a #GsOdrsProvider
+ * @list: list of apps to add unvoted reviews to
+ * @cancellable: (nullable): a #GCancellable, or %NULL
+ * @error: return location for a #GError
+ *
+ * Add the unmoderated reviews for each app in @list to the apps.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 41
+ */
+gboolean
+gs_odrs_provider_add_unvoted_reviews (GsOdrsProvider *self,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint status_code;
+ guint i;
+ gconstpointer downloaded_data;
+ gsize downloaded_data_length;
+ g_autofree gchar *uri = NULL;
+ g_autoptr(GHashTable) hash = NULL;
+ g_autoptr(JsonParser) json_parser = NULL;
+ g_autoptr(GPtrArray) reviews = NULL;
+ g_autoptr(SoupMessage) msg = NULL;
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ g_autoptr(GBytes) bytes = NULL;
+#endif
+ g_autoptr(GError) local_error = NULL;
+
+ /* create the GET data *with* the machine hash so we can later
+ * review the application ourselves */
+ uri = g_strdup_printf ("%s/moderate/%s/%s",
+ self->review_server,
+ self->user_hash,
+ setlocale (LC_MESSAGES, NULL));
+ msg = soup_message_new (SOUP_METHOD_GET, uri);
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ bytes = soup_session_send_and_read (self->session, msg, cancellable, error);
+ if (bytes == NULL)
+ return FALSE;
+
+ downloaded_data = g_bytes_get_data (bytes, &downloaded_data_length);
+ status_code = soup_message_get_status (msg);
+#else
+ status_code = soup_session_send_message (self->session, msg);
+ downloaded_data = msg->response_body ? msg->response_body->data : NULL;
+ downloaded_data_length = msg->response_body ? msg->response_body->length : 0;
+#endif
+ if (status_code != SOUP_STATUS_OK) {
+ g_autoptr(GInputStream) input_stream = g_memory_input_stream_new_from_data (downloaded_data, downloaded_data_length, NULL);
+ if (!gs_odrs_provider_parse_success (input_stream, error))
+ return FALSE;
+ /* not sure what to do here */
+ g_set_error_literal (error,
+ GS_ODRS_PROVIDER_ERROR,
+ GS_ODRS_PROVIDER_ERROR_DOWNLOADING,
+ "status code invalid");
+ return FALSE;
+ }
+ g_debug ("odrs returned: %.*s", (gint) downloaded_data_length, (const gchar *) downloaded_data);
+
+ /* nothing */
+ if (downloaded_data == NULL) {
+ if (!g_network_monitor_get_network_available (g_network_monitor_get_default ()))
+ g_set_error_literal (error,
+ GS_ODRS_PROVIDER_ERROR,
+ GS_ODRS_PROVIDER_ERROR_NO_NETWORK,
+ "server couldn't be reached");
+ else
+ g_set_error_literal (error,
+ GS_ODRS_PROVIDER_ERROR,
+ GS_ODRS_PROVIDER_ERROR_PARSING_DATA,
+ "server returned no data");
+ return FALSE;
+ }
+
+ /* parse the data and find the array of ratings */
+ json_parser = json_parser_new_immutable ();
+ if (!json_parser_load_from_data (json_parser, downloaded_data, downloaded_data_length, &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;
+ }
+
+ reviews = gs_odrs_provider_parse_reviews (self, json_parser, error);
+ if (reviews == NULL)
+ return FALSE;
+
+ /* look at all the reviews; faking application objects */
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
+ for (i = 0; i < reviews->len; i++) {
+ GsApp *app;
+ AsReview *review;
+ const gchar *app_id;
+
+ /* same app? */
+ review = g_ptr_array_index (reviews, i);
+ app_id = as_review_get_metadata_item (review, "app_id");
+ app = g_hash_table_lookup (hash, app_id);
+ if (app == NULL) {
+ app = gs_odrs_provider_create_app_dummy (app_id);
+ gs_app_list_add (list, app);
+ g_hash_table_insert (hash, g_strdup (app_id), app);
+ }
+ gs_app_add_review (app, review);
+ }
+
+ return TRUE;
+}
diff --git a/lib/gs-odrs-provider.h b/lib/gs-odrs-provider.h
new file mode 100644
index 0000000..f02ffde
--- /dev/null
+++ b/lib/gs-odrs-provider.h
@@ -0,0 +1,125 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <libsoup/soup.h>
+
+#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 rejected ODRS submission or returned an error.
+ *
+ * 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,
+} 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);
+
+gboolean gs_odrs_provider_submit_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_odrs_provider_report_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_odrs_provider_upvote_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_odrs_provider_downvote_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_odrs_provider_dismiss_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_odrs_provider_remove_review (GsOdrsProvider *self,
+ GsApp *app,
+ AsReview *review,
+ GCancellable *cancellable,
+ GError **error);
+
+gboolean gs_odrs_provider_add_unvoted_reviews (GsOdrsProvider *self,
+ GsAppList *list,
+ GCancellable *cancellable,
+ 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..191a385
--- /dev/null
+++ b/lib/gs-os-release.c
@@ -0,0 +1,347 @@
+/* -*- 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 <klember@redhat.com>
+ * Copyright (C) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+/**
+ * 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 <glib.h>
+
+#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;
+};
+
+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 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) {
+ os_release->name = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "VERSION") == 0) {
+ os_release->version = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "ID") == 0) {
+ os_release->id = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "ID_LIKE") == 0) {
+ os_release->id_like = g_strsplit (tmp, " ", 0);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "VERSION_ID") == 0) {
+ os_release->version_id = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "PRETTY_NAME") == 0) {
+ os_release->pretty_name = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "CPE_NAME") == 0) {
+ os_release->cpe_name = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "UBUNTU_CODENAME") == 0) {
+ os_release->distro_codename = g_strdup (tmp);
+ continue;
+ }
+ if (g_strcmp0 (lines[i], "HOME_URL") == 0) {
+ os_release->home_url = g_strdup (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;
+}
+
+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_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..336f17c
--- /dev/null
+++ b/lib/gs-os-release.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 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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);
+
+G_END_DECLS
diff --git a/lib/gs-plugin-event.c b/lib/gs-plugin-event.c
new file mode 100644
index 0000000..699e529
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+
+#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 application 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, e.g. %GS_PLUGIN_ACTION_UPDATE
+ *
+ * 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..949eb85
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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..40c8a61
--- /dev/null
+++ b/lib/gs-plugin-helpers.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) 2021 Endless OS Foundation LLC
+ *
+ * Author: Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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);
+}
diff --git a/lib/gs-plugin-helpers.h b/lib/gs-plugin-helpers.h
new file mode 100644
index 0000000..b4a19f3
--- /dev/null
+++ b/lib/gs-plugin-helpers.h
@@ -0,0 +1,96 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gnome-software.h>
+
+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)
+
+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..56a4e14
--- /dev/null
+++ b/lib/gs-plugin-job-list-apps.c
@@ -0,0 +1,516 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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-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) */
+};
+
+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
+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;
+
+ 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);
+
+ 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;
+
+ /* 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, NULL);
+}
+
+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);
+
+ /* Since #GsAppQuery supports a number of different query parameters,
+ * not all plugins will support all of them. Ignore errors related to
+ * that. */
+ if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))
+ g_clear_error (&local_error);
+
+ 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;
+ 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));
+ return;
+ }
+
+ /* run refine() on each one if required */
+ if (self->query != NULL)
+ refine_flags = gs_app_query_get_refine_flags (self->query);
+
+ 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);
+ 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));
+ 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;
+ GsAppListFilterFunc filter_func = NULL;
+ gpointer filter_func_data = NULL;
+ guint max_results = 0;
+ g_autofree gchar *job_debug = NULL;
+
+ /* Standard filtering.
+ *
+ * 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);
+
+ /* 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);
+}
+
+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..e6aec46
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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..f2d1644
--- /dev/null
+++ b/lib/gs-plugin-job-list-categories.c
@@ -0,0 +1,347 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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-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) */
+};
+
+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;
+
+ 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++)
+ 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);
+
+ 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;
+
+ /* 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, NULL);
+}
+
+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;
+
+ if (!plugin_class->refine_categories_finish (plugin, result, &local_error)) {
+ finish_op (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ 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));
+ 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);
+}
+
+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..49857f3
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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..618bb2a
--- /dev/null
+++ b/lib/gs-plugin-job-list-distro-upgrades.c
@@ -0,0 +1,428 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#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 as_vercmp_simple (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;
+
+ /* 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;
+
+ /* 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, NULL);
+}
+
+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));
+ 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);
+ 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));
+ 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);
+}
+
+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..0d3b0a2
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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..2b8ee66
--- /dev/null
+++ b/lib/gs-plugin-job-manage-repository.c
@@ -0,0 +1,365 @@
+/* -*- 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+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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;
+
+ 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;
+
+ /* 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, NULL);
+}
+
+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);
+}
+
+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..86233b7
--- /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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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..9cdbbf3
--- /dev/null
+++ b/lib/gs-plugin-job-private.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) 2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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);
+GsAppListSortFunc gs_plugin_job_get_sort_func (GsPluginJob *self,
+ gpointer *user_data_out);
+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);
+
+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..f9618cd
--- /dev/null
+++ b/lib/gs-plugin-job-refine.c
@@ -0,0 +1,860 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 a call to
+ * gs_odrs_provider_refine_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.
+ *
+ * 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
+ * | | | |
+ * \-----------------------+-------------+----------------/
+ * |
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#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-job-private.h"
+#include "gs-plugin-job-refine.h"
+#include "gs-utils.h"
+
+struct _GsPluginJobRefine
+{
+ GsPluginJob parent;
+
+ /* Input data. */
+ GsAppList *app_list; /* (owned) */
+ GsPluginRefineFlags flags;
+
+ /* Output data. */
+ GsAppList *result_list; /* (owned) (nullable) */
+};
+
+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 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;
+
+ /* 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;
+
+ 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;
+ g_task_set_task_data (task, g_steal_pointer (&data_owned), (GDestroyNotify) refine_internal_data_free);
+
+ /* try to adopt each application with a plugin */
+ gs_plugin_loader_run_adopt (plugin_loader, list);
+
+ data->n_pending_ops = 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_enabled (plugin))
+ continue;
+ if (plugin_class->refine_async == NULL)
+ continue;
+
+ /* 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));
+
+ /* FIXME: The next refine_async() call is made in
+ * finish_refine_internal_op(). */
+ return;
+ }
+
+ data->n_pending_ops++;
+ finish_refine_internal_op (task, NULL);
+}
+
+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;
+
+ if (!plugin_class->refine_finish (plugin, result, &local_error)) {
+ finish_refine_internal_op (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ 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;
+
+ gs_odrs_provider_refine_finish (odrs_provider, result, &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) */
+
+ 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--;
+
+ 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_enabled (plugin))
+ continue;
+ if (plugin_class->refine_async == NULL)
+ continue;
+
+ /* 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));
+
+ /* FIXME: The next refine_async() call is made in
+ * finish_refine_internal_op(). */
+ return;
+ }
+
+ if (data->next_plugin_index == plugins->len) {
+ /* Avoid the ODRS refine 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));
+ }
+ }
+
+ if (data->n_pending_ops > 0)
+ return;
+
+ /* At this point, all the plugin->refine() calls are complete and the
+ * gs_odrs_provider_refine_async() call is 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;
+
+ run_refine_internal_finish (self, result, &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 gboolean
+app_thaw_notify_idle (gpointer data)
+{
+ GsApp *app = GS_APP (data);
+ g_object_thaw_notify (G_OBJECT (app));
+ g_object_unref (app);
+ return G_SOURCE_REMOVE;
+}
+
+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;
+ }
+
+ /* freeze all apps */
+ for (guint i = 0; i < gs_app_list_length (self->app_list); i++) {
+ GsApp *app = gs_app_list_index (self->app_list, i);
+ g_object_freeze_notify (G_OBJECT (app));
+ }
+
+ /* 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);
+ }
+ }
+ }
+
+ /* now emit all the changed signals */
+ for (guint i = 0; i < gs_app_list_length (self->app_list); i++) {
+ GsApp *app = gs_app_list_index (self->app_list, i);
+ g_idle_add (app_thaw_notify_idle, g_object_ref (app));
+ }
+
+ /* Delayed error handling. */
+ if (local_error != NULL) {
+ gs_utils_error_convert_gio (&local_error);
+ 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);
+}
+
+static gboolean
+gs_plugin_job_refine_run_finish (GsPluginJob *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ 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..ed207bc
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+#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..01c65d1
--- /dev/null
+++ b/lib/gs-plugin-job-refresh-metadata.c
@@ -0,0 +1,531 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 applications.
+ *
+ * For example, the metadata could be the list of applications available, or
+ * the list of updates, or a new set of popular applications 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+
+#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-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) */
+};
+
+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;
+
+ /* 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);
+ g_source_set_callback (self->progress_source, progress_cb, g_object_ref (self), g_object_unref);
+ 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
+ self->n_pending_ops++;
+ gs_external_appstream_refresh_async (self->cache_age_secs,
+ refresh_progress_tuple_cb,
+ &self->external_appstream_progress,
+ cancellable,
+ external_appstream_refresh_cb,
+ g_object_ref (task));
+#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;
+
+ /* 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) {
+ 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_autoptr(GError) local_error = NULL;
+ 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));
+ } else {
+ finish_op (task, NULL);
+ }
+}
+
+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
+
+ g_signal_emit (self, signals[SIGNAL_PROGRESS], 0, (guint) 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, &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;
+
+ if (!gs_odrs_provider_refresh_ratings_finish (odrs_provider, result, &local_error))
+ g_debug ("Failed to refresh ratings: %s", local_error->message);
+ /* 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++;
+
+ /* 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));
+ 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);
+}
+
+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 applications.
+ *
+ * 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..94b69c7
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#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.c b/lib/gs-plugin-job.c
new file mode 100644
index 0000000..a40980f
--- /dev/null
+++ b/lib/gs-plugin-job.c
@@ -0,0 +1,502 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib.h>
+
+#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;
+ GsAppListSortFunc sort_func;
+ gpointer sort_func_data;
+ gchar *search;
+ GsApp *app;
+ GsAppList *list;
+ GFile *file;
+ gint64 time_created;
+} GsPluginJobPrivate;
+
+enum {
+ PROP_0,
+ PROP_ACTION,
+ PROP_SEARCH,
+ PROP_REFINE_FLAGS,
+ PROP_DEDUPE_FLAGS,
+ PROP_INTERACTIVE,
+ PROP_APP,
+ PROP_LIST,
+ PROP_FILE,
+ PROP_MAX_RESULTS,
+ PROP_PROPAGATE_ERROR,
+ PROP_LAST
+};
+
+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_printf (str, "running %s",
+ gs_plugin_action_to_string (priv->action));
+ 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_sort_func (GsPluginJob *self, GsAppListSortFunc sort_func, gpointer user_data)
+{
+ GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self);
+ g_return_if_fail (GS_IS_PLUGIN_JOB (self));
+ priv->sort_func = sort_func;
+ priv->sort_func_data = user_data;
+}
+
+GsAppListSortFunc
+gs_plugin_job_get_sort_func (GsPluginJob *self, gpointer *user_data_out)
+{
+ GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self);
+ g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL);
+ if (user_data_out != NULL)
+ *user_data_out = priv->sort_func_data;
+ return priv->sort_func;
+}
+
+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;
+}
+
+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));
+ g_set_object (&priv->app, app);
+
+ /* 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, priv->app);
+}
+
+GsApp *
+gs_plugin_job_get_app (GsPluginJob *self)
+{
+ GsPluginJobPrivate *priv = gs_plugin_job_get_instance_private (self);
+ g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL);
+ return priv->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_APP:
+ g_value_set_object (value, priv->app);
+ 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_APP:
+ gs_plugin_job_set_app (self, g_value_get_object (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->app);
+ g_clear_object (&priv->list);
+ g_clear_object (&priv->file);
+ g_clear_object (&priv->plugin);
+
+ 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 ("app", NULL, NULL,
+ GS_TYPE_APP,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_APP, 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);
+}
+
+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 ();
+}
diff --git a/lib/gs-plugin-job.h b/lib/gs-plugin-job.h
new file mode 100644
index 0000000..dcdbc85
--- /dev/null
+++ b/lib/gs-plugin-job.h
@@ -0,0 +1,68 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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_sort_func (GsPluginJob *self,
+ GsAppListSortFunc sort_func,
+ gpointer user_data);
+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..2b8b39a
--- /dev/null
+++ b/lib/gs-plugin-loader-sync.c
@@ -0,0 +1,254 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 = 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_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_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 retval;
+}
diff --git a/lib/gs-plugin-loader-sync.h b/lib/gs-plugin-loader-sync.h
new file mode 100644
index 0000000..844e2aa
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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..d10b1be
--- /dev/null
+++ b/lib/gs-plugin-loader.c
@@ -0,0 +1,4172 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <locale.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <appstream.h>
+#include <math.h>
+
+#ifdef HAVE_SYSPROF
+#include <sysprof-capture.h>
+#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-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) */
+
+ 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;
+
+ GsCategoryManager *category_manager;
+ GsOdrsProvider *odrs_provider; /* (owned) (nullable) */
+
+#ifdef HAVE_SYSPROF
+ SysprofCaptureWriter *sysprof_writer; /* (owned) (nullable) */
+#endif
+
+ 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_app_from_install_queue (GsPluginLoader *plugin_loader, GsApp *app);
+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);
+
+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
+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);
+ }
+}
+
+static void
+gs_plugin_loader_helper_free (GsPluginLoaderHelper *helper)
+{
+ /* reset progress */
+ switch (gs_plugin_job_get_action (helper->plugin_job)) {
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_REMOVE:
+ case GS_PLUGIN_ACTION_UPDATE:
+ case GS_PLUGIN_ACTION_DOWNLOAD:
+ {
+ GsApp *app;
+ GsAppList *list;
+
+ app = gs_plugin_job_get_app (helper->plugin_job);
+ if (app != NULL)
+ reset_app_progress (app);
+
+ list = gs_plugin_job_get_list (helper->plugin_job);
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app_tmp = gs_app_list_index (list, i);
+ reset_app_progress (app_tmp);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ 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_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);
+}
+
+/**
+ * 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_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) {
+ g_warning ("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,
+ 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_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 (plugin_loader, plugin,
+ 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,
+ GsApp *app,
+ GsAppList *list,
+ GsPluginRefineFlags refine_flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginLoader *plugin_loader = helper->plugin_loader;
+ 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 ();
+#ifdef HAVE_SYSPROF
+ gint64 begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME;
+#endif
+
+ /* 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 (app == NULL)
+ app = gs_plugin_job_get_app (helper->plugin_job);
+ if (list == NULL)
+ list = gs_plugin_job_get_list (helper->plugin_job);
+ if (refine_flags == GS_PLUGIN_REFINE_FLAGS_NONE)
+ refine_flags = gs_plugin_job_get_refine_flags (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_UPDATE:
+ if (g_strcmp0 (helper->function_name, "gs_plugin_update_app") == 0) {
+ GsPluginActionFunc plugin_func = func;
+ ret = plugin_func (plugin, app, cancellable, &error_local);
+ } else if (g_strcmp0 (helper->function_name, "gs_plugin_update") == 0) {
+ GsPluginUpdateFunc plugin_func = func;
+ ret = plugin_func (plugin, list, cancellable, &error_local);
+ } else {
+ g_critical ("function_name %s invalid for %s",
+ helper->function_name,
+ gs_plugin_action_to_string (action));
+ }
+ break;
+ case GS_PLUGIN_ACTION_DOWNLOAD:
+ if (g_strcmp0 (helper->function_name, "gs_plugin_download_app") == 0) {
+ GsPluginActionFunc plugin_func = func;
+ ret = plugin_func (plugin, app, cancellable, &error_local);
+ } else if (g_strcmp0 (helper->function_name, "gs_plugin_download") == 0) {
+ GsPluginUpdateFunc plugin_func = func;
+ ret = plugin_func (plugin, list, cancellable, &error_local);
+ } else {
+ g_critical ("function_name %s invalid for %s",
+ helper->function_name,
+ gs_plugin_action_to_string (action));
+ }
+ break;
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_REMOVE:
+ case GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD:
+ case GS_PLUGIN_ACTION_UPGRADE_TRIGGER:
+ case GS_PLUGIN_ACTION_LAUNCH:
+ case GS_PLUGIN_ACTION_UPDATE_CANCEL:
+ {
+ GsPluginActionFunc plugin_func = func;
+ ret = plugin_func (plugin, app, cancellable, &error_local);
+ }
+ break;
+ case GS_PLUGIN_ACTION_GET_UPDATES:
+ case GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL:
+ case GS_PLUGIN_ACTION_GET_SOURCES:
+ {
+ GsPluginResultsFunc plugin_func = func;
+ ret = plugin_func (plugin, list, cancellable, &error_local);
+ }
+ break;
+ case GS_PLUGIN_ACTION_FILE_TO_APP:
+ {
+ GsPluginFileToAppFunc plugin_func = func;
+ ret = plugin_func (plugin, list,
+ gs_plugin_job_get_file (helper->plugin_job),
+ cancellable, &error_local);
+ }
+ break;
+ case GS_PLUGIN_ACTION_URL_TO_APP:
+ {
+ GsPluginUrlToAppFunc plugin_func = func;
+ ret = plugin_func (plugin, list,
+ gs_plugin_job_get_search (helper->plugin_job),
+ cancellable, &error_local);
+ }
+ break;
+ 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);
+ }
+
+ /* add app to the pending installation queue if necessary */
+ if (action == GS_PLUGIN_ACTION_INSTALL &&
+ app != NULL && gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) {
+ add_app_to_install_queue (plugin_loader, app);
+ }
+
+#ifdef HAVE_SYSPROF
+ if (plugin_loader->sysprof_writer != NULL) {
+ 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);
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - begin_time_nsec,
+ "gnome-software",
+ sysprof_name,
+ sysprof_message);
+ }
+#endif /* HAVE_SYSPROF */
+
+ /* 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_again (GsPluginJob *plugin_job,
+ GsAppList *list)
+{
+ GsAppListSortFunc sort_func;
+ gpointer sort_func_data;
+
+ /* not valid */
+ if (list == NULL)
+ return;
+
+ /* unset */
+ sort_func = gs_plugin_job_get_sort_func (plugin_job, &sort_func_data);
+ if (sort_func == NULL)
+ return;
+ gs_app_list_sort (list, sort_func, sort_func_data);
+}
+
+static void
+gs_plugin_loader_job_sorted_truncation (GsPluginJob *plugin_job,
+ GsAppList *list)
+{
+ GsAppListSortFunc sort_func;
+ gpointer sort_func_data;
+ 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));
+ sort_func = gs_plugin_job_get_sort_func (plugin_job, &sort_func_data);
+ if (sort_func == NULL) {
+ GsPluginAction action = gs_plugin_job_get_action (plugin_job);
+ g_debug ("no ->sort_func() set for %s, using random!",
+ gs_plugin_action_to_string (action));
+ gs_app_list_randomize (list);
+ } else {
+ gs_app_list_sort (list, sort_func, sort_func_data);
+ }
+ 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;
+#ifdef HAVE_SYSPROF
+ gint64 begin_time_nsec G_GNUC_UNUSED = SYSPROF_CAPTURE_CURRENT_TIME;
+#endif
+
+ /* 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);
+ 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, NULL,
+ GS_PLUGIN_REFINE_FLAGS_NONE,
+ cancellable, error)) {
+ return FALSE;
+ }
+ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED);
+ }
+
+#ifdef HAVE_SYSPROF
+ if (plugin_loader->sysprof_writer != NULL) {
+ 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);
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - begin_time_nsec,
+ "gnome-software",
+ sysprof_name,
+ sysprof_message);
+ }
+#endif /* HAVE_SYSPROF */
+
+ 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 "<invalid>";
+}
+
+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;
+}
+
+static gboolean
+gs_plugin_loader_app_is_valid_filter (GsApp *app,
+ gpointer user_data)
+{
+ GsPluginLoaderHelper *helper = (GsPluginLoaderHelper *) user_data;
+
+ return gs_plugin_loader_app_is_valid (app, gs_plugin_job_get_refine_flags (helper->plugin_job));
+}
+
+static gboolean
+gs_plugin_loader_app_is_valid_updatable (GsApp *app, gpointer user_data)
+{
+ return gs_plugin_loader_app_is_valid_filter (app, user_data) &&
+ (gs_app_is_updatable (app) || gs_app_get_state (app) == GS_APP_STATE_INSTALLING);
+}
+
+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;
+}
+
+static void
+gs_plugin_loader_pending_apps_add (GsPluginLoader *plugin_loader,
+ GsPluginLoaderHelper *helper)
+{
+ GsAppList *list = gs_plugin_job_get_list (helper->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);
+ switch (gs_plugin_job_get_action (helper->plugin_job)) {
+ case GS_PLUGIN_ACTION_INSTALL:
+ if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL)
+ add_app_to_install_queue (plugin_loader, app);
+ /* make sure the progress is properly initialized */
+ gs_app_set_progress (app, GS_APP_PROGRESS_UNKNOWN);
+ break;
+ case GS_PLUGIN_ACTION_REMOVE:
+ remove_app_from_install_queue (plugin_loader, app);
+ break;
+ default:
+ break;
+ }
+ }
+ g_idle_add (emit_pending_apps_idle, g_object_ref (plugin_loader));
+}
+
+static void
+gs_plugin_loader_pending_apps_remove (GsPluginLoader *plugin_loader,
+ GsPluginLoaderHelper *helper)
+{
+ GsAppList *list = gs_plugin_job_get_list (helper->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);
+ remove_app_from_install_queue (plugin_loader, app);
+
+ /* check the app is not still in an action helper */
+ switch (gs_app_get_state (app)) {
+ 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) {
+ 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);
+ }
+}
+
+static gboolean
+remove_app_from_install_queue (GsPluginLoader *plugin_loader, GsApp *app)
+{
+ g_autoptr(GsAppList) addons = NULL;
+ gboolean ret;
+ guint i;
+
+ g_mutex_lock (&plugin_loader->pending_apps_mutex);
+ ret = plugin_loader->pending_apps != NULL && gs_app_list_remove (plugin_loader->pending_apps, app);
+ g_mutex_unlock (&plugin_loader->pending_apps_mutex);
+
+ if (ret) {
+ g_autoptr(GSource) source = NULL;
+
+ 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 */
+ 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);
+ remove_app_from_install_queue (plugin_loader, addon);
+ }
+ }
+
+ return ret;
+}
+
+/******************************************************************************/
+
+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 *plugin,
+ GsPluginLoader *plugin_loader)
+{
+ if (plugin_loader->reload_id != 0)
+ return;
+ 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
+ GsPluginLoader *plugin_loader = g_task_get_source_object (task);
+ SetupData *data = g_task_get_task_data (task);
+#endif /* HAVE_SYSPROF */
+
+ 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);
+ }
+
+#ifdef HAVE_SYSPROF
+ if (plugin_loader->sysprof_writer != NULL) {
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ data->plugins_begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - data->plugins_begin_time_nsec,
+ "gnome-software",
+ "setup-plugin",
+ NULL);
+ }
+#endif /* HAVE_SYSPROF */
+
+ /* 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);
+
+#ifdef HAVE_SYSPROF
+ if (plugin_loader->sysprof_writer != NULL) {
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ data->setup_begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - data->setup_begin_time_nsec,
+ "gnome-software",
+ "setup",
+ NULL);
+ }
+#endif /* HAVE_SYSPROF */
+
+ /* 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->settings);
+ g_clear_object (&plugin_loader->pending_apps);
+ 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);
+
+#ifdef HAVE_SYSPROF
+ g_clear_pointer (&plugin_loader->sysprof_writer, sysprof_capture_writer_unref);
+#endif
+
+ 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_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)
+{
+ if (g_settings_get_boolean (plugin_loader->settings, "allow-updates")) {
+ g_hash_table_remove (plugin_loader->disallow_updates, plugin_loader);
+ } else {
+ g_hash_table_insert (plugin_loader->disallow_updates,
+ (gpointer) plugin_loader,
+ (gpointer) "GSettings");
+ }
+}
+
+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 = 20;
+ const gchar *locale;
+
+#ifdef HAVE_SYSPROF
+ plugin_loader->sysprof_writer = sysprof_capture_writer_new_from_env (0);
+#endif /* HAVE_SYSPROF */
+
+ 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,
+ NULL,
+ 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);
+
+ /* 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);
+
+ /* 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_app_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(GsApp) app = GS_APP (user_data);
+
+ ret = gs_plugin_loader_job_action_finish (plugin_loader,
+ res,
+ &error);
+ remove_app_from_install_queue (plugin_loader, app);
+ if (!ret) {
+ 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);
+}
+
+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(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;
+ }
+
+ for (guint i = 0; i < gs_app_list_length (old_queue); i++) {
+ GsApp *app = gs_app_list_index (old_queue, i);
+
+ if (gs_app_list_lookup (refined_queue, gs_app_get_unique_id (app)) == NULL)
+ remove_app_from_install_queue (plugin_loader, app);
+ }
+
+ for (guint i = 0; i < gs_app_list_length (refined_queue); i++) {
+ GsApp *app = gs_app_list_index (refined_queue, i);
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) {
+ plugin_job = gs_plugin_job_manage_repository_new (app,
+ GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE |
+ GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INSTALL);
+ } else {
+ /* The 'interactive' is needed for credentials prompt, otherwise it just fails */
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ "interactive", TRUE,
+ NULL);
+ }
+
+ gs_plugin_loader_job_process_async (plugin_loader, plugin_job,
+ gs_app_get_cancellable (app),
+ gs_plugin_loader_app_installed_cb,
+ g_object_ref (app));
+ }
+
+ 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);
+ for (guint i = 0; i < gs_app_list_length (obsolete); i++) {
+ GsApp *app = gs_app_list_index (obsolete, i);
+ remove_app_from_install_queue (plugin_loader, app);
+ }
+
+ 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
+generic_update_cancelled_cb (GCancellable *cancellable, gpointer data)
+{
+ GCancellable *app_cancellable = G_CANCELLABLE (data);
+ g_cancellable_cancel (app_cancellable);
+}
+
+static gboolean
+gs_plugin_loader_generic_update (GsPluginLoader *plugin_loader,
+ GsPluginLoaderHelper *helper,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint cancel_handler_id = 0;
+ GsAppList *list;
+
+ /* run each plugin, per-app version */
+ list = gs_plugin_job_get_list (helper->plugin_job);
+ for (guint i = 0; i < plugin_loader->plugins->len; i++) {
+ GsPluginActionFunc plugin_app_func = NULL;
+ GsPlugin *plugin = g_ptr_array_index (plugin_loader->plugins, i);
+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) {
+ gs_utils_error_convert_gio (error);
+ return FALSE;
+ }
+ plugin_app_func = gs_plugin_get_symbol (plugin, helper->function_name);
+ if (plugin_app_func == NULL)
+ continue;
+
+ /* for each app */
+ for (guint j = 0; j < gs_app_list_length (list); j++) {
+ GCancellable *app_cancellable;
+ GsApp *app = gs_app_list_index (list, j);
+ gboolean ret;
+ g_autoptr(GError) error_local = NULL;
+
+ /* if the whole operation should be cancelled */
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ return FALSE;
+
+ /* already installed? */
+ if (gs_app_get_state (app) == GS_APP_STATE_INSTALLED)
+ continue;
+
+ /* make sure that the app update is cancelled when the whole op is cancelled */
+ app_cancellable = gs_app_get_cancellable (app);
+ cancel_handler_id = g_cancellable_connect (cancellable,
+ G_CALLBACK (generic_update_cancelled_cb),
+ g_object_ref (app_cancellable),
+ g_object_unref);
+
+ gs_plugin_job_set_app (helper->plugin_job, app);
+ ret = plugin_app_func (plugin, app, app_cancellable, &error_local);
+ g_cancellable_disconnect (cancellable, cancel_handler_id);
+
+ if (!ret) {
+ if (!gs_plugin_error_handle_failure (helper,
+ plugin,
+ error_local,
+ error)) {
+ return FALSE;
+ }
+ }
+ }
+ helper->anything_ran = TRUE;
+ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_FINISHED);
+ }
+
+ if (gs_plugin_job_get_action (helper->plugin_job) == GS_PLUGIN_ACTION_UPDATE)
+ gs_utils_set_online_updates_timestamp (plugin_loader->settings);
+
+ return TRUE;
+}
+
+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_thread_cb (GTask *task,
+ gpointer object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ GError *error = NULL;
+ GsPluginLoaderHelper *helper = (GsPluginLoaderHelper *) task_data;
+ 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 (object);
+ gboolean add_to_pending_array = FALSE;
+ g_autoptr(GMainContext) context = g_main_context_new ();
+ g_autoptr(GMainContextPusher) pusher = g_main_context_pusher_new (context);
+ g_autofree gchar *job_debug = NULL;
+#ifdef HAVE_SYSPROF
+ gint64 begin_time_nsec G_GNUC_UNUSED = SYSPROF_CAPTURE_CURRENT_TIME;
+#endif
+
+ /* these change the pending count on the installed panel */
+ switch (action) {
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_REMOVE:
+ add_to_pending_array = TRUE;
+ break;
+ default:
+ break;
+ }
+
+ /* add to pending list */
+ if (add_to_pending_array)
+ gs_plugin_loader_pending_apps_add (plugin_loader, helper);
+
+ /* run each plugin */
+ if (!GS_IS_PLUGIN_JOB_REFINE (helper->plugin_job)) {
+ if (!gs_plugin_loader_run_results (helper, cancellable, &error)) {
+ if (add_to_pending_array) {
+ gs_app_set_state_recover (gs_plugin_job_get_app (helper->plugin_job));
+ gs_plugin_loader_pending_apps_remove (plugin_loader, helper);
+ }
+ gs_utils_error_convert_gio (&error);
+ g_task_return_error (task, error);
+ return;
+ }
+
+ if (action == GS_PLUGIN_ACTION_URL_TO_APP) {
+ const gchar *search = gs_plugin_job_get_search (helper->plugin_job);
+ if (search && g_ascii_strncasecmp (search, "file://", 7) == 0 && (
+ gs_plugin_job_get_list (helper->plugin_job) == NULL ||
+ gs_app_list_length (gs_plugin_job_get_list (helper->plugin_job)) == 0)) {
+ g_autoptr(GError) local_error = NULL;
+ g_autoptr(GFile) file = NULL;
+ file = g_file_new_for_uri (search);
+ gs_plugin_job_set_action (helper->plugin_job, GS_PLUGIN_ACTION_FILE_TO_APP);
+ gs_plugin_job_set_file (helper->plugin_job, file);
+ helper->function_name = gs_plugin_action_to_function_name (GS_PLUGIN_ACTION_FILE_TO_APP);
+ if (gs_plugin_loader_run_results (helper, cancellable, &local_error)) {
+ for (guint j = 0; j < gs_app_list_length (list); j++) {
+ GsApp *app = gs_app_list_index (list, j);
+ if (gs_app_get_local_file (app) == NULL)
+ gs_app_set_local_file (app, gs_plugin_job_get_file (helper->plugin_job));
+ }
+ } else {
+ g_debug ("Failed to convert file:// URI to app using file-to-app action: %s", local_error->message);
+ }
+ gs_plugin_job_set_action (helper->plugin_job, GS_PLUGIN_ACTION_URL_TO_APP);
+ gs_plugin_job_set_file (helper->plugin_job, NULL);
+ }
+ }
+ }
+
+ /* run per-app version */
+ if (action == GS_PLUGIN_ACTION_UPDATE) {
+ helper->function_name = "gs_plugin_update_app";
+ if (!gs_plugin_loader_generic_update (plugin_loader, helper,
+ cancellable, &error)) {
+ gs_utils_error_convert_gio (&error);
+ g_task_return_error (task, error);
+ return;
+ }
+ } else if (action == GS_PLUGIN_ACTION_DOWNLOAD) {
+ helper->function_name = "gs_plugin_download_app";
+ if (!gs_plugin_loader_generic_update (plugin_loader, helper,
+ cancellable, &error)) {
+ gs_utils_error_convert_gio (&error);
+ g_task_return_error (task, error);
+ return;
+ }
+ }
+
+ if (action == GS_PLUGIN_ACTION_UPGRADE_TRIGGER)
+ gs_utils_set_online_updates_timestamp (plugin_loader->settings);
+
+ /* remove from pending list */
+ if (add_to_pending_array)
+ gs_plugin_loader_pending_apps_remove (plugin_loader, helper);
+
+ /* some functions are really required for proper operation */
+ switch (action) {
+ case GS_PLUGIN_ACTION_GET_UPDATES:
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_DOWNLOAD:
+ case GS_PLUGIN_ACTION_LAUNCH:
+ case GS_PLUGIN_ACTION_REMOVE:
+ case GS_PLUGIN_ACTION_UPDATE:
+ if (!helper->anything_ran) {
+ g_set_error (&error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no plugin could handle %s",
+ gs_plugin_action_to_string (action));
+ g_task_return_error (task, error);
+ return;
+ }
+ break;
+ default:
+ 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));
+ }
+ break;
+ }
+
+ /* unstage addons */
+ if (add_to_pending_array) {
+ g_autoptr(GsAppList) addons = gs_app_dup_addons (gs_plugin_job_get_app (helper->plugin_job));
+
+ for (guint 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))
+ gs_app_set_to_be_installed (addon, FALSE);
+ }
+ }
+
+ /* filter to reduce to a sane set */
+ gs_plugin_loader_job_sorted_truncation (helper->plugin_job, list);
+
+ /* set the local file on any of the returned results */
+ switch (action) {
+ case GS_PLUGIN_ACTION_FILE_TO_APP:
+ for (guint j = 0; j < gs_app_list_length (list); j++) {
+ GsApp *app = gs_app_list_index (list, j);
+ if (gs_app_get_local_file (app) == NULL)
+ gs_app_set_local_file (app, gs_plugin_job_get_file (helper->plugin_job));
+ }
+ default:
+ break;
+ }
+
+ /* pick up new source id */
+ switch (action) {
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_REMOVE:
+ gs_plugin_job_add_refine_flags (helper->plugin_job,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION);
+ break;
+ default:
+ break;
+ }
+
+ /* 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));
+ 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");
+ }
+
+ /* check the local files have an icon set */
+ switch (action) {
+ case GS_PLUGIN_ACTION_URL_TO_APP:
+ case GS_PLUGIN_ACTION_FILE_TO_APP: {
+ g_autoptr(GsPluginJob) refine_job = NULL;
+ g_autoptr(GAsyncResult) refine_result = NULL;
+ g_autoptr(GsAppList) new_list = NULL;
+
+ for (guint j = 0; j < gs_app_list_length (list); j++) {
+ GsApp *app = gs_app_list_index (list, j);
+ if (gs_app_get_icons (app) == NULL) {
+ 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);
+ }
+ }
+
+ refine_job = gs_plugin_job_refine_new (list, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON | 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));
+ 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);
+
+ break;
+ }
+ default:
+ break;
+ }
+
+ /* filter package list */
+ switch (action) {
+ case GS_PLUGIN_ACTION_URL_TO_APP:
+ gs_app_list_filter (list, gs_plugin_loader_app_is_valid_filter, helper);
+ break;
+ case GS_PLUGIN_ACTION_GET_UPDATES:
+ gs_app_list_filter (list, gs_plugin_loader_app_is_valid_updatable, helper);
+ break;
+ default:
+ break;
+ }
+
+ /* only allow one result */
+ if (action == GS_PLUGIN_ACTION_URL_TO_APP ||
+ action == GS_PLUGIN_ACTION_FILE_TO_APP) {
+ if (gs_app_list_length (list) == 0) {
+ g_autofree gchar *str = gs_plugin_job_to_string (helper->plugin_job);
+ g_autoptr(GError) error_local = NULL;
+ g_set_error (&error_local,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no application was created for %s", str);
+ if (!gs_plugin_job_get_propagate_error (helper->plugin_job))
+ gs_plugin_loader_claim_job_error (plugin_loader, NULL, helper->plugin_job, error_local);
+ g_task_return_error (task, g_steal_pointer (&error_local));
+ return;
+ }
+ if (gs_app_list_length (list) > 1) {
+ g_autofree gchar *str = gs_plugin_job_to_string (helper->plugin_job);
+ g_debug ("more than one application was created for %s", str);
+ }
+ }
+
+ /* 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);
+
+ /* sort these again as the refine may have added useful metadata */
+ gs_plugin_loader_job_sorted_truncation_again (helper->plugin_job, list);
+
+#ifdef HAVE_SYSPROF
+ if (plugin_loader->sysprof_writer != NULL) {
+ g_autofree gchar *sysprof_name = g_strconcat ("process-thread:", gs_plugin_action_to_string (action), NULL);
+ g_autofree gchar *sysprof_message = gs_plugin_job_to_string (helper->plugin_job);
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - begin_time_nsec,
+ "gnome-software",
+ sysprof_name,
+ sysprof_message);
+ }
+#endif /* HAVE_SYSPROF */
+
+ /* 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);
+}
+
+static void
+gs_plugin_loader_process_in_thread_pool_cb (gpointer data,
+ gpointer user_data)
+{
+ GTask *task = data;
+ gpointer source_object = g_task_get_source_object (task);
+ gpointer task_data = g_task_get_task_data (task);
+ GCancellable *cancellable = g_task_get_cancellable (task);
+ 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_thread_cb (task, source_object, task_data, cancellable);
+
+ /* 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);
+
+ if (action == GS_PLUGIN_ACTION_INSTALL &&
+ gs_app_get_state (app) != GS_APP_STATE_AVAILABLE_LOCAL)
+ add_app_to_install_queue (plugin_loader, app);
+ }
+ 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);
+ g_autoptr(GError) local_error = NULL;
+#ifdef HAVE_SYSPROF
+ GsPluginLoader *plugin_loader = g_task_get_source_object (task);
+ gint64 begin_time_nsec = GPOINTER_TO_SIZE (g_task_get_task_data (task));
+
+ if (plugin_loader->sysprof_writer != NULL) {
+ g_autofree gchar *sysprof_name = g_strconcat ("process-thread:", G_OBJECT_TYPE_NAME (plugin_job), NULL);
+ g_autofree gchar *sysprof_message = gs_plugin_job_to_string (plugin_job);
+ sysprof_capture_writer_add_mark (plugin_loader->sysprof_writer,
+ begin_time_nsec,
+ sched_getcpu (),
+ getpid (),
+ SYSPROF_CAPTURE_CURRENT_TIME - begin_time_nsec,
+ "gnome-software",
+ sysprof_name,
+ sysprof_message);
+ }
+#endif /* HAVE_SYSPROF */
+
+ /* 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)) {
+ 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_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_MANAGE_REPOSITORY (plugin_job) ||
+ GS_IS_PLUGIN_JOB_LIST_CATEGORIES (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);
+ }
+ }
+
+ 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);
+
+ /* 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
+
+ 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;
+ }
+
+ /* deal with the install queue */
+ if (action == GS_PLUGIN_ACTION_REMOVE) {
+ if (remove_app_from_install_queue (plugin_loader, gs_plugin_job_get_app (plugin_job))) {
+ GsAppList *list = gs_plugin_job_get_list (plugin_job);
+ g_task_return_pointer (task, g_object_ref (list), (GDestroyNotify) g_object_unref);
+ 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);
+ }
+
+ /* FIXME: this is probably a bug */
+ if (action == GS_PLUGIN_ACTION_GET_SOURCES) {
+ gs_plugin_job_add_refine_flags (plugin_job,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION);
+ }
+
+ /* check required args */
+ switch (action) {
+ case GS_PLUGIN_ACTION_URL_TO_APP:
+ if (gs_plugin_job_get_search (plugin_job) == NULL) {
+ g_task_return_new_error (task,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no valid search terms");
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* 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_INSTALL:
+ case GS_PLUGIN_ACTION_UPDATE:
+ 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:
+ break;
+ }
+
+ /* run in a thread */
+ g_task_run_in_thread (task, gs_plugin_loader_process_thread_cb);
+}
+
+/******************************************************************************/
+
+/**
+ * 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_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..93a44d6
--- /dev/null
+++ b/lib/gs-plugin-loader.h
@@ -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) 2007-2017 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2015-2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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-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_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);
+
+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..3a44856
--- /dev/null
+++ b/lib/gs-plugin-private.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) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gio.h>
+#include <glib-object.h>
+#include <gmodule.h>
+
+#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);
+
+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-plugin-types.h b/lib/gs-plugin-types.h
new file mode 100644
index 0000000..59504be
--- /dev/null
+++ b/lib/gs-plugin-types.h
@@ -0,0 +1,319 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+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;
+
+/**
+ * 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 application
+ * @GS_PLUGIN_ACTION_REMOVE: Remove an application
+ * @GS_PLUGIN_ACTION_UPDATE: Update an application
+ * @GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD: Download a distro upgrade
+ * @GS_PLUGIN_ACTION_UPGRADE_TRIGGER: Trigger a distro upgrade
+ * @GS_PLUGIN_ACTION_LAUNCH: Launch an application
+ * @GS_PLUGIN_ACTION_UPDATE_CANCEL: Cancel the update
+ * @GS_PLUGIN_ACTION_GET_UPDATES: Get the list of updates
+ * @GS_PLUGIN_ACTION_GET_SOURCES: Get the list of sources
+ * @GS_PLUGIN_ACTION_FILE_TO_APP: Convert the file to an application
+ * @GS_PLUGIN_ACTION_URL_TO_APP: Convert the URI to an application
+ * @GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL: Get the list of historical updates
+ * @GS_PLUGIN_ACTION_DOWNLOAD: Download an application
+ * @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_REMOVE,
+ GS_PLUGIN_ACTION_UPDATE,
+ GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ GS_PLUGIN_ACTION_UPGRADE_TRIGGER,
+ GS_PLUGIN_ACTION_LAUNCH,
+ GS_PLUGIN_ACTION_UPDATE_CANCEL,
+ GS_PLUGIN_ACTION_GET_UPDATES,
+ GS_PLUGIN_ACTION_GET_SOURCES,
+ GS_PLUGIN_ACTION_FILE_TO_APP,
+ GS_PLUGIN_ACTION_URL_TO_APP,
+ GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL,
+ GS_PLUGIN_ACTION_DOWNLOAD,
+ 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..39093f5
--- /dev/null
+++ b/lib/gs-plugin-vfuncs.h
@@ -0,0 +1,429 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+/**
+ * SECTION:gs-plugin-vfuncs
+ * @title: GsPlugin Exports
+ * @include: gnome-software.h
+ * @stability: Unstable
+ * @short_description: Vfuncs that plugins can implement
+ */
+
+#include <appstream.h>
+#include <glib-object.h>
+#include <gmodule.h>
+#include <gio/gio.h>
+#include <libsoup/soup.h>
+
+#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 application means other plugins will not try to perform actions
+ * such as install, remove or update. Most applications are claimed when they
+ * are created.
+ *
+ * If a plugin can adopt this application then it should call
+ * gs_app_set_management_plugin() on @app.
+ **/
+void gs_plugin_adopt_app (GsPlugin *plugin,
+ GsApp *app);
+
+/**
+ * gs_plugin_add_updates:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of updates.
+ *
+ * NOTE: Actually downloading the updates can be done in gs_plugin_download_app()
+ * or in gs_plugin_download().
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_sources:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * 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.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_add_updates_historical
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Get the list of historical updates, i.e. the updates that have just been
+ * installed.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_add_updates_historical (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_launch:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Launch the specified application using a plugin-specific method.
+ * This is normally setting some environment or launching a specific binary.
+ *
+ * Plugins can simply use gs_plugin_app_launch() if no plugin-specific
+ * functionality is required.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update_cancel:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Cancels the offline update of @app.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update_cancel (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_install:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Install the application.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * 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().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %GS_APP_STATE_INSTALLED.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_remove:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Remove the application.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * 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().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %GS_APP_STATE_AVAILABLE or %GS_APP_STATE_UNKNOWN if not known.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update_app:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Update the application live.
+ *
+ * Plugins are expected to send progress notifications to the UI using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * 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().
+ *
+ * NOTE: Once the action is complete, the plugin must set the new state of @app
+ * to %GS_APP_STATE_INSTALLED or %GS_APP_STATE_UNKNOWN if not known.
+ *
+ * If %GS_APP_QUIRK_IS_PROXY is set on the application then the actual #GsApp
+ * set in @app will be the related application of the parent. Plugins do not
+ * need to manually iterate on the related list of applications.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_download_app:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads the application 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 using
+ * gs_app_set_progress() using the passed in @app.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * If the @app is already downloaded, do not return an error and return %TRUE.
+ *
+ * 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().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_download_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_download:
+ * @plugin: a #GsPlugin
+ * @apps: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads a list of applications 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.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_download (GsPlugin *plugin,
+ GsAppList *apps,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_upgrade_download:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Starts downloading a distribution upgrade in the background.
+ *
+ * All functions can block, but should sent progress notifications, e.g. using
+ * gs_app_set_progress() if they will take more than tens of milliseconds
+ * to complete.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_upgrade_download (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_app_upgrade_trigger:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, with kind %AS_COMPONENT_KIND_OPERATING_SYSTEM
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Triggers the distribution upgrade to be installed on next boot.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_app_upgrade_trigger (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_file_to_app:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @file: a #GFile
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Converts a local file to a #GsApp. It's expected that only one plugin will
+ * match the mimetype of @file and that a single #GsApp will be in the returned
+ * list. If no plugins can handle the file, the list will be empty.
+ *
+ * For example, the PackageKit plugin can turn a .rpm file into a application
+ * of kind %AS_COMPONENT_KIND_UNKNOWN but that in some cases it will be further refined
+ * into a %AS_COMPONENT_KIND_DESKTOP_APP (with all the extra metadata) by the appstream
+ * plugin.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_url_to_app:
+ * @plugin: a #GsPlugin
+ * @list: a #GsAppList
+ * @url: a #URL, e.g. "apt://gimp"
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Converts a URL to a #GsApp. It's expected that only one plugin will
+ * match the scheme of @url and that a single #GsApp will be in the returned
+ * list. If no plugins can handle the file, the list will be empty.
+ *
+ * For example, the apt plugin can turn apt://gimp into a application.
+ *
+ * Plugins are expected to add new apps using gs_app_list_add().
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * gs_plugin_update:
+ * @plugin: a #GsPlugin
+ * @apps: a #GsAppList
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Updates a list of applications, typically scheduling them for offline update.
+ *
+ * Returns: %TRUE for success or if not relevant
+ **/
+gboolean gs_plugin_update (GsPlugin *plugin,
+ GsAppList *apps,
+ GCancellable *cancellable,
+ GError **error);
+
+/**
+ * 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..51e0f7e
--- /dev/null
+++ b/lib/gs-plugin.c
@@ -0,0 +1,2187 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <gio/gdesktopappinfo.h>
+#include <gdk/gdk.h>
+#include <string.h>
+
+#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_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);
+ priv->scale = 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 gboolean
+gs_plugin_app_launch_cb (gpointer user_data)
+{
+ GAppInfo *appinfo = (GAppInfo *) user_data;
+ GdkDisplay *display;
+ g_autoptr(GAppLaunchContext) context = NULL;
+ g_autoptr(GError) error = NULL;
+
+ display = gdk_display_get_default ();
+ context = G_APP_LAUNCH_CONTEXT (gdk_display_get_app_launch_context (display));
+ if (!g_app_info_launch (appinfo, NULL, context, &error))
+ g_warning ("Failed to launch: %s", error->message);
+
+ return G_SOURCE_REMOVE;
+}
+
+/**
+ * gs_plugin_app_launch:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @error: a #GError, or %NULL
+ *
+ * Launches the application using #GAppInfo.
+ *
+ * Returns: %TRUE for success
+ *
+ * Since: 3.22
+ **/
+gboolean
+gs_plugin_app_launch (GsPlugin *plugin, GsApp *app, GError **error)
+{
+ const gchar *desktop_id;
+ g_autoptr(GAppInfo) appinfo = NULL;
+
+ desktop_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID);
+ if (desktop_id == NULL)
+ desktop_id = gs_app_get_id (app);
+ if (desktop_id == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no such desktop file: %s",
+ desktop_id);
+ return FALSE;
+ }
+ appinfo = G_APP_INFO (gs_utils_get_desktop_app_info (desktop_id));
+ if (appinfo == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no such desktop file: %s",
+ desktop_id);
+ return FALSE;
+ }
+ g_idle_add_full (G_PRIORITY_DEFAULT,
+ gs_plugin_app_launch_cb,
+ g_object_ref (appinfo),
+ (GDestroyNotify) g_object_unref);
+ return TRUE;
+}
+
+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;
+
+ filename = g_build_filename (data_dir, "applications", desktop_id, NULL);
+ key_file = g_key_file_new ();
+
+ if (g_key_file_load_from_file (key_file, filename, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) &&
+ cb (plugin, app, filename, key_file)) {
+ g_autoptr(GDesktopAppInfo) appinfo = NULL;
+ appinfo = g_desktop_app_info_new_from_keyfile (key_file);
+ if (appinfo != NULL)
+ return g_steal_pointer (&appinfo);
+ g_debug ("Failed to load '%s' as a GDesktopAppInfo", filename);
+ return NULL;
+ }
+
+ if (!g_str_has_suffix (desktop_id, ".desktop")) {
+ g_autofree gchar *desktop_filename = g_strconcat (filename, ".desktop", NULL);
+ if (g_key_file_load_from_file (key_file, desktop_filename, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) &&
+ cb (plugin, app, desktop_filename, key_file)) {
+ g_autoptr(GDesktopAppInfo) appinfo = NULL;
+ appinfo = g_desktop_app_info_new_from_keyfile (key_file);
+ if (appinfo != NULL)
+ return g_steal_pointer (&appinfo);
+ g_debug ("Failed to load '%s' as a GDesktopAppInfo", desktop_filename);
+ return NULL;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * gs_plugin_app_launch_filtered:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp to launch
+ * @cb: a callback to pick the correct .desktop file
+ * @user_data: (closure cb) (scope call): user data for the @cb
+ * @error: a #GError, or %NULL
+ *
+ * Launches application @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).
+ *
+ * Returns: %TRUE on success
+ *
+ * Since: 43
+ **/
+gboolean
+gs_plugin_app_launch_filtered (GsPlugin *plugin,
+ GsApp *app,
+ GsPluginPickDesktopFileCallback cb,
+ gpointer user_data,
+ GError **error)
+{
+ const gchar *desktop_id;
+ g_autoptr(GDesktopAppInfo) appinfo = NULL;
+
+ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
+ g_return_val_if_fail (GS_IS_APP (app), FALSE);
+ g_return_val_if_fail (cb != NULL, FALSE);
+
+ desktop_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID);
+ if (desktop_id == NULL)
+ desktop_id = gs_app_get_id (app);
+ if (desktop_id == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no desktop file for app: %s",
+ gs_app_get_name (app));
+ return FALSE;
+ }
+
+ /* First, the configs. Highest priority: the user's ~/.config */
+ appinfo = check_directory_for_desktop_file (plugin, app, 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, app, 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, app, 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, app, cb, user_data, desktop_id, dirs[i]);
+ }
+ }
+
+ if (appinfo == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no appropriate desktop file found: %s",
+ desktop_id);
+ return FALSE;
+ }
+
+ g_idle_add_full (G_PRIORITY_DEFAULT,
+ gs_plugin_app_launch_cb,
+ g_object_ref (appinfo),
+ (GDestroyNotify) g_object_unref);
+
+ return TRUE;
+}
+
+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);
+}
+
+typedef struct {
+ GsPlugin *plugin;
+ GsApp *app;
+} GsPluginDownloadHelper;
+
+static void
+download_file_progress_cb (gsize total_written_bytes,
+ gsize total_download_size,
+ gpointer user_data)
+{
+ GsPluginDownloadHelper *helper = user_data;
+ guint percentage;
+
+ if (total_download_size > 0)
+ percentage = (guint) ((100 * total_written_bytes) / total_download_size);
+ else
+ percentage = 0;
+
+ g_debug ("%s progress: %u%%", gs_app_get_id (helper->app), percentage);
+ gs_app_set_progress (helper->app, percentage);
+ gs_plugin_status_update (helper->plugin,
+ helper->app,
+ GS_PLUGIN_STATUS_DOWNLOADING);
+
+}
+
+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_plugin_download_file:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, or %NULL
+ * @uri: a remote URI
+ * @filename: a local filename
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads data and saves it to a file.
+ *
+ * Returns: %TRUE for success
+ *
+ * Since: 3.22
+ **/
+gboolean
+gs_plugin_download_file (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *uri,
+ const gchar *filename,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(SoupSession) soup_session = NULL;
+ g_autoptr(GFile) output_file = 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);
+ GsPluginDownloadHelper helper;
+ g_autoptr(GError) local_error = NULL;
+
+ helper.plugin = plugin;
+ helper.app = app;
+
+ soup_session = gs_build_soup_session ();
+
+ /* Do the download. */
+ output_file = g_file_new_for_path (filename);
+ gs_download_file_async (soup_session, uri, output_file,
+ G_PRIORITY_LOW,
+ download_file_progress_cb, &helper,
+ cancellable, async_result_cb, &result);
+
+ while (result == NULL)
+ g_main_context_iteration (context, TRUE);
+
+ if (!gs_download_file_finish (soup_session, result, &local_error) &&
+ !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_DOWNLOAD_FAILED,
+ local_error->message);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gchar *
+gs_plugin_download_rewrite_resource_uri (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *cachefn = NULL;
+
+ /* local files */
+ if (g_str_has_prefix (uri, "file://"))
+ uri += 7;
+ if (g_str_has_prefix (uri, "/")) {
+ if (!g_file_test (uri, G_FILE_TEST_EXISTS)) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "Failed to find file: %s", uri);
+ return NULL;
+ }
+ return g_strdup (uri);
+ }
+
+ /* get cache location */
+ cachefn = gs_utils_get_cache_filename ("cssresource", uri,
+ GS_UTILS_CACHE_FLAG_WRITEABLE |
+ GS_UTILS_CACHE_FLAG_USE_HASH |
+ GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY,
+ error);
+ if (cachefn == NULL)
+ return NULL;
+
+ /* already exists */
+ if (g_file_test (cachefn, G_FILE_TEST_EXISTS))
+ return g_steal_pointer (&cachefn);
+
+ /* download */
+ if (!gs_plugin_download_file (plugin, app, uri, cachefn,
+ cancellable, error)) {
+ return NULL;
+ }
+ return g_steal_pointer (&cachefn);
+}
+
+/**
+ * gs_plugin_download_rewrite_resource:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp, or %NULL
+ * @resource: the CSS resource
+ * @cancellable: a #GCancellable, or %NULL
+ * @error: a #GError, or %NULL
+ *
+ * Downloads remote assets and rewrites a CSS resource to use cached local URIs.
+ *
+ * Returns: %TRUE for success
+ *
+ * Since: 3.26
+ **/
+gchar *
+gs_plugin_download_rewrite_resource (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint start = 0;
+ g_autoptr(GString) resource_str = g_string_new (resource);
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL);
+ g_return_val_if_fail (resource != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ /* replace datadir */
+ as_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 (str, resource[i]);
+ continue;
+ }
+ if (resource[i] == ')') {
+ guint len;
+ g_autofree gchar *cachefn = NULL;
+ g_autofree gchar *uri = NULL;
+
+ /* 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 */
+ cachefn = gs_plugin_download_rewrite_resource_uri (plugin,
+ app,
+ uri,
+ cancellable,
+ error);
+ if (cachefn == NULL)
+ return NULL;
+ g_string_append_printf (str, "'file://%s'", cachefn);
+ g_string_append_c (str, resource[i]);
+ start = 0;
+ }
+ }
+ return g_strdup (str->str);
+}
+
+/**
+ * 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_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, e.g. %GS_PLUGIN_ACTION_INSTALL
+ *
+ * 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_INSTALL)
+ return "gs_plugin_app_install";
+ if (action == GS_PLUGIN_ACTION_REMOVE)
+ return "gs_plugin_app_remove";
+ if (action == GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD)
+ return "gs_plugin_app_upgrade_download";
+ if (action == GS_PLUGIN_ACTION_UPGRADE_TRIGGER)
+ return "gs_plugin_app_upgrade_trigger";
+ if (action == GS_PLUGIN_ACTION_LAUNCH)
+ return "gs_plugin_launch";
+ if (action == GS_PLUGIN_ACTION_UPDATE_CANCEL)
+ return "gs_plugin_update_cancel";
+ if (action == GS_PLUGIN_ACTION_UPDATE)
+ return "gs_plugin_update";
+ if (action == GS_PLUGIN_ACTION_DOWNLOAD)
+ return "gs_plugin_download";
+ if (action == GS_PLUGIN_ACTION_FILE_TO_APP)
+ return "gs_plugin_file_to_app";
+ if (action == GS_PLUGIN_ACTION_URL_TO_APP)
+ return "gs_plugin_url_to_app";
+ if (action == GS_PLUGIN_ACTION_GET_SOURCES)
+ return "gs_plugin_add_sources";
+ if (action == GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL)
+ return "gs_plugin_add_updates_historical";
+ if (action == GS_PLUGIN_ACTION_GET_UPDATES)
+ return "gs_plugin_add_updates";
+ if (action == GS_PLUGIN_ACTION_GET_LANGPACKS)
+ return "gs_plugin_add_langpacks";
+ return NULL;
+}
+
+/**
+ * gs_plugin_action_to_string:
+ * @action: a #GsPluginAction, e.g. %GS_PLUGIN_ACTION_INSTALL
+ *
+ * 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_INSTALL)
+ return "install";
+ if (action == GS_PLUGIN_ACTION_DOWNLOAD)
+ return "download";
+ if (action == GS_PLUGIN_ACTION_REMOVE)
+ return "remove";
+ if (action == GS_PLUGIN_ACTION_UPDATE)
+ return "update";
+ if (action == GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD)
+ return "upgrade-download";
+ if (action == GS_PLUGIN_ACTION_UPGRADE_TRIGGER)
+ return "upgrade-trigger";
+ if (action == GS_PLUGIN_ACTION_LAUNCH)
+ return "launch";
+ if (action == GS_PLUGIN_ACTION_UPDATE_CANCEL)
+ return "update-cancel";
+ if (action == GS_PLUGIN_ACTION_GET_UPDATES)
+ return "get-updates";
+ if (action == GS_PLUGIN_ACTION_GET_SOURCES)
+ return "get-sources";
+ 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_UPDATES_HISTORICAL)
+ return "get-updates-historical";
+ 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, e.g. %GS_PLUGIN_ACTION_INSTALL
+ *
+ * Since: 3.26
+ **/
+GsPluginAction
+gs_plugin_action_from_string (const gchar *action)
+{
+ if (g_strcmp0 (action, "install") == 0)
+ return GS_PLUGIN_ACTION_INSTALL;
+ if (g_strcmp0 (action, "download") == 0)
+ return GS_PLUGIN_ACTION_DOWNLOAD;
+ if (g_strcmp0 (action, "remove") == 0)
+ return GS_PLUGIN_ACTION_REMOVE;
+ if (g_strcmp0 (action, "update") == 0)
+ return GS_PLUGIN_ACTION_UPDATE;
+ if (g_strcmp0 (action, "upgrade-download") == 0)
+ return GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD;
+ if (g_strcmp0 (action, "upgrade-trigger") == 0)
+ return GS_PLUGIN_ACTION_UPGRADE_TRIGGER;
+ if (g_strcmp0 (action, "launch") == 0)
+ return GS_PLUGIN_ACTION_LAUNCH;
+ if (g_strcmp0 (action, "update-cancel") == 0)
+ return GS_PLUGIN_ACTION_UPDATE_CANCEL;
+ if (g_strcmp0 (action, "get-updates") == 0)
+ return GS_PLUGIN_ACTION_GET_UPDATES;
+ if (g_strcmp0 (action, "get-sources") == 0)
+ return GS_PLUGIN_ACTION_GET_SOURCES;
+ 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-updates-historical") == 0)
+ return GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL;
+ 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 ();
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID)
+ g_ptr_array_add (cstrs, "require-id");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE)
+ g_ptr_array_add (cstrs, "require-license");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL)
+ g_ptr_array_add (cstrs, "require-url");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION)
+ g_ptr_array_add (cstrs, "require-description");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE)
+ g_ptr_array_add (cstrs, "require-size");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RATING)
+ g_ptr_array_add (cstrs, "require-rating");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION)
+ g_ptr_array_add (cstrs, "require-version");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_HISTORY)
+ g_ptr_array_add (cstrs, "require-history");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION)
+ g_ptr_array_add (cstrs, "require-setup-action");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS)
+ g_ptr_array_add (cstrs, "require-update-details");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN)
+ g_ptr_array_add (cstrs, "require-origin");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED)
+ g_ptr_array_add (cstrs, "require-related");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS)
+ g_ptr_array_add (cstrs, "require-addons");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES)
+ g_ptr_array_add (cstrs, "require-allow-packages");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY)
+ g_ptr_array_add (cstrs, "require-update-severity");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPGRADE_REMOVED)
+ g_ptr_array_add (cstrs, "require-upgrade-removed");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE)
+ g_ptr_array_add (cstrs, "require-provenance");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS)
+ g_ptr_array_add (cstrs, "require-reviews");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEW_RATINGS)
+ g_ptr_array_add (cstrs, "require-review-ratings");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON)
+ g_ptr_array_add (cstrs, "require-icon");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PERMISSIONS)
+ g_ptr_array_add (cstrs, "require-permissions");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME)
+ g_ptr_array_add (cstrs, "require-origin-hostname");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI)
+ g_ptr_array_add (cstrs, "require-origin-ui");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME)
+ g_ptr_array_add (cstrs, "require-runtime");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS)
+ g_ptr_array_add (cstrs, "require-screenshots");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES)
+ g_ptr_array_add (cstrs, "require-categories");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROJECT_GROUP)
+ g_ptr_array_add (cstrs, "require-project-group");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_DEVELOPER_NAME)
+ g_ptr_array_add (cstrs, "require-developer-name");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS)
+ g_ptr_array_add (cstrs, "require-kudos");
+ if (refine_flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_CONTENT_RATING)
+ g_ptr_array_add (cstrs, "content-rating");
+#pragma GCC diagnostic pop
+ 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_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_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: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..87dd858
--- /dev/null
+++ b/lib/gs-plugin.h
@@ -0,0 +1,331 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gmodule.h>
+#include <gio/gio.h>
+
+#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 applications 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)
+ *
+ * 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);
+
+ 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_download_file (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *uri,
+ const gchar *filename,
+ GCancellable *cancellable,
+ GError **error);
+gchar *gs_plugin_download_rewrite_resource (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error);
+
+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);
+void gs_plugin_status_update (GsPlugin *plugin,
+ GsApp *app,
+ GsPluginStatus status);
+gboolean gs_plugin_app_launch (GsPlugin *plugin,
+ GsApp *app,
+ GError **error);
+typedef gboolean (* GsPluginPickDesktopFileCallback) (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *filename,
+ GKeyFile *key_file);
+/**
+ * GsPluginPickDesktopFileCallback:
+ * @plugin: a #GsPlugin
+ * @app: a #GsApp
+ * @filename: a .desktop file name
+ * @key_file: a #GKeyFile with @filename loaded
+ *
+ * A callback used by gs_plugin_app_launch_filtered() 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
+ **/
+gboolean gs_plugin_app_launch_filtered (GsPlugin *plugin,
+ GsApp *app,
+ GsPluginPickDesktopFileCallback cb,
+ gpointer user_data,
+ 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);
+
+G_END_DECLS
diff --git a/lib/gs-remote-icon.c b/lib/gs-remote-icon.c
new file mode 100644
index 0000000..84b071b
--- /dev/null
+++ b/lib/gs-remote-icon.c
@@ -0,0 +1,375 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gstdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <libsoup/soup.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);
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ status_code = soup_message_get_status (msg);
+#else
+ status_code = msg->status_code;
+#endif
+ 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 device pixels) of the icon to save
+ * @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 device 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 multiplied by the device scale
+ * (`gtk_widget_get_scale_factor()`).
+ *
+ * This can be called from any thread, as #GsRemoteIcon is immutable and hence
+ * thread-safe.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise
+ * Since: 40
+ */
+gboolean
+gs_remote_icon_ensure_cached (GsRemoteIcon *self,
+ SoupSession *soup_session,
+ guint maximum_icon_size,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *uri;
+ g_autofree gchar *cache_filename = NULL;
+ g_autoptr(GdkPixbuf) cached_pixbuf = NULL;
+ GStatBuf stat_buf;
+
+ 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 (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;
+
+ /* 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)) {
+ gint width = 0, height = 0;
+ /* Ensure the downloaded image dimensions are stored on the icon */
+ if (!g_object_get_data (G_OBJECT (self), "width") &&
+ gdk_pixbuf_get_file_info (cache_filename, &width, &height)) {
+ g_object_set_data (G_OBJECT (self), "width", GINT_TO_POINTER (width));
+ g_object_set_data (G_OBJECT (self), "height", GINT_TO_POINTER (height));
+ }
+ return TRUE;
+ }
+
+ cached_pixbuf = gs_icon_download (soup_session, uri, cache_filename, maximum_icon_size, cancellable, error);
+ if (cached_pixbuf == NULL)
+ return FALSE;
+
+ /* Ensure the dimensions are set correctly on the icon. */
+ g_object_set_data (G_OBJECT (self), "width", GUINT_TO_POINTER (gdk_pixbuf_get_width (cached_pixbuf)));
+ g_object_set_data (G_OBJECT (self), "height", GUINT_TO_POINTER (gdk_pixbuf_get_height (cached_pixbuf)));
+
+ return TRUE;
+}
diff --git a/lib/gs-remote-icon.h b/lib/gs-remote-icon.h
new file mode 100644
index 0000000..82e246f
--- /dev/null
+++ b/lib/gs-remote-icon.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 Endless OS Foundation, Inc
+ *
+ * Author: Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <libsoup/soup.h>
+
+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,
+ GCancellable *cancellable,
+ 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..c38f452
--- /dev/null
+++ b/lib/gs-self-test.c
@@ -0,0 +1,786 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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
+gs_plugin_download_rewrite_func (void)
+{
+ g_autofree gchar *css = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GDBusConnection) bus_connection = NULL;
+ g_autoptr(GsPlugin) plugin = NULL;
+ 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 */
+ bus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ g_assert_no_error (error);
+
+ plugin = gs_plugin_new (bus_connection, bus_connection);
+ gs_plugin_set_name (plugin, "self-test");
+ css = gs_plugin_download_rewrite_resource (plugin,
+ NULL, /* app */
+ resource,
+ NULL,
+ &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)
+ 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_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 applications */
+ 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_pending_action (app, GS_PLUGIN_ACTION_UPDATE);
+ g_assert_cmpuint (gs_app_get_pending_action (app), ==, GS_PLUGIN_ACTION_UPDATE);
+ 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);
+}
+
+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_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..2a2e107
--- /dev/null
+++ b/lib/gs-test.c
@@ -0,0 +1,147 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <stdlib.h>
+
+#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)
+{
+ 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);
+}
+
+/**
+ * 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..8114c23
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..2c3fb5b
--- /dev/null
+++ b/lib/gs-utils.c
@@ -0,0 +1,1689 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <errno.h>
+#include <fnmatch.h>
+#include <math.h>
+#include <string.h>
+#include <glib/gstdio.h>
+#include <json-glib/json-glib.h>
+
+#if defined(__linux__)
+#include <sys/sysinfo.h>
+#elif defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HAVE_POLKIT
+#include <polkit/polkit.h>
+#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 application.
+ *
+ * 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_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) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_DELETE_FAILED,
+ "failed to delete %s",
+ filename);
+ 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) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_DELETE_FAILED,
+ "Failed to delete: %s", src);
+ return FALSE;
+ }
+ }
+ }
+
+ if (g_rmdir (directory) != 0) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_DELETE_FAILED,
+ "Failed to remove: %s", directory);
+ 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",
+ error->code, g_quark_to_string (error->domain));
+ 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",
+ error->code, g_quark_to_string (error->domain));
+ 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",
+ error->code, g_quark_to_string (error->domain));
+ 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",
+ error->code, g_quark_to_string (error->domain));
+ 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 from domain %s",
+ g_quark_to_string (error->domain));
+ 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_set_online_updates_timestamp:
+ *
+ * Sets the value of online-updates-timestamp to current epoch. "online-updates-timestamp" represents
+ * the last time the system was online and got any updates.
+ **/
+void
+gs_utils_set_online_updates_timestamp (GSettings *settings)
+{
+ g_autoptr(GDateTime) now = NULL;
+
+ g_return_if_fail (settings != NULL);
+
+ now = g_date_time_new_now_local ();
+ g_settings_set (settings, "online-updates-timestamp", "x", g_date_time_to_unix (now));
+}
+
+/**
+ * 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);
+}
diff --git a/lib/gs-utils.h b/lib/gs-utils.h
new file mode 100644
index 0000000..855e984
--- /dev/null
+++ b/lib/gs-utils.h
@@ -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 <richard@hughsie.com>
+ * Copyright (C) 2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gdesktopappinfo.h>
+#include <gtk/gtk.h>
+
+#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 existing cached items
+ * @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);
+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);
+void gs_utils_set_online_updates_timestamp (GSettings *settings);
+
+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);
+
+G_END_DECLS
diff --git a/lib/gs-worker-thread.c b/lib/gs-worker-thread.c
new file mode 100644
index 0000000..6e6686d
--- /dev/null
+++ b/lib/gs-worker-thread.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) 2021 Endless OS Foundation LLC
+ *
+ * Author: Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+
+#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 */
+};
+
+typedef enum {
+ PROP_NAME = 1,
+} GsWorkerThreadProperty;
+
+static GParamSpec *props[PROP_NAME + 1] = { NULL, };
+
+G_DEFINE_TYPE (GsWorkerThread, gs_worker_thread, G_TYPE_OBJECT)
+
+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_OBJECT_CLASS (gs_worker_thread_parent_class)->dispose (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;
+
+ /**
+ * 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 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);
+
+ return NULL;
+}
+
+static void
+gs_worker_thread_init (GsWorkerThread *self)
+{
+}
+
+/**
+ * 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);
+}
+
+/* Essentially a wrapper around these elements to avoid the caller having to
+ * return `G_SOURCE_REMOVE` from their `work_func` every time. */
+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 gboolean
+work_run_cb (gpointer _data)
+{
+ WorkData *data = _data;
+ GTask *task = data->task;
+ gpointer source_object = g_task_get_source_object (task);
+ gpointer task_data = g_task_get_task_data (task);
+ GCancellable *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);
+
+ return G_SOURCE_REMOVE;
+}
+
+/**
+ * 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): 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_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;
+
+ g_main_context_invoke_full (self->worker_context, priority,
+ work_run_cb, g_steal_pointer (&data), (GDestroyNotify) work_data_free);
+}
+
+/**
+ * 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..36b28df
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+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..d591bca
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,205 @@
+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-ioprio.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-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-loader.h',
+ 'gs-plugin-loader-sync.h',
+ 'gs-plugin-types.h',
+ 'gs-plugin-vfuncs.h',
+ 'gs-remote-icon.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
+
+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('..'),
+]
+
+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-ioprio.c',
+ 'gs-ioprio.h',
+ '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-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-loader.c',
+ 'gs-plugin-loader-sync.c',
+ 'gs-remote-icon.c',
+ 'gs-test.c',
+ 'gs-utils.c',
+ 'gs-worker-thread.c',
+ ] + libgnomesoftware_enums + [gs_build_ident_h],
+ 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_enums,
+ 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=' + libsoupapiversion,
+ ],
+ 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')
+ 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('tools')
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..44df6a4
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <glib.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk/gdk.h>
+#include <locale.h>
+#include <math.h>
+
+#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, "<table class='colour-swatch'><tr>");
+ for (guint i = 0; i < colours->len; i++) {
+ GdkRGBA *rgba = &g_array_index (colours, GdkRGBA, i);
+
+ g_string_append_printf (html_output,
+ "<td style='background-color: rgb(%u, %u, %u)'></td>",
+ (guint) (rgba->red * 255),
+ (guint) (rgba->green * 255),
+ (guint) (rgba->blue * 255));
+
+ if (i % 3 == 2)
+ g_string_append (html_output, "</tr><tr>");
+ }
+ g_string_append_printf (html_output, "</tr></table>");
+}
+
+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,
+ "<!DOCTYPE html>\n"
+ "<html>\n"
+ " <head>\n"
+ " <meta charset='UTF-8'>\n"
+ " <style>\n"
+ " #main-table, #main-table th, #main-table td { border: 1px solid black; border-collapse: collapse }\n"
+ " #main-table th, #main-table td { padding: 4px }\n"
+ " td.number { text-align: right }\n"
+ " table.colour-swatch td { width: 30px; height: 30px }\n"
+ " .faster { background-color: rgb(190, 236, 57) }\n"
+ " .slower { background-color: red }\n"
+ " </style>\n"
+ " </head>\n"
+ " <body>\n"
+ " <table id='main-table'>\n"
+ " <thead>\n"
+ " <tr>\n"
+ " <td>Filename</td>\n"
+ " <td>Icon</td>\n"
+ " <td>Code duration (μs)</td>\n"
+ " <td>Code colours</td>\n"
+ " </tr>\n"
+ " </thead>\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,
+ "<tr>\n"
+ "<th>%s</th>\n"
+ "<td><img src='file:%s'></td>\n"
+ "<td class='number'>%" G_GINT64_FORMAT "</td>\n"
+ "<td>",
+ basename, filename, duration);
+ print_colours (html_output, colours);
+ g_string_append (html_output,
+ "</td>\n"
+ "</tr>\n");
+
+ g_array_append_val (durations, duration);
+ }
+
+ /* Summary statistics for the timings. */
+ g_string_append (html_output, "<tfoot><tr><td></td><td></td><td>");
+ print_summary_statistics (html_output, durations);
+ g_string_append (html_output, "</td><td></td></tr></tfoot>");
+
+ g_string_append (html_output, "</table></body></html>");
+
+ g_print ("%s\n", html_output->str);
+
+ return 0;
+}
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..20400ea
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,328 @@
+project('gnome-software', 'c',
+ version : '43.5',
+ license : 'GPL-2.0+',
+ default_options : ['warning_level=1', 'c_std=c11'],
+ meson_version : '>=0.58.0'
+)
+
+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 = '19'
+conf.set_quoted('GS_PLUGIN_API_VERSION', gs_plugin_api_version)
+
+# 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',
+ '-Wextra',
+ '-Wformat=2',
+ '-Wformat-nonliteral',
+ '-Wformat-security',
+ '-Wformat-signedness',
+ '-Wignored-qualifiers',
+ '-Wimplicit-function-declaration',
+ '-Werror=implicit-function-declaration',
+ '-Winit-self',
+ '-Winline',
+ '-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',
+ '-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
+add_global_link_arguments(
+ global_link_args,
+ language: 'c'
+)
+
+# 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.14.0',
+ 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.1.7', 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.6',
+ fallback: ['gtk', 'gtk_dep'],
+ default_options: [
+ 'build-examples=false',
+ 'build-tests=false',
+ 'introspection=disabled',
+ 'demos=false',
+ ]
+ )
+glib = dependency('glib-2.0', version : '>= 2.70.0')
+json_glib = dependency('json-glib-1.0', version : '>= 1.6.0')
+libm = cc.find_library('m', required: false)
+if get_option('soup2')
+ libsoup = dependency('libsoup-2.4', version : '>= 2.52.0')
+ libsoupapiversion = '2.4'
+ conf.set('SOUP_HTTP_URI_FLAGS', '(G_URI_FLAGS_HAS_PASSWORD | G_URI_FLAGS_ENCODED_PATH | G_URI_FLAGS_ENCODED_QUERY | G_URI_FLAGS_ENCODED_FRAGMENT | G_URI_FLAGS_SCHEME_NORMALIZE)')
+else
+ libsoup = dependency('libsoup-3.0', version : '>= 3.0')
+ libsoupapiversion = '3.0'
+endif
+libadwaita = dependency('libadwaita-1',
+ version: '>=1.0.1',
+ 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
+
+gsettings_desktop_schemas = dependency('gsettings-desktop-schemas', version : '>= 3.18.0', required: get_option('gsettings_desktop_schemas'))
+if gsettings_desktop_schemas.found()
+ conf.set('HAVE_GSETTINGS_DESKTOP_SCHEMAS', 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.1.0')
+ 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
+ if meson.get_compiler('c').has_function('pk_package_get_update_severity', prefix: '#include <packagekit-glib2/packagekit.h>', dependencies: packagekit)
+ conf.set('HAVE_PK_PACKAGE_GET_UPDATE_SEVERITY', '1')
+ endif
+ if meson.get_compiler('c').has_function('pk_details_get_download_size', prefix: '#include <packagekit-glib2/packagekit.h>', dependencies: packagekit)
+ conf.set('HAVE_PK_DETAILS_GET_DOWNLOAD_SIZE', '1')
+ endif
+ if meson.get_compiler('c').has_function('pk_offline_cancel_with_flags', prefix: '#include <packagekit-glib2/packagekit.h>', dependencies: packagekit) and \
+ meson.get_compiler('c').has_function('pk_offline_trigger_with_flags', prefix: '#include <packagekit-glib2/packagekit.h>', dependencies: packagekit) and \
+ meson.get_compiler('c').has_function('pk_offline_trigger_upgrade_with_flags', prefix: '#include <packagekit-glib2/packagekit.h>', dependencies: packagekit)
+ conf.set('HAVE_PK_OFFLINE_WITH_FLAGS', '1')
+ endif
+endif
+
+if get_option('eos_updater')
+ ostree = dependency('ostree-1')
+endif
+
+if get_option('fwupd')
+ fwupd = dependency('fwupd', version : '>= 1.5.6')
+endif
+
+if get_option('flatpak')
+ flatpak = dependency('flatpak', version : '>= 1.9.1')
+ ostree = dependency('ostree-1')
+endif
+
+if get_option('malcontent')
+ malcontent = dependency('malcontent-0', version: '>= 0.3.0', fallback: ['malcontent', 'libmalcontent_dep'], default_options: ['ui=disabled'])
+endif
+
+if get_option('rpm_ostree')
+ libdnf = dependency('libdnf')
+ 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')
+ if get_option('soup2')
+ snap = dependency('snapd-glib', version : '>= 1.50')
+ else
+ snap = dependency('snapd-glib-2', version : '>= 1.62')
+ endif
+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(get_option('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(get_option('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',
+ join_paths(get_option('prefix'),
+ get_option('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',
+ join_paths(get_option('prefix'),
+ get_option('libexecdir')))
+conf.set('ENABLE_EXTERNAL_APPSTREAM', get_option('external_appstream'))
+configure_file(
+ output : 'config.h',
+ configuration : conf
+)
+
+add_project_arguments('-DI_KNOW_THE_GNOME_SOFTWARE_API_IS_SUBJECT_TO_CHANGE',
+ language : 'c')
+
+test_env = [
+ 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()),
+ 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()),
+ 'GSETTINGS_SCHEMA_DIR=@0@/data/'.format(meson.project_build_root()),
+ 'GSETTINGS_BACKEND=memory',
+ 'MALLOC_CHECK_=2',
+
+ # Make flatpak skip parental controls since it requires the system bus.
+ # https://github.com/flatpak/flatpak/issues/2993
+ 'FLATPAK_SYSTEM_HELPER_ON_SESSION=1',
+]
+
+subdir('data')
+subdir('lib')
+subdir('plugins')
+subdir('src')
+if get_option('external_appstream')
+ subdir('gs-install-appstream')
+endif
+subdir('po')
+subdir('doc')
+
+# 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..a2fde39
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,25 @@
+option('tests', type : 'boolean', value : true, description : 'enable tests')
+option('gsettings_desktop_schemas', type : 'feature', value : 'enabled', description : 'enable integration with GNOME desktop preferences')
+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 : true, description : 'enable installation of default curated apps list')
+option('default_featured_apps', type : 'boolean', value : true, description : 'enable installation of default featured apps list')
+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('soup2', type : 'boolean', value : false, description : 'build with libsoup2')
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..098e24a
--- /dev/null
+++ b/plugins/core/gs-plugin-appstream.c
@@ -0,0 +1,1653 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <errno.h>
+#include <gnome-software.h>
+#include <xmlb.h>
+
+#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;
+ GRWLock silo_lock;
+ GSettings *settings;
+};
+
+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_object (&self->settings);
+ g_rw_lock_clear (&self->silo_lock);
+ g_clear_object (&self->worker);
+
+ G_OBJECT_CLASS (gs_plugin_appstream_parent_class)->dispose (object);
+}
+
+static void
+gs_plugin_appstream_init (GsPluginAppstream *self)
+{
+ GApplication *application = g_application_get_default ();
+
+ /* XbSilo needs external locking as we destroy the silo and build a new
+ * one when something changes */
+ g_rw_lock_init (&self->silo_lock);
+
+ /* need package name */
+ gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "dpkg");
+
+ /* 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);
+ }
+}
+
+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 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,
+#if LIBXMLB_CHECK_VERSION(0, 2, 0)
+ XB_BUILDER_SOURCE_FLAG_WATCH_DIRECTORY,
+#else
+ XB_BUILDER_SOURCE_FLAG_WATCH_FILE,
+#endif
+ 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);
+ 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;
+
+ 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_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_plugin_appstream_load_desktop_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(XbBuilderSource) source = xb_builder_source_new ();
+
+ /* add support for desktop files */
+ xb_builder_source_add_adapter (source, "application/x-desktop",
+ gs_plugin_appstream_load_desktop_cb, NULL, NULL);
+
+ /* add source */
+ if (!xb_builder_source_load_file (source, file,
+#if LIBXMLB_CHECK_VERSION(0, 2, 0)
+ XB_BUILDER_SOURCE_FLAG_WATCH_DIRECTORY,
+#else
+ XB_BUILDER_SOURCE_FLAG_WATCH_FILE,
+#endif
+ 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;
+}
+
+static gboolean
+gs_plugin_appstream_load_desktop (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);
+ 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;
+
+ 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_plugin_appstream_load_desktop_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_COLLECTION);
+ 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_collection (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);
+}
+
+#if LIBXMLB_CHECK_VERSION(0,3,1)
+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;
+}
+#endif
+
+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;
+#if LIBXMLB_CHECK_VERSION(0,3,1)
+ g_autoptr(XbBuilderFixup) fixup4 = NULL;
+#endif
+ 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/x-yaml",
+ gs_plugin_appstream_load_dep11_cb,
+ NULL, NULL);
+
+ /* add source */
+ if (!xb_builder_source_load_file (source, file,
+#if LIBXMLB_CHECK_VERSION(0, 2, 0)
+ XB_BUILDER_SOURCE_FLAG_WATCH_DIRECTORY,
+#else
+ XB_BUILDER_SOURCE_FLAG_WATCH_FILE,
+#endif
+ 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);
+
+#if LIBXMLB_CHECK_VERSION(0,3,1)
+ 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);
+#endif
+
+ /* 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);
+
+ /* 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_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);
+ }
+ }
+ }
+
+ g_ptr_array_add (locations,
+ g_build_filename (catalog_path, "xml", NULL));
+ g_ptr_array_add (locations,
+ g_build_filename (catalog_path, "yaml", NULL));
+
+ 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));
+ }
+}
+
+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 gboolean
+gs_plugin_appstream_check_silo (GsPluginAppstream *self,
+ 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(GRWLockReaderLocker) reader_locker = NULL;
+ g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
+ g_autoptr(GPtrArray) parent_appdata = g_ptr_array_new_with_free_func (g_free);
+ g_autoptr(GPtrArray) parent_appstream = g_ptr_array_new_with_free_func (g_free);
+ const gchar *const *locales = g_get_language_names ();
+ g_autoptr(GMainContext) old_thread_default = NULL;
+
+ reader_locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+ /* everything is okay */
+ if (self->silo != NULL && xb_silo_is_valid (self->silo))
+ return TRUE;
+ g_clear_pointer (&reader_locker, g_rw_lock_reader_locker_free);
+
+ /* drat! silo needs regenerating */
+ writer_locker = g_rw_lock_writer_locker_new (&self->silo_lock);
+ g_clear_object (&self->silo);
+
+ /* 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);
+ }
+
+ /* add current locales */
+ for (guint i = 0; locales[i] != NULL; i++)
+ xb_builder_add_locale (builder, locales[i]);
+
+ /* 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 FALSE;
+ 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);
+ } else {
+ g_autofree gchar *state_cache_dir = NULL;
+ g_autofree gchar *state_lib_dir = NULL;
+
+ /* add search paths */
+ gs_add_appstream_catalog_location (parent_appstream, DATADIR);
+ gs_add_appstream_metainfo_location (parent_appdata, DATADIR);
+
+ state_cache_dir = g_build_filename (LOCALSTATEDIR, "cache", NULL);
+ gs_add_appstream_catalog_location (parent_appstream, state_cache_dir);
+ state_lib_dir = g_build_filename (LOCALSTATEDIR, "lib", NULL);
+ gs_add_appstream_catalog_location (parent_appstream, state_lib_dir);
+
+#ifdef ENABLE_EXTERNAL_APPSTREAM
+ /* check for the corresponding setting */
+ if (!g_settings_get_boolean (self->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 (parent_appstream,
+ g_build_filename (user_catalog_path, "xml", NULL));
+ g_ptr_array_add (parent_appstream,
+ 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 (parent_appstream, "/usr/share");
+ gs_add_appstream_metainfo_location (parent_appdata, "/usr/share");
+ }
+ if (g_strcmp0 (LOCALSTATEDIR, "/var") != 0) {
+ gs_add_appstream_catalog_location (parent_appstream, "/var/cache");
+ gs_add_appstream_catalog_location (parent_appstream, "/var/lib");
+ }
+
+ /* 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))
+ return FALSE;
+ }
+ 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))
+ return FALSE;
+ }
+ if (!gs_plugin_appstream_load_desktop (self, builder,
+ DATADIR "/applications",
+ cancellable, error)) {
+ return FALSE;
+ }
+ if (g_strcmp0 (DATADIR, "/usr/share") != 0 &&
+ !gs_plugin_appstream_load_desktop (self, builder,
+ "/usr/share/applications",
+ cancellable, error)) {
+ return FALSE;
+ }
+ }
+
+ /* 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 FALSE;
+ 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 FALSE;
+ }
+
+ /* watch all directories too */
+ for (guint i = 0; i < parent_appstream->len; i++) {
+ const gchar *fn = g_ptr_array_index (parent_appstream, i);
+ g_autoptr(GFile) file_tmp = g_file_new_for_path (fn);
+ if (!xb_silo_watch_file (self->silo, file_tmp, cancellable, error)) {
+ if (old_thread_default != NULL)
+ g_main_context_push_thread_default (old_thread_default);
+ return FALSE;
+ }
+ }
+ for (guint i = 0; i < parent_appdata->len; i++) {
+ const gchar *fn = g_ptr_array_index (parent_appdata, i);
+ g_autoptr(GFile) file_tmp = g_file_new_for_path (fn);
+ if (!xb_silo_watch_file (self->silo, file_tmp, cancellable, error)) {
+ if (old_thread_default != NULL)
+ g_main_context_push_thread_default (old_thread_default);
+ return FALSE;
+ }
+ }
+
+ if (old_thread_default != NULL)
+ g_main_context_push_thread_default (old_thread_default);
+
+ /* 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 FALSE;
+ }
+
+ /* success */
+ return TRUE;
+}
+
+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(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ if (!gs_plugin_appstream_check_silo (self, cancellable, &local_error))
+ 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);
+}
+
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginAppstream *self = GS_PLUGIN_APPSTREAM (plugin);
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+
+ /* check silo is valid */
+ if (!gs_plugin_appstream_check_silo (self, cancellable, error))
+ return FALSE;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ return gs_appstream_url_to_app (plugin, self->silo, list, url, cancellable, 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 <compulsory_for_desktops />. In that way,
+ * "GNOME-Classic:GNOME" shares compulsory apps with GNOME.
+ *
+ * As a special case, if the <compulsory_for_desktop /> 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,
+ GError **error)
+{
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(XbNode) component = NULL;
+
+ /* Ignore apps with no ID */
+ if (gs_app_get_id (app) == NULL)
+ return TRUE;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ xpath = g_strdup_printf ("component/id[text()='%s']", gs_app_get_id (app));
+ component = xb_silo_query_first (self->silo, xpath, &error_local);
+ if (component == 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;
+ }
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ return TRUE;
+}
+
+static gboolean
+gs_plugin_refine_from_id (GsPluginAppstream *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ gboolean *found,
+ GError **error)
+{
+ const gchar *id, *origin;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GString) xpath = g_string_new (NULL);
+ g_autoptr(GPtrArray) components = NULL;
+
+ /* not enough info to find */
+ id = gs_app_get_id (app);
+ if (id == NULL)
+ return TRUE;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ origin = gs_app_get_origin_appstream (app);
+
+ /* look in AppStream then fall back to AppData */
+ if (origin && *origin) {
+ xb_string_append_union (xpath, "components[@origin='%s']/component/id[text()='%s']/../pkgname/..", origin, id);
+ xb_string_append_union (xpath, "components[@origin='%s']/component[@type='web-application']/id[text()='%s']/..", origin, id);
+ } else {
+ xb_string_append_union (xpath, "components/component/id[text()='%s']/../pkgname/..", id);
+ xb_string_append_union (xpath, "components/component[@type='web-application']/id[text()='%s']/..", id);
+ }
+ xb_string_append_union (xpath, "component/id[text()='%s']/..", id);
+ components = xb_silo_query (self->silo, xpath->str, 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;
+ }
+ 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, self->silo,
+ component, flags, 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, error))
+ return FALSE;
+ }
+
+ /* success */
+ *found = TRUE;
+ return TRUE;
+}
+
+static gboolean
+gs_plugin_refine_from_pkgname (GsPluginAppstream *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ 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(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GString) xpath = g_string_new (NULL);
+ g_autoptr(XbNode) component = NULL;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ /* 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 (self->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, self->silo, component, flags, 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, 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,
+ 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;
+ gboolean found = FALSE;
+ g_autoptr(GsAppList) app_list = NULL;
+ g_autoptr(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ /* check silo is valid */
+ if (!gs_plugin_appstream_check_silo (self, 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);
+
+ /* not us */
+ if (gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_PACKAGE &&
+ gs_app_get_bundle_kind (app) != AS_BUNDLE_KIND_UNKNOWN)
+ continue;
+
+ /* find by ID then fall back to package name */
+ if (!gs_plugin_refine_from_id (self, app, flags, &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, &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, 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,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *id;
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GPtrArray) components = NULL;
+
+ /* not enough info to find */
+ id = gs_app_get_id (app);
+ if (id == NULL)
+ return TRUE;
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ /* find all app with package names when matching any prefixes */
+ xpath = g_strdup_printf ("components/component/id[text()='%s']/../pkgname/..", id);
+ components = xb_silo_query (self->silo, xpath, 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;
+ }
+ 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), self->silo, component, 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, self->silo, component,
+ refine_flags, 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, 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(GRWLockReaderLocker) locker = NULL;
+ GsPluginRefineCategoriesData *data = task_data;
+ g_autoptr(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ /* check silo is valid */
+ if (!gs_plugin_appstream_check_silo (self, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ if (!gs_appstream_refine_category_sizes (self->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(GRWLockReaderLocker) locker = 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 */
+ if (!gs_plugin_appstream_check_silo (self, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ if (released_since != NULL &&
+ !gs_appstream_add_recent (GS_PLUGIN (self), 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 (self->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 (self->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), 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), 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 (self->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), 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), 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 (self->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(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ /* Checking the silo will refresh it if needed. */
+ if (!gs_plugin_appstream_check_silo (self, cancellable, &local_error))
+ 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->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;
+}
+
+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..3063ada
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..06a16f1
--- /dev/null
+++ b/plugins/core/gs-plugin-generic-updates.c
@@ -0,0 +1,148 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+
+#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_AFTER, "packagekit");
+ gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "rpm-ostree");
+ 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;
+
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_GENERIC)
+ return TRUE;
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY)
+ return TRUE;
+
+ 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 ();
+
+ 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) {
+ 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))
+ 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);
+ 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..1b2448c
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..f943496
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <fnmatch.h>
+#include <gnome-software.h>
+
+#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..fceef62
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..0dbb8ba
--- /dev/null
+++ b/plugins/core/gs-plugin-icons.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) 2014 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <libsoup/soup.h>
+#include <string.h>
+
+#include <gnome-software.h>
+
+#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;
+
+ SoupSession *soup_session; /* (owned) */
+ GsWorkerThread *worker; /* (owned) */
+};
+
+G_DEFINE_TYPE (GsPluginIcons, gs_plugin_icons, GS_TYPE_PLUGIN)
+
+#define assert_in_worker(self) \
+ g_assert (gs_worker_thread_is_in_worker_context (self->worker))
+
+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->soup_session);
+ g_clear_object (&self->worker);
+
+ 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);
+
+ self->soup_session = gs_build_soup_session ();
+
+ /* Start up a worker thread to process all the plugin’s function calls. */
+ self->worker = gs_worker_thread_new ("gs-plugin-icons");
+
+ 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 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);
+ GsPluginIcons *self = g_task_get_source_object (task);
+ g_autoptr(GsWorkerThread) worker = NULL;
+ g_autoptr(GError) local_error = NULL;
+
+ g_clear_object (&self->soup_session);
+ 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_icons_shutdown_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
+static gboolean
+refine_app (GsPluginIcons *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint maximum_icon_size;
+
+ assert_in_worker (self);
+
+ /* not required */
+ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON) == 0)
+ return TRUE;
+
+ /* Currently a 160px icon is needed for #GsFeatureTile, at most. */
+ maximum_icon_size = 160 * gs_plugin_get_scale (GS_PLUGIN (self));
+
+ gs_app_ensure_icons_downloaded (app, self->soup_session, maximum_icon_size, cancellable);
+
+ return TRUE;
+}
+
+static void refine_thread_cb (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable);
+
+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 = gs_plugin_refine_data_new_task (plugin, list, flags, 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;
+ }
+
+ /* Queue a job for the refine. */
+ gs_worker_thread_queue (self->worker, interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW,
+ 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)
+{
+ GsPluginIcons *self = GS_PLUGIN_ICONS (source_object);
+ GsPluginRefineData *data = task_data;
+ GsAppList *list = data->list;
+ GsPluginRefineFlags flags = data->flags;
+ 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, 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..e092d0d
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..685af27
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#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..9ab9d0d
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..8ddd071
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2016 Matthias Klumpp <mak@debian.org>
+ * Copyright (C) 2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#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..f793d61
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..95e940b
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#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..e3e2d34
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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-plugin-rewrite-resource.c b/plugins/core/gs-plugin-rewrite-resource.c
new file mode 100644
index 0000000..44348c5
--- /dev/null
+++ b/plugins/core/gs-plugin-rewrite-resource.c
@@ -0,0 +1,252 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+
+#include "gs-plugin-rewrite-resource.h"
+
+/*
+ * SECTION:
+ * Rewrites CSS metadata for apps to refer to locally downloaded resources.
+ *
+ * This plugin rewrites the CSS of apps to refer to locally cached resources,
+ * rather than HTTP/HTTPS URIs for images (for example).
+ *
+ * It uses a worker thread to download the resources.
+ *
+ * FIXME: Eventually this should move into the refine plugin job, as it needs
+ * to execute after all other refine jobs (in order to see all the URIs which
+ * they produce).
+ */
+
+struct _GsPluginRewriteResource
+{
+ GsPlugin parent;
+
+ GsWorkerThread *worker; /* (owned) */
+};
+
+G_DEFINE_TYPE (GsPluginRewriteResource, gs_plugin_rewrite_resource, GS_TYPE_PLUGIN)
+
+#define assert_in_worker(self) \
+ g_assert (gs_worker_thread_is_in_worker_context (self->worker))
+
+static void
+gs_plugin_rewrite_resource_init (GsPluginRewriteResource *self)
+{
+ /* let appstream add metadata first */
+ gs_plugin_add_rule (GS_PLUGIN (self), GS_PLUGIN_RULE_RUN_AFTER, "appstream");
+}
+
+static void
+gs_plugin_rewrite_resource_dispose (GObject *object)
+{
+ GsPluginRewriteResource *self = GS_PLUGIN_REWRITE_RESOURCE (object);
+
+ g_clear_object (&self->worker);
+
+ G_OBJECT_CLASS (gs_plugin_rewrite_resource_parent_class)->dispose (object);
+}
+
+static void
+gs_plugin_rewrite_resource_setup_async (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginRewriteResource *self = GS_PLUGIN_REWRITE_RESOURCE (plugin);
+ g_autoptr(GTask) task = NULL;
+
+ task = g_task_new (plugin, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_rewrite_resource_setup_async);
+
+ /* Start up a worker thread to process all the plugin’s function calls. */
+ self->worker = gs_worker_thread_new ("gs-plugin-rewrite-resource");
+
+ g_task_return_boolean (task, TRUE);
+}
+
+static gboolean
+gs_plugin_rewrite_resource_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_rewrite_resource_shutdown_async (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginRewriteResource *self = GS_PLUGIN_REWRITE_RESOURCE (plugin);
+ g_autoptr(GTask) task = NULL;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_rewrite_resource_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);
+ GsPluginRewriteResource *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_rewrite_resource_shutdown_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
+static gboolean
+refine_app (GsPluginRewriteResource *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *keys[] = {
+ "GnomeSoftware::FeatureTile-css",
+ "GnomeSoftware::UpgradeBanner-css",
+ NULL };
+
+ assert_in_worker (self);
+
+ /* rewrite URIs */
+ for (guint i = 0; keys[i] != NULL; i++) {
+ const gchar *css = gs_app_get_metadata_item (app, keys[i]);
+ if (css != NULL) {
+ g_autofree gchar *css_new = NULL;
+ g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (GS_PLUGIN (self)));
+ gs_app_set_summary_missing (app_dl,
+ /* TRANSLATORS: status text when downloading */
+ _("Downloading featured images…"));
+ css_new = gs_plugin_download_rewrite_resource (GS_PLUGIN (self),
+ app,
+ css,
+ cancellable,
+ error);
+ if (css_new == NULL)
+ return FALSE;
+ if (g_strcmp0 (css, css_new) != 0) {
+ gs_app_set_metadata (app, keys[i], NULL);
+ gs_app_set_metadata (app, keys[i], css_new);
+ }
+ }
+ }
+ return TRUE;
+}
+
+static void refine_thread_cb (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable);
+
+static void
+gs_plugin_rewrite_resource_refine_async (GsPlugin *plugin,
+ GsAppList *list,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginRewriteResource *self = GS_PLUGIN_REWRITE_RESOURCE (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_rewrite_resource_refine_async);
+
+ /* Queue a job for the refine. */
+ gs_worker_thread_queue (self->worker, interactive ? G_PRIORITY_DEFAULT : G_PRIORITY_LOW,
+ 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)
+{
+ GsPluginRewriteResource *self = GS_PLUGIN_REWRITE_RESOURCE (source_object);
+ GsPluginRefineData *data = task_data;
+ GsAppList *list = data->list;
+ GsPluginRefineFlags flags = data->flags;
+ 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, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+ }
+
+ g_task_return_boolean (task, TRUE);
+}
+
+static gboolean
+gs_plugin_rewrite_resource_refine_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
+static void
+gs_plugin_rewrite_resource_class_init (GsPluginRewriteResourceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass);
+
+ object_class->dispose = gs_plugin_rewrite_resource_dispose;
+
+ plugin_class->setup_async = gs_plugin_rewrite_resource_setup_async;
+ plugin_class->setup_finish = gs_plugin_rewrite_resource_setup_finish;
+ plugin_class->shutdown_async = gs_plugin_rewrite_resource_shutdown_async;
+ plugin_class->shutdown_finish = gs_plugin_rewrite_resource_shutdown_finish;
+ plugin_class->refine_async = gs_plugin_rewrite_resource_refine_async;
+ plugin_class->refine_finish = gs_plugin_rewrite_resource_refine_finish;
+}
+
+GType
+gs_plugin_query_type (void)
+{
+ return GS_TYPE_PLUGIN_REWRITE_RESOURCE;
+}
diff --git a/plugins/core/gs-plugin-rewrite-resource.h b/plugins/core/gs-plugin-rewrite-resource.h
new file mode 100644
index 0000000..0af8c88
--- /dev/null
+++ b/plugins/core/gs-plugin-rewrite-resource.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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_PLUGIN_REWRITE_RESOURCE (gs_plugin_rewrite_resource_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsPluginRewriteResource, gs_plugin_rewrite_resource, GS, PLUGIN_REWRITE_RESOURCE, 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..8266a4c
--- /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 <jrocha@endlessm.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+
+#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 = "<?xml version=\"1.0\"?>\n"
+ "<components origin=\"yellow\" version=\"0.9\">\n"
+ " <component type=\"desktop\">\n"
+ " <id>arachne.desktop</id>\n"
+ " <name>test</name>\n"
+ " <summary>Test</summary>\n"
+ " <icon type=\"stock\">system-file-manager</icon>\n"
+ " <pkgname>arachne</pkgname>\n"
+ " </component>\n"
+ " <component type=\"os-upgrade\">\n"
+ " <id>org.fedoraproject.fedora-25</id>\n"
+ " <name>Fedora</name>\n"
+ " <summary>Fedora Workstation</summary>\n"
+ " <pkgname>fedora-release</pkgname>\n"
+ " </component>\n"
+ " <info>\n"
+ " <scope>user</scope>\n"
+ " </info>\n"
+ "</components>\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..ca11ade
--- /dev/null
+++ b/plugins/core/meson.build
@@ -0,0 +1,133 @@
+cargs = ['-DG_LOG_DOMAIN="GsPlugin"']
+
+shared_module(
+ 'gs_plugin_generic-updates',
+ sources : 'gs-plugin-generic-updates.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+shared_module(
+ 'gs_plugin_provenance',
+ sources : 'gs-plugin-provenance.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+shared_module(
+ 'gs_plugin_provenance-license',
+ sources : 'gs-plugin-provenance-license.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+
+shared_module(
+ 'gs_plugin_icons',
+ sources : 'gs-plugin-icons.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+shared_module(
+ 'gs_plugin_appstream',
+ sources : [
+ 'gs-plugin-appstream.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+shared_module(
+ 'gs_plugin_rewrite-resource',
+ sources : 'gs-plugin-rewrite-resource.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+shared_module(
+ 'gs_plugin_os-release',
+ sources : 'gs-plugin-os-release.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+if get_option('tests')
+ 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',
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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/dpkg/gs-plugin-dpkg.c b/plugins/dpkg/gs-plugin-dpkg.c
new file mode 100644
index 0000000..3f886e0
--- /dev/null
+++ b/plugins/dpkg/gs-plugin-dpkg.c
@@ -0,0 +1,133 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <gnome-software.h>
+
+#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 '%s' as no %s available",
+ gs_plugin_get_name (plugin), DPKG_DEB_BINARY);
+ gs_plugin_set_enabled (plugin, FALSE);
+ }
+}
+
+gboolean
+gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint i;
+ g_autofree gchar *content_type = NULL;
+ g_autofree gchar *output = NULL;
+ g_auto(GStrv) argv = NULL;
+ g_auto(GStrv) tokens = NULL;
+ g_autoptr(GsApp) app = NULL;
+ g_autoptr(GString) str = NULL;
+ const gchar *mimetypes[] = {
+ "application/vnd.debian.binary-package",
+ 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 FALSE;
+ if (!g_strv_contains (mimetypes, content_type))
+ return TRUE;
+
+ /* exec sync */
+ argv = g_new0 (gchar *, 5);
+ argv[0] = g_strdup (DPKG_DEB_BINARY);
+ argv[1] = g_strdup ("--showformat=${Package}\\n"
+ "${Version}\\n"
+ "${Installed-Size}\\n"
+ "${Homepage}\\n"
+ "${Description}");
+ argv[2] = g_strdup ("-W");
+ argv[3] = g_file_get_path (file);
+ if (!g_spawn_sync (NULL, argv, NULL,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
+ NULL, NULL, &output, NULL, NULL, error)) {
+ gs_utils_error_convert_gio (error);
+ return FALSE;
+ }
+
+ /* parse output */
+ tokens = g_strsplit (output, "\n", 0);
+ if (g_strv_length (tokens) < 5) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "dpkg-deb output format incorrect:\n\"%s\"\n", output);
+ return FALSE;
+ }
+
+ /* 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_size_installed (app, GS_SIZE_TYPE_VALID, 1024 * g_ascii_strtoull (tokens[2], NULL, 10));
+ gs_app_set_url (app, AS_URL_KIND_HOMEPAGE, tokens[3]);
+ gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, tokens[4]);
+ gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC);
+ gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE);
+ gs_app_set_metadata (app, "GnomeSoftware::Creator",
+ gs_plugin_get_name (plugin));
+
+ /* multiline text */
+ str = g_string_new ("");
+ for (i = 5; 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);
+ return TRUE;
+}
+
+static void
+gs_plugin_dpkg_class_init (GsPluginDpkgClass *klass)
+{
+}
+
+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..df16fde
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..ecb567d
--- /dev/null
+++ b/plugins/dpkg/gs-self-test.c
@@ -0,0 +1,87 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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..594d6e4
--- /dev/null
+++ b/plugins/dpkg/meson.build
@@ -0,0 +1,35 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginDpkg"']
+
+shared_module(
+ 'gs_plugin_dpkg',
+ sources : 'gs-plugin-dpkg.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+if get_option('tests')
+ 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'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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 0000000..f4f921a
--- /dev/null
+++ b/plugins/dpkg/tests/chiron-1.1-1.deb
Binary files differ
diff --git a/plugins/dpkg/tests/debian/DEBIAN/control b/plugins/dpkg/tests/debian/DEBIAN/control
new file mode 100644
index 0000000..ad5d9c6
--- /dev/null
+++ b/plugins/dpkg/tests/debian/DEBIAN/control
@@ -0,0 +1,13 @@
+Package: chiron
+Version: 1.1-1
+Section: base
+Priority: optional
+Architecture: all
+Homepage: http://127.0.0.1/
+Maintainer: Richard Hughes <richard@hughsie.com>
+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
--- /dev/null
+++ b/plugins/dpkg/tests/debian/usr/bin/chiron
diff --git a/plugins/dummy/gs-plugin-dummy.c b/plugins/dummy/gs-plugin-dummy.c
new file mode 100644
index 0000000..ac584af
--- /dev/null
+++ b/plugins/dummy/gs-plugin-dummy.c
@@ -0,0 +1,1104 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#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)
+
+/* 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 '%s' as not in self test",
+ gs_plugin_get_name (plugin));
+ 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);
+}
+
+static gboolean
+gs_plugin_dummy_delay (GsPlugin *plugin,
+ GsApp *app,
+ guint timeout_ms,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = TRUE;
+ guint i;
+ guint timeout_us = timeout_ms * 10;
+
+ /* do blocking delay in 1% increments */
+ for (i = 0; i < 100; i++) {
+ g_usleep (timeout_us);
+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) {
+ gs_utils_error_convert_gio (error);
+ ret = FALSE;
+ break;
+ }
+ if (app != NULL)
+ gs_app_set_progress (app, i);
+ gs_plugin_status_update (plugin, app,
+ GS_PLUGIN_STATUS_DOWNLOADING);
+ }
+ return ret;
+}
+
+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;
+}
+
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *path = NULL;
+ g_autofree gchar *scheme = NULL;
+ g_autoptr(GsApp) app = NULL;
+
+ /* not us */
+ scheme = gs_utils_get_url_scheme (url);
+ if (g_strcmp0 (scheme, "dummy") != 0)
+ return TRUE;
+
+ /* 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);
+ return TRUE;
+}
+
+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);
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsApp *app;
+ GsApp *proxy;
+ g_autoptr(GIcon) ic = NULL;
+
+ /* update UI as this might take some time */
+ gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
+
+ /* spin */
+ if (!gs_plugin_dummy_delay (plugin, NULL, 2000, cancellable, error))
+ return FALSE;
+
+ /* use a generic stock icon */
+ ic = g_themed_icon_new ("drive-harddisk");
+
+ /* 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 TRUE;
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin);
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* remove app */
+ if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0) {
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ if (!gs_plugin_dummy_delay (plugin, app, 500, cancellable, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+ gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
+ }
+
+ /* keep track */
+ g_hash_table_remove (self->installed_apps, gs_app_get_id (app));
+ g_hash_table_insert (self->available_apps,
+ g_strdup (gs_app_get_id (app)),
+ GUINT_TO_POINTER (1));
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin);
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* install app */
+ if (g_strcmp0 (gs_app_get_id (app), "chiron.desktop") == 0 ||
+ g_strcmp0 (gs_app_get_id (app), "zeus.desktop") == 0) {
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ if (!gs_plugin_dummy_delay (plugin, app, 500, cancellable, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ }
+
+ /* keep track */
+ g_hash_table_insert (self->installed_apps,
+ g_strdup (gs_app_get_id (app)),
+ GUINT_TO_POINTER (1));
+ g_hash_table_remove (self->available_apps, gs_app_get_id (app));
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginDummy *self = GS_PLUGIN_DUMMY (plugin);
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ if (!g_str_has_prefix (gs_app_get_id (app), "proxy")) {
+ /* always fail */
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_DOWNLOAD_FAILED,
+ "no network connection is available");
+ gs_utils_error_add_origin_id (error, self->cached_origin);
+ return FALSE;
+ }
+
+ /* simulate an update for 4 seconds */
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ for (guint i = 1; i <= 4; ++i) {
+ gs_app_set_progress (app, 25 * i);
+ sleep (1);
+ }
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+
+ return TRUE;
+}
+
+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+");
+ }
+
+ /* 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_get_icons (app) == NULL) {
+ g_autoptr(GIcon) ic = g_themed_icon_new ("drive-harddisk");
+ 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;
+ const gchar * const *keywords = NULL;
+ GsApp *alternate_of = NULL;
+
+ task = g_task_new (plugin, 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);
+ }
+
+ /* 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_curated == GS_APP_QUERY_TRISTATE_FALSE ||
+ is_installed == 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) {
+ g_autoptr(GsApp) app1 = NULL;
+ g_autoptr(GsApp) app2 = NULL;
+
+ /* 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 {
+ /* add wildcard */
+ app1 = gs_app_new ("zeus.desktop");
+ gs_app_add_quirk (app1, GS_APP_QUIRK_IS_WILDCARD);
+ gs_app_set_metadata (app1, "GnomeSoftware::Creator",
+ gs_plugin_get_name (plugin));
+ gs_app_list_add (list, app1);
+ }
+ }
+
+ 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 ("drive-harddisk");
+
+ /* 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);
+ }
+ }
+
+ g_task_return_pointer (task, g_steal_pointer (&list), (GDestroyNotify) g_object_unref);
+}
+
+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, gs_app_list_new (), (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);
+}
+
+gboolean
+gs_plugin_download_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return gs_plugin_dummy_delay (plugin, app, 5100, cancellable, 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);
+}
+
+gboolean
+gs_plugin_app_upgrade_download (GsPlugin *plugin, GsApp *app,
+ GCancellable *cancellable, GError **error)
+{
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ g_debug ("starting download");
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ if (!gs_plugin_dummy_delay (plugin, app, 5000, cancellable, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+ gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_upgrade_trigger (GsPlugin *plugin, GsApp *app,
+ GCancellable *cancellable, GError **error)
+{
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* NOP */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update_cancel (GsPlugin *plugin, GsApp *app,
+ GCancellable *cancellable, GError **error)
+{
+ return TRUE;
+}
+
+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;
+}
+
+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..6ec64a8
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..c6ce9bd
--- /dev/null
+++ b/plugins/dummy/gs-self-test.c
@@ -0,0 +1,966 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+#include <locale.h>
+
+#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;
+
+typedef struct {
+ GError *error;
+ GMainLoop *loop;
+} GsDummyTestHelper;
+
+static GsDummyTestHelper *
+gs_dummy_test_helper_new (void)
+{
+ return g_new0 (GsDummyTestHelper, 1);
+}
+
+static void
+gs_dummy_test_helper_free (GsDummyTestHelper *helper)
+{
+ if (helper->error != NULL)
+ g_error_free (helper->error);
+ if (helper->loop != NULL)
+ g_main_loop_unref (helper->loop);
+ g_free (helper);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsDummyTestHelper, gs_dummy_test_helper_free)
+
+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(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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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(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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
+ "app", app,
+ NULL);
+ 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+");
+ 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(GsPluginJob) plugin_job = NULL;
+
+ /* get the updates list */
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_UPGRADE_TRIGGER,
+ "app", app,
+ NULL);
+ 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_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+");
+ 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/");
+ 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_newv (GS_PLUGIN_ACTION_URL_TO_APP,
+ "search", "dummy://chiron.desktop",
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
+ NULL);
+ 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
+plugin_job_action_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source);
+ GsDummyTestHelper *helper = (GsDummyTestHelper *) user_data;
+
+ gs_plugin_loader_job_action_finish (plugin_loader, res, &helper->error);
+ if (helper->loop != NULL)
+ g_main_loop_quit (helper->loop);
+}
+
+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(GsApp) app3 = 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(GsDummyTestHelper) helper1 = gs_dummy_test_helper_new ();
+ g_autoptr(GsDummyTestHelper) helper2 = gs_dummy_test_helper_new ();
+ g_autoptr(GsDummyTestHelper) helper3 = gs_dummy_test_helper_new ();
+
+ /* 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, &helper3->error);
+ gs_test_flush_main_context ();
+ g_assert_no_error (helper3->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 ();
+ helper3->loop = g_main_loop_new (context, FALSE);
+ 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_newv (GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "app", app1,
+ NULL);
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job1,
+ NULL,
+ plugin_job_action_cb,
+ helper1);
+
+ /* install an app */
+ plugin_job2 = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app2,
+ NULL);
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job2,
+ NULL,
+ plugin_job_action_cb,
+ helper2);
+
+ /* update an app */
+ plugin_job3 = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
+ "app", app3,
+ NULL);
+ gs_plugin_loader_job_process_async (plugin_loader,
+ plugin_job3,
+ NULL,
+ plugin_job_action_cb,
+ helper3);
+
+ /* since we have only 1 parallel installation op possible,
+ * verify the last operations are pending */
+ g_assert_cmpint (gs_app_get_state (app2), ==, GS_APP_STATE_QUEUED_FOR_INSTALL);
+ g_assert_cmpint (gs_app_get_pending_action (app2), ==, GS_PLUGIN_ACTION_INSTALL);
+ g_assert_cmpint (gs_app_get_state (app3), ==, GS_APP_STATE_UPDATABLE_LIVE);
+ g_assert_cmpint (gs_app_get_pending_action (app3), ==, GS_PLUGIN_ACTION_UPDATE);
+
+ /* wait for the 2nd installation to finish, it means the 1st should have been
+ * finished too */
+ g_main_loop_run (helper3->loop);
+ g_main_context_pop_thread_default (context);
+
+ gs_test_flush_main_context ();
+ g_assert_no_error (helper1->error);
+ g_assert_no_error (helper2->error);
+ g_assert_no_error (helper3->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 ("<?xml version=\"1.0\"?>\n"
+ "<components version=\"0.9\">\n"
+ " <component type=\"desktop\">\n"
+ " <id>chiron.desktop</id>\n"
+ " <name>Chiron</name>\n"
+ " <pkgname>chiron</pkgname>\n"
+ " </component>\n"
+ " <component type=\"desktop\">\n"
+ " <id>zeus.desktop</id>\n"
+ " <name>Zeus</name>\n"
+ " <summary>A teaching application</summary>\n"
+ " <pkgname>zeus</pkgname>\n"
+ " <icon type=\"stock\">drive-harddisk</icon>\n"
+ " <categories>\n"
+ " <category>AudioVideo</category>\n"
+ " <category>Player</category>\n"
+ " </categories>\n"
+ " <languages>\n"
+ " <lang percentage=\"100\">en_GB</lang>\n"
+ " </languages>\n"
+ " </component>\n"
+ " <component type=\"desktop\">\n"
+ " <id>mate-spell.desktop</id>\n"
+ " <name>Spell</name>\n"
+ " <summary>A spelling application for MATE</summary>\n"
+ " <pkgname>mate-spell</pkgname>\n"
+ " <icon type=\"stock\">drive-harddisk</icon>\n"
+ " <project_group>MATE</project_group>\n"
+ " </component>\n"
+ " <component type=\"addon\">\n"
+ " <id>zeus-spell.addon</id>\n"
+ " <extends>zeus.desktop</extends>\n"
+ " <name>Spell Check</name>\n"
+ " <summary>Check the spelling when teaching</summary>\n"
+ " <pkgname>zeus-spell</pkgname>\n"
+ " </component>\n"
+ " <component type=\"desktop\">\n"
+ " <id>Uninstall Zeus.desktop</id>\n"
+ " <name>Uninstall Zeus</name>\n"
+ " <summary>Uninstall the teaching application</summary>\n"
+ " <icon type=\"stock\">drive-harddisk</icon>\n"
+ " </component>\n"
+ " <component type=\"os-upgrade\">\n"
+ " <id>org.fedoraproject.release-rawhide.upgrade</id>\n"
+ " <name>Fedora Rawhide</name>\n"
+ " <summary>Release specific tagline</summary>\n"
+ " <pkgname>fedora-release</pkgname>\n"
+ " </component>\n"
+ " <info>\n"
+ " <scope>user</scope>\n"
+ " </info>\n"
+ "</components>\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..5b098db
--- /dev/null
+++ b/plugins/dummy/meson.build
@@ -0,0 +1,35 @@
+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',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : [plugin_libs],
+)
+
+if get_option('tests')
+ e = executable(
+ 'gs-self-test-dummy',
+ compiled_schemas,
+ sources : [
+ 'gs-self-test.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..641c7f4
--- /dev/null
+++ b/plugins/eos-updater/com.endlessm.Updater.xml
@@ -0,0 +1,292 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+ <!--
+ com.endlessm.Updater:
+ @short_description: Endless OS updater control interface
+
+ Interface to query the state of the OS updater, and to control it: checking
+ for, downloading and applying updates.
+
+ The updater moves through a series of states (see the `State` property and
+ `StateChanged` signal), with state transitions triggered by the appropriate
+ method call, or by an error in an operation. It will return a
+ `com.endlessm.Updater.Error.WrongState` error if you attempt to perform an
+ invalid state transition.
+ -->
+ <interface name="com.endlessm.Updater">
+ <!--
+ Poll:
+
+ Check for updates. This may be performed from the `Ready`,
+ `UpdateAvailable`, `UpdateReady` or `Error` states. It will immediately
+ transition to the `Polling` state. If an update is then successfully
+ found, it will transition to the `UpdateAvailable` state. If no update is
+ available, it will transition to the `Ready` state. If there is an error
+ checking for an update, it will transition to the `Error` state.
+
+ If an update is found, its details will be reported through the updater’s
+ properties once the updater reaches the `UpdateAvailable` state. In
+ particular, through the `UpdateID`, `UpdateRefspec`, `UpdateLabel` and
+ `UpdateMessage` properties.
+ -->
+ <method name="Poll"></method>
+
+ <!--
+ PollVolume:
+ @path: Absolute path to the root directory of a volume to check.
+
+ Like `Poll`, except this polls a specific removable volume (such as a USB
+ stick), rather than the internet.
+
+ If a `.ostree/repo` directory is available beneath @path, and it contains
+ a valid OSTree repository, that repository will be checked for updates.
+ If no such directory exists, the updater will transition to state `Ready`
+ as no update is available.
+ -->
+ <method name="PollVolume">
+ <arg name="path" type="s" direction="in"/>
+ </method>
+
+ <!--
+ Fetch:
+
+ Download an update. This may be performed from the `UpdateAvailable` state
+ only. It will immediately transition to the `Fetching` state. If the
+ update is successfully downloaded, it will transition to the `UpdateReady`
+ state; if there was an error it will transition to `Error`.
+
+ Download progress will be reported through the updater’s properties; in
+ particular, `DownloadedBytes`.
+ -->
+ <method name="Fetch"></method>
+
+ <!--
+ FetchFull:
+ @options: Potentially empty dictionary of options.
+
+ Like `Fetch`, except options may be provided to affect its behaviour.
+ Currently, the following options are supported (unsupported options are
+ ignored):
+
+ * `force` (type: `b`): If true, force the download without scheduling
+ it through the system’s metered data scheduler. Typically, this would
+ be true in response to an explicit user action, and false otherwise.
+ * `scheduling-timeout-seconds` (type: `u`): Number of seconds to wait
+ for permission to download from the system’s metered data scheduler,
+ before returning a `com.endlessm.Updater.Error.MeteredConnection`
+ error and cancelling the download. Pass zero to disable the timeout.
+ -->
+ <method name="FetchFull">
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+
+ <!--
+ Apply:
+
+ Apply a downloaded update so that it’s available to boot into on the next
+ boot. This may be performed from the `UpdateReady` state only. It will
+ immediately transition to the `Applying` state. If the update is
+ successfully applied, it will transition to the `UpdateApplied` state; if
+ there was an error it will transition to `Error`.
+ -->
+ <method name="Apply"></method>
+
+ <!--
+ Cancel:
+
+ Cancel the ongoing poll, fetch or apply operation. This may be performed
+ from the `Polling`, `Fetching` or `ApplyingUpdate` states. It will cancel
+ the operation then transition to the `Error` state, with the error
+ `com.endlessm.Updater.Error.Cancelled`.
+ -->
+ <method name="Cancel"></method>
+
+ <!--
+ State:
+
+ Current state of the updater. This will be one of the following:
+
+ * `0` (`None`): No state.
+ * `1` (`Ready`): Ready to perform an action.
+ * `2` (`Error`): An error occurred. See the `ErrorName` and
+ `ErrorMessage` properties for details.
+ * `3` (`Polling`): Checking for updates.
+ * `4` (`UpdateAvailable`): An update is available. See the `UpdateID`,
+ `UpdateRefspec`, `UpdateLabel` and `UpdateMessage` properties for
+ details.
+ * `5` (`Fetching`): Downloading an update. See the `DownloadedBytes`
+ property for progress updates.
+ * `6` (`UpdateReady`): Update downloaded and ready to apply.
+ * `7` (`ApplyingUpdate`): Applying an update.
+ * `8` (`UpdateApplied`): Update applied and ready to reboot into.
+
+ State changes are notified using the `StateChanged` signal.
+ -->
+ <property name="State" type="u" access="read"/>
+
+ <!--
+ UpdateID:
+
+ Checksum of the OSTree commit available as an update, or the empty string
+ if no update is available.
+ -->
+ <property name="UpdateID" type="s" access="read"/>
+
+ <!--
+ UpdateRefspec:
+
+ Refspec (remote name and branch name) of the OSTree commit available as an
+ update, or the empty string if no update is available.
+ -->
+ <property name="UpdateRefspec" type="s" access="read"/>
+
+ <!--
+ OriginalRefspec:
+
+ Refspec (remote name and branch name) of the currently booted OSTree
+ commit.
+ -->
+ <property name="OriginalRefspec" type="s" access="read"/>
+
+ <!--
+ CurrentID:
+
+ Checksum of the currently booted OSTree commit.
+ -->
+ <property name="CurrentID" type="s" access="read"/>
+
+ <!--
+ UpdateLabel:
+
+ Subject of the OSTree commit available as an update, or the empty string
+ if it’s not set or if no update is available. This is the title of the
+ update.
+ -->
+ <property name="UpdateLabel" type="s" access="read"/>
+
+ <!--
+ UpdateMessage:
+
+ Description body of the OSTree commit available as an update, or the empty
+ string if it’s not set or if no update is available. This is the
+ description of the update.
+ -->
+ <property name="UpdateMessage" type="s" access="read"/>
+
+ <!--
+ Version:
+
+ Version number of the OSTree commit available as an update, or the empty
+ string if it’s not set or if no update is available.
+ -->
+ <property name="Version" type="s" access="read"/>
+
+ <!--
+ DownloadSize:
+
+ Size (in bytes) of the update when downloaded, or `-1` if an update is
+ available but its download size is unknown. `0` if no update is available.
+ -->
+ <property name="DownloadSize" type="x" access="read"/>
+
+ <!--
+ DownloadedBytes:
+
+ Number of bytes of the update which have already been downloaded. This
+ will be `0` before a download starts, and could be `-1` if the
+ `DownloadSize` is unknown.
+ -->
+ <property name="DownloadedBytes" type="x" access="read"/>
+
+ <!--
+ UnpackedSize:
+
+ Size (in bytes) of the update when unpacked, or `-1` if an update is
+ available but its unpacked size is unknown. `0` if no update is available.
+ -->
+ <property name="UnpackedSize" type="x" access="read"/>
+
+ <!--
+ FullDownloadSize:
+
+ Version of `DownloadSize` which also includes the sizes of parts of the
+ update which are already present locally (and hence which don’t need to
+ be downloaded again).
+ -->
+ <property name="FullDownloadSize" type="x" access="read"/>
+
+ <!--
+ FullUnpackedSize:
+
+ Version of `UnpackedSize` which also includes the sizes of parts of the
+ update which are already unpacked locally (and hence which won’t occupy
+ further disk space once the update is applied).
+ -->
+ <property name="FullUnpackedSize" type="x" access="read"/>
+
+ <!--
+ ErrorCode:
+
+ Error code of the current error, or `0` if no error has been reported.
+ This is in an unspecified error doman, and hence is useless.
+
+ Deprecated: Use `ErrorName` instead.
+ -->
+ <property name="ErrorCode" type="u" access="read">
+ <annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
+ </property>
+
+ <!--
+ ErrorName:
+
+ A fully-qualified D-Bus error name, as might be returned from a D-Bus
+ method.
+
+ This is the empty string if no error has been reported.
+
+ Known errors include:
+
+ * `com.endlessm.Updater.Error.WrongState`: Method was called in a state
+ which doesn’t support that method.
+ * `com.endlessm.Updater.Error.LiveBoot`: The updater cannot be used
+ because the current system is a live boot.
+ * `com.endlessm.Updater.Error.WrongConfiguration`: A configuration file
+ contains an error.
+ * `com.endlessm.Updater.Error.NotOstreeSystem`: The updater cannot be
+ used because the current system is not booted from an OSTree commit.
+ * `com.endlessm.Updater.Error.Fetching`: Error when downloading an
+ update.
+ * `com.endlessm.Updater.Error.MalformedAutoinstallSpec`: An autoinstall
+ specification in the pending update contains an error.
+ * `com.endlessm.Updater.Error.UnknownEntryInAutoinstallSpec`: An
+ autoinstall specification in the pending update contains an unknown
+ entry.
+ * `com.endlessm.Updater.Error.FlatpakRemoteConflict`: An autoinstall
+ specification in the pending update contains a remote name which
+ doesn’t match the system’s configuration.
+ * `com.endlessm.Updater.Error.MeteredConnection`: A fetch operation timed
+ out while waiting for permission to download.
+ -->
+ <property name="ErrorName" type="s" access="read"/>
+
+ <!--
+ ErrorMessage:
+
+ A human-readable (but unlocalised) error message, or the empty string if
+ no error has been reported.
+ -->
+ <property name="ErrorMessage" type="s" access="read"/>
+
+ <!--
+ StateChanged:
+ @state: The new state.
+
+ Signal notifying of a change in the `State` property.
+ -->
+ <signal name="StateChanged">
+ <arg type="u" name="state"/>
+ </signal>
+ </interface>
+</node>
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..e4c6260
--- /dev/null
+++ b/plugins/eos-updater/gs-plugin-eos-updater.c
@@ -0,0 +1,1134 @@
+/* -*- 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 <jrocha@endlessm.com>
+ * Philip Withnall <withnall@endlessm.com>
+ *
+ * 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 <config.h>
+#include <gio/gio.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+#include <gnome-software.h>
+#include <gs-plugin.h>
+#include <gs-utils.h>
+#include <math.h>
+#include <ostree.h>
+
+#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 upgrade in the UI.
+ *
+ * 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 gs_plugin_app_upgrade_download() will result in this plugin calling
+ * a sequence of methods on the `eos-updater` daemon to check for, download and
+ * apply an update. Typically, gs_plugin_app_upgrade_download() 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 (gs_plugin_app_upgrade_download(),
+ * etc.) 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. Consequently, worker threads need
+ * to block on the main thread receiving state change signals from
+ * `eos-updater`. Receipt of these signals is notified through
+ * `state_change_cond`. This means that all functions which access
+ * `GsPluginEosUpdater` must lock it using the `mutex`.
+ *
+ * `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
+ * necessarily holding `mutex`.
+ *
+ * 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.
+ *
+ * FIXME: Once all methods are made asynchronous, the locking can be dropped
+ * from this plugin.
+ */
+
+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_unlocked (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 holding @mutex: */
+ GsEosUpdater *updater_proxy; /* (owned) */
+ GsApp *os_upgrade; /* (owned) */
+ GCancellable *cancellable; /* (owned) */
+ gulong cancelled_id;
+
+ /* These members must only ever be accessed from the main thread, so
+ * can be accessed without holding @mutex: */
+ gfloat upgrade_fake_progress;
+ guint upgrade_fake_progress_handler;
+
+ /* State synchronisation between threads: */
+ GMutex mutex;
+ GCond state_change_cond; /* locked by @mutex */
+};
+
+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, NULL, NULL, NULL);
+}
+
+static gboolean
+should_add_os_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_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;
+ }
+}
+
+/* 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_upgrade (old_state) !=
+ should_add_os_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);
+}
+
+/* This will be invoked in the main thread. */
+static void
+updater_state_changed (GsPluginEosUpdater *self)
+{
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex);
+
+ g_debug ("%s", G_STRFUNC);
+
+ sync_state_from_updater_unlocked (self);
+
+ /* Signal any blocked threads; typically this will be
+ * gs_plugin_app_upgrade_download() in a #GTask worker thread. */
+ g_cond_broadcast (&self->state_change_cond);
+}
+
+/* This will be invoked in the main thread. */
+static void
+updater_downloaded_bytes_changed (GsPluginEosUpdater *self)
+{
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex);
+
+ sync_state_from_updater_unlocked (self);
+}
+
+/* This will be invoked in the main thread, but doesn’t currently need to hold
+ * `mutex` since it only accesses `self->updater_proxy` and `self->os_upgrade`,
+ * both of which are internally thread-safe. */
+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, but doesn’t currently need to hold
+ * `mutex` since `self->updater_proxy` and `self->os_upgrade` are both
+ * thread-safe, and `self->upgrade_fake_progress` and
+ * `self->upgrade_fake_progress_handler` are only ever accessed from 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.
+ *
+ * It must be called with self->mutex already locked. */
+static void
+sync_state_from_updater_unlocked (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_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_INSTALLING);
+
+ 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);
+ 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);
+
+ /* 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);
+
+ 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_upgrade (previous_app_state) !=
+ should_add_os_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(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_eos_updater_setup_async);
+
+ g_debug ("%s", G_STRFUNC);
+
+ g_mutex_init (&self->mutex);
+ g_cond_init (&self->state_change_cond);
+
+ locker = g_mutex_locker_new (&self->mutex);
+
+ 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;
+ g_autoptr(GsOsRelease) os_release = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+ g_autoptr(GError) local_error = NULL;
+ const gchar *os_name;
+
+ locker = g_mutex_locker_new (&self->mutex);
+
+ 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);
+
+ /* prepare EOS upgrade app + sync initial state */
+
+ /* use stock icon */
+ ic = g_themed_icon_new ("system-component-addon");
+
+ /* 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";
+ g_clear_error (&local_error);
+ } else {
+ os_name = gs_os_release_get_name (os_release);
+ }
+
+ g_object_get (G_OBJECT (self->updater_proxy),
+ "version", &version,
+ "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);
+ }
+
+ /* 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);
+ 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_unlocked (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_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
+gs_plugin_eos_updater_finalize (GObject *object)
+{
+ GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (object);
+
+ g_cond_clear (&self->state_change_cond);
+ g_mutex_clear (&self->mutex);
+
+ G_OBJECT_CLASS (gs_plugin_eos_updater_parent_class)->finalize (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;
+
+ 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,
+ 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 (gs_app_get_state (self->os_upgrade))) {
+ g_debug ("Adding EOS 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");
+ }
+
+ 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);
+}
+
+/* Must be called with self->mutex already locked. */
+static gboolean
+wait_for_state_change_unlocked (GsPluginEosUpdater *self,
+ GCancellable *cancellable,
+ GError **error)
+{
+ EosUpdaterState old_state, new_state;
+
+ old_state = new_state = gs_eos_updater_get_state (self->updater_proxy);
+ g_debug ("%s: Old state ‘%s’", G_STRFUNC, eos_updater_state_to_str (old_state));
+
+ while (new_state == old_state &&
+ !g_cancellable_is_cancelled (cancellable)) {
+ g_cond_wait (&self->state_change_cond, &self->mutex);
+ new_state = gs_eos_updater_get_state (self->updater_proxy);
+ }
+
+ if (!g_cancellable_set_error_if_cancelled (cancellable, error)) {
+ g_debug ("%s: New state ‘%s’", G_STRFUNC, eos_updater_state_to_str (new_state));
+ return TRUE;
+ } else {
+ g_debug ("%s: Cancelled", G_STRFUNC);
+ return FALSE;
+ }
+}
+
+/* Could be executed in any thread. No need to hold `self->mutex` 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);
+
+ /* And wake up anything blocking on a state change. */
+ g_cond_broadcast (&self->state_change_cond);
+}
+
+/* Called in a #GTask worker thread, and it needs to hold `self->mutex` due to
+ * synchronising on state with the main thread. */
+gboolean
+gs_plugin_app_upgrade_download (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginEosUpdater *self = GS_PLUGIN_EOS_UPDATER (plugin);
+ gulong cancelled_id = 0;
+ EosUpdaterState state;
+ gboolean done, allow_restart;
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->mutex);
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* if the OS upgrade has been disabled */
+ if (self->updater_proxy == NULL) {
+ g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+ "The OS upgrade has been disabled in the EOS plugin");
+ return FALSE;
+ }
+
+ g_assert (app == self->os_upgrade);
+
+ /* Set up cancellation. */
+ g_debug ("Chaining cancellation from %p to %p", cancellable, self->cancellable);
+ if (cancellable != NULL) {
+ cancelled_id = g_cancellable_connect (cancellable,
+ G_CALLBACK (cancelled_cb),
+ plugin, NULL);
+ }
+
+ /* Step through the state machine until we are finished downloading and
+ * applying the update, or until an error occurs. All of the D-Bus calls
+ * here will block until the method call is complete. */
+ state = gs_eos_updater_get_state (self->updater_proxy);
+
+ done = FALSE;
+ allow_restart = (state == EOS_UPDATER_STATE_NONE ||
+ state == EOS_UPDATER_STATE_READY ||
+ state == EOS_UPDATER_STATE_ERROR);
+
+ while (!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 (allow_restart) {
+ allow_restart = FALSE;
+ g_debug ("Restarting OS upgrade from none/ready state");
+ if (!gs_eos_updater_call_poll_sync (self->updater_proxy,
+ cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+ } 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", app,
+ "action", GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "error", error_local,
+ NULL);
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
+ gs_plugin_report_event (plugin, event);
+
+ /* Error out. */
+ 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);
+
+ if (!gs_eos_updater_call_fetch_full_sync (self->updater_proxy,
+ g_variant_dict_end (&options_dict),
+ cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+
+ break;
+ }
+ 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 (app, max_progress_for_update);
+
+ if (!gs_eos_updater_call_apply_sync (self->updater_proxy,
+ cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+
+ break;
+ }
+ case EOS_UPDATER_STATE_APPLYING_UPDATE: {
+ /* Nothing to do here. */
+ break;
+ }
+ case EOS_UPDATER_STATE_UPDATE_APPLIED: {
+ /* Done! */
+ 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", app,
+ "action", GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "error", error_local,
+ NULL);
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
+ gs_plugin_report_event (plugin, 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, though, to prevent
+ * possible endless loops between the Poll/Error
+ * states. */
+ allow_restart = FALSE;
+ g_debug ("Restarting OS upgrade on error");
+ if (!gs_eos_updater_call_poll_sync (self->updater_proxy,
+ cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+
+ /* Error out. */
+ done = TRUE;
+
+ break;
+ }
+ default:
+ g_warning ("Encountered unknown eos-updater state: %u", state);
+ break;
+ }
+
+ /* Block on the next state change. */
+ if (!done &&
+ !wait_for_state_change_unlocked (self, cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+ }
+
+ if (cancellable != NULL && cancelled_id != 0) {
+ g_debug ("Disconnecting cancellable %p", cancellable);
+ g_cancellable_disconnect (cancellable, cancelled_id);
+ }
+
+ /* 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_propagate_error (error, g_steal_pointer (&error_local));
+
+ return FALSE;
+ } else if (g_cancellable_set_error_if_cancelled (cancellable, error)) {
+ gs_eos_updater_error_convert (error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+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;
+ object_class->finalize = gs_plugin_eos_updater_finalize;
+
+ 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;
+}
+
+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..a87b649
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..19edf22
--- /dev/null
+++ b/plugins/eos-updater/meson.build
@@ -0,0 +1,25 @@
+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',
+)
+
+shared_module(
+ 'gs_plugin_eos-updater',
+ eos_updater_generated,
+ sources : 'gs-plugin-eos-updater.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..5e4aa8d
--- /dev/null
+++ b/plugins/eos-updater/tests/eos_updater.py
@@ -0,0 +1,414 @@
+'''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 ./plugins/eos-updater/tests/mock-eos-updater.py
+'''
+
+# 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
+from gi.repository import GLib
+import time
+
+import dbus
+import dbus.mainloop.glib
+from dbusmock import MOCK_IFACE
+
+
+__author__ = 'Philip Withnall'
+__email__ = 'withnall@endlessm.com'
+__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', '')),
+ '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':
+ 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':
+ 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':
+ 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,
+ ]))
+
+ 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),
+ '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',
+ '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..537ed40
--- /dev/null
+++ b/plugins/epiphany/gs-plugin-epiphany.c
@@ -0,0 +1,1183 @@
+/* -*- 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 <mwleeds@protonmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+#include <fcntl.h>
+#include <gio/gunixfdlist.h>
+#include <glib/gstdio.h>
+
+#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 <id> 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,
+ GCancellable *cancellable,
+ GError **error);
+
+/* Run in @worker. The caller must have already done ensure_installed_apps_cache() */
+static void
+gs_epiphany_refine_app_state (GsPlugin *plugin,
+ GsApp *app)
+{
+ GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin);
+
+ assert_in_worker (self);
+
+ 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,
+ "https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/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");
+ gs_app_set_origin_ui (app, _("GNOME Web"));
+
+ 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_get_icons (app) == NULL &&
+ 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,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GVariant) webapps_v = NULL;
+ 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,
+ &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, 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;
+ g_autoptr(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ if (!ensure_installed_apps_cache (self, 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);
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin);
+ const char *url;
+ const char *name;
+ const char *token = NULL;
+ g_autofree char *installed_app_id = NULL;
+ g_autoptr(GVariant) token_v = NULL;
+ g_autoptr(GVariant) icon_v = NULL;
+ GVariantBuilder opt_builder;
+ const int icon_sizes[] = {512, 192, 128, 1};
+
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ url = gs_app_get_url (app, AS_URL_KIND_HOMEPAGE);
+ if (url == NULL || *url == '\0') {
+ g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+ "Can't install web app %s without url",
+ gs_app_get_id (app));
+ return FALSE;
+ }
+ name = gs_app_get_name (app);
+ if (name == NULL || *name == '\0') {
+ g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+ "Can't install web app %s without name",
+ gs_app_get_id (app));
+ return FALSE;
+ }
+ for (guint i = 0; i < G_N_ELEMENTS (icon_sizes); i++) {
+ GIcon *icon = gs_app_get_icon_for_size (app, icon_sizes[i], 1, NULL);
+ if (icon != NULL)
+ icon_v = get_serialized_icon (app, icon);
+ if (icon_v != NULL)
+ break;
+ }
+ if (icon_v == NULL) {
+ g_set_error (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+ "Can't install web app %s without icon",
+ gs_app_get_id (app));
+ return FALSE;
+ }
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ /* First get a token from xdg-desktop-portal so Epiphany can do the
+ * installation without user confirmation
+ */
+ g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT);
+ token_v = g_dbus_proxy_call_sync (self->launcher_portal_proxy,
+ "RequestInstallToken",
+ g_variant_new ("(sva{sv})",
+ name, icon_v, &opt_builder),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, cancellable, error);
+ if (token_v == NULL) {
+ gs_epiphany_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* Then pass the token to Epiphany which will use xdg-desktop-portal to
+ * complete the installation
+ */
+ g_variant_get (token_v, "(&s)", &token);
+ if (!gs_ephy_web_app_provider_call_install_sync (self->epiphany_proxy,
+ url, name, token,
+ &installed_app_id,
+ cancellable,
+ error)) {
+ gs_epiphany_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ {
+ g_autoptr(GMutexLocker) locker = g_mutex_locker_new (&self->installed_apps_mutex);
+ g_hash_table_insert (self->url_id_map, g_strdup (url),
+ g_strdup (installed_app_id));
+ }
+
+ gs_app_set_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID, installed_app_id);
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginEpiphany *self = GS_PLUGIN_EPIPHANY (plugin);
+ const char *installed_app_id;
+ const char *url;
+
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ installed_app_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID);
+ if (installed_app_id == NULL) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "App can't be uninstalled without installed app ID");
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ if (!gs_ephy_web_app_provider_call_uninstall_sync (self->epiphany_proxy,
+ installed_app_id,
+ cancellable,
+ error)) {
+ gs_epiphany_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ url = gs_app_get_launchable (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
+ */
+ gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ return gs_plugin_app_launch (plugin, app, 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;
+}
+
+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..955d059
--- /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 <mwleeds@protonmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..1b91021
--- /dev/null
+++ b/plugins/epiphany/gs-self-test.c
@@ -0,0 +1,240 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2021 Matthew Leeds <mwleeds@protonmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <libglib-testing/dbus-queue.h>
+
+/* 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, ==, "GNOME Web");
+ 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_autofree gchar *fn = NULL;
+ g_autofree gchar *xml = NULL;
+ 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..05fc7b6
--- /dev/null
+++ b/plugins/epiphany/meson.build
@@ -0,0 +1,87 @@
+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',
+)
+
+shared_module(
+ 'gs_plugin_epiphany',
+ epiphany_generated,
+ sources : 'gs-plugin-epiphany.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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')
+ # 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,
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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 @@
+<?xml version="1.0"?>
+<!--
+ Copyright (C) 2021 Matthew Leeds
+
+ 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 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, see <http://www.gnu.org/licenses/>.
+
+ Author: Matthew Leeds <mwleeds@protonmail.com>
+-->
+
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <!--
+ org.freedesktop.portal.DynamicLauncher:
+ @short_description: Portal for installing application launchers onto the
+ desktop
+
+ The DynamicLauncher portal allows sandboxed (or unsandboxed) applications
+ to install launchers (.desktop files) which have an icon associated with them
+ and which execute a command in the application. The desktop environment
+ would display the launcher to the user in its menu of installed applications.
+ For example this can be used by a sandboxed browser to install web app
+ launchers. The portal also allows apps to uninstall the launchers, launch
+ them, and read the desktop file and icon data for them.
+
+ The standard way to install a launcher is to use the PrepareInstall() method
+ which results in a dialog being presented to the user so they can confirm
+ they want to install the launcher. Then, the token returned by PrepareInstall()
+ would be passed to the Install() method to complete the installation.
+
+ However, in the rare circumstance that an unsandboxed process such as a
+ system component needs to install a launcher without user interaction, this
+ can be accomplished by using the RequestInstallToken() method and passing
+ the acquired token to Install().
+
+ This documentation describes version 1 of this interface.
+ -->
+ <interface name="org.freedesktop.portal.DynamicLauncher">
+ <!--
+ Install:
+ @token: Token proving authorization of the installation
+ @desktop_file_id: The .desktop file name to be used
+ @desktop_entry: The text of the Desktop Entry file to be installed, see below
+ @options: Vardict with optional further information
+
+ Installs a .desktop launcher and icon into appropriate directories to
+ allow the desktop environment to find them. Please note that this method
+ overwrites any existing launcher with the same id. If you want to
+ present the user with a confirmation dialog in that case, you can check
+ for it using the GetDesktopEntry() method and clean up any state from
+ the previous launcher if you want.
+
+ @token must be a token that was returned by a previous
+ org.freedesktop.portal.DynamicLauncher.PrepareInstall() or
+ org.freedesktop.portal.DynamicLauncher.RequestInstallToken() call.
+ The token can only be used once and is valid for up to five minutes.
+
+ The icon and name used for the launcher will be the ones from the previous
+ org.freedesktop.portal.DynamicLauncher.PrepareInstall() or
+ org.freedesktop.portal.DynamicLauncher.RequestInstallToken() call.
+
+ The @desktop_file_id must have ".desktop" as a suffix. Except in the
+ special case when the calling process has no associated app ID,
+ @desktop_file_id must have the app ID followed by a period as a prefix,
+ regardless of whether the calling process is sandboxed or unsandboxed.
+
+ The @desktop_entry should be a valid desktop entry file beginning with
+ "[Desktop Entry]", except it should not include Name= or Icon= entries
+ (if present, these will be overwritten by the portal implementation).
+ The Exec= entry will be rewritten to call the sandboxed application e.g.
+ via "flatpak run", if the application is sandboxed.
+
+ It is recommended to include a TryExec= line with either a binary name
+ or an absolute path. The launcher will be deleted if the TryExec binary
+ cannot be found on session start.
+
+ The @options vardict currently has no supported entries.
+ -->
+ <method name="Install">
+ <arg type="s" name="token" direction="in"/>
+ <arg type="s" name="desktop_file_id" direction="in"/>
+ <arg type="s" name="desktop_entry" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ </method>
+ <!--
+ PrepareInstall:
+ @parent_window: Identifier for the application window, see <link linkend="parent_window">Common Conventions</link>
+ @name: The default name for the launcher
+ @icon_v: A #GBytesIcon icon as returned by g_icon_serialize(). Must be
+ a png or jpeg no larger than 512x512, or an svg
+ @options: Vardict with optional further information
+ @handle: Object path for the #org.freedesktop.portal.Request object representing this call
+
+ Presents a dialog to the user to allow them to see the icon, potentially
+ change the name, and confirm installation of the launcher.
+
+ Supported keys in the @options vardict:
+ <variablelist>
+ <varlistentry>
+ <term>handle_token s</term>
+ <listitem><para>
+ A string that will be used as the last element of the @handle. Must be a valid
+ object path element. See the #org.freedesktop.portal.Request documentation for
+ more information about the @handle.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>modal b</term>
+ <listitem><para>
+ Whether to make the dialog modal. Defaults to yes.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>launcher_type u</term>
+ <listitem><para>
+ The type of launcher being created. For supported values see the
+ SupportedLauncherTypes property. Defaults to "Application".
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>target s</term>
+ <listitem><para>
+ For a launcher of type "Webapp", this is the URL of the web app
+ being installed. This is displayed in the user-facing dialog.
+ For other launcher types, this is not needed.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>editable_name b</term>
+ <listitem><para>
+ If true, the user will be able to edit the name of the launcher.
+ Defaults to true.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>editable_icon b</term>
+ <listitem><para>
+ If true, the user will be able to edit the icon of the launcher,
+ if the implementation supports this. Defaults to false.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ The following results get returned via the #org.freedesktop.portal.Request::Response signal:
+ <variablelist>
+ <varlistentry>
+ <term>name s</term>
+ <listitem><para>
+ The name chosen by the user for the launcher.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>token s</term>
+ <listitem><para>
+ Token that can be passed to a subsequent org.freedesktop.portal.DynamicLauncher.Install() call to
+ complete the installation without another dialog.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <method name="PrepareInstall">
+ <arg type="s" name="parent_window" direction="in"/>
+ <arg type="s" name="name" direction="in"/>
+ <arg type="v" name="icon_v" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="o" name="handle" direction="out"/>
+ </method>
+ <!--
+ RequestInstallToken:
+ @name: The name that will be used in the desktop file
+ @icon_v: A #GBytesIcon icon as returned by g_icon_serialize(). Must be
+ a png or jpeg no larger than 512x512, or an svg
+ @options: Vardict with optional further information
+ @token: the token to be used with the Install() method
+
+ This method is intended for use only by specific components that
+ have their application ID allowlisted in the portal backend (e.g. GNOME
+ Software and KDE Discover). It is otherwise not guaranteed to work.
+
+ The token returned by this method can be used to avoid the need for a
+ confirmation dialog; the token can be passed to the Install() method
+ just as if it were acquired via the PrepareInstall() method.
+
+ The @options vardict currently has no supported entries.
+ -->
+ <method name="RequestInstallToken">
+ <arg type="s" name="name" direction="in"/>
+ <arg type="v" name="icon_v" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="token" direction="out"/>
+ </method>
+ <!--
+ Uninstall:
+ @desktop_file_id: The .desktop file name
+ @options: Vardict with optional further information
+
+ This method deletes the desktop file and corresponding icon from the
+ appropriate directories to remove the launcher referred to by
+ @desktop_file_id.
+
+ The @desktop_file_id must have ".desktop" as a suffix. Except in the
+ special case when the calling process has no associated app ID,
+ @desktop_file_id must have the app ID followed by a period as a prefix,
+ regardless of whether the calling process is sandboxed or unsandboxed.
+
+ For example, Epiphany, which has the app ID "org.gnome.Epiphany"
+ in stable builds, might use a @desktop_file_id like
+ "org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043.desktop"
+ In that example the desktop file would exist at the path
+ "~/.local/share/xdg-desktop-portal/applications/org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043.desktop"
+ with a sym link in "~/.local/share/applications/".
+ The checksum at the end of the file name is an implementation detail in
+ Epiphany and not required by the portal.
+
+ This method is intended to be called by the application that created the
+ launcher, e.g. a web browser, so it can clean up associated data as part
+ of the uninstallation. Consequently, the proper way for a software center
+ to remove a launcher is by using the APIs provided by the application
+ that installed it. For example, for GNOME Software to remove web
+ launchers created by Epiphany, it would use the
+ org.gnome.Epiphany.WebAppProvider D-Bus interface.
+
+ Please note that this method call will fail if the specified launcher
+ already does not exist.
+
+ The @options vardict currently has no supported entries.
+ -->
+ <method name="Uninstall">
+ <arg type="s" name="desktop_file_id" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ </method>
+ <!--
+ GetDesktopEntry:
+ @desktop_file_id: The .desktop file name
+ @contents: the contents of the named .desktop file
+
+ This function returns the contents of a desktop file with the name
+ @desktop_file_id in @contents.
+
+ The @desktop_file_id must have ".desktop" as a suffix. Except in the
+ special case when the calling process has no associated app ID,
+ @desktop_file_id must have the app ID followed by a period as a prefix.
+
+ This method only works for desktop files that were created by the
+ dynamic launcher portal.
+ -->
+ <method name="GetDesktopEntry">
+ <arg type="s" name="desktop_file_id" direction="in"/>
+ <arg type="s" name="contents" direction="out"/>
+ </method>
+ <!--
+ GetIcon:
+ @desktop_file_id: The .desktop file name
+ @icon_v: the icon as a serialized #GBytesIcon
+ @icon_format: one of "png", "jpeg", "svg"
+ @icon_size: the width and height in pixels of the icon
+
+ This function returns the contents of the icon specified in the "Icon"
+ key of the desktop file with the name @desktop_file_id in @icon_v. The
+ icon #GVariant can be passed to g_icon_deserialize() to reconstruct the
+ #GIcon.
+
+ The @desktop_file_id must have ".desktop" as a suffix. Except in the
+ special case when the calling process has no associated app ID,
+ @desktop_file_id must have the app ID followed by a period as a prefix.
+
+ The format and size of the icon are returned in @icon_format and
+ @icon_size. For svg icons, @icon_size is currently always set to 4096,
+ but don't depend on that as it may change in the future.
+
+ This method only works for desktop files that were created by the
+ dynamic launcher portal.
+ -->
+ <method name="GetIcon">
+ <arg type="s" name="desktop_file_id" direction="in"/>
+ <arg type="v" name="icon_v" direction="out"/>
+ <arg type="s" name="icon_format" direction="out"/>
+ <arg type="u" name="icon_size" direction="out"/>
+ </method>
+ <!--
+ Launch:
+ @desktop_file_id: The .desktop file name
+ @options: Vardict with optional further onformation
+
+ This function launches the app specified by @desktop_file_id.
+
+ The @desktop_file_id must have ".desktop" as a suffix. Except in the
+ special case when the calling process has no associated app ID,
+ @desktop_file_id must have the app ID followed by a period as a prefix.
+
+ This method only works for desktop files that were created by the
+ dynamic launcher portal.
+
+ Supported keys in the @options vardict include:
+ <variablelist>
+ <varlistentry>
+ <term>activation_token s</term>
+ <listitem><para>
+ A token that can be used to activate the chosen application.
+ </para><para>
+ The activation_token option was introduced in version 1 of the interface.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ -->
+ <method name="Launch">
+ <arg type="s" name="desktop_file_id" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ </method>
+ <!--
+ SupportedLauncherTypes:
+
+ A bitmask of available launcher types. Currently defined types are:
+
+ <simplelist>
+ <member>1: Application. A launcher that represents an application.</member>
+ <member>2: Webapp. A launcher that represents a web app.</member>
+ </simplelist>
+ -->
+ <property name="SupportedLauncherTypes" type="u" access="read"/>
+ <property name="version" type="u" access="read"/>
+ </interface>
+</node>
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 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+ <!--
+ org.gnome.Epiphany.WebAppProvider:
+ @short_description: Webapp provider interface
+
+ The interface used for handling Epiphany Webapps in GNOME Software, or other
+ clients (version 1).
+ -->
+ <interface name="org.gnome.Epiphany.WebAppProvider">
+ <!--
+ GetInstalledApps:
+ @desktop_file_ids: An array of .desktop file names, one for each
+ installed web app, with the .desktop suffix included
+
+ Returns the set of installed Epiphany web applications. The caller can
+ use them with g_desktop_app_info_new() if outside the sandbox.
+ -->
+ <method name="GetInstalledApps">
+ <arg type="as" name="webapps" direction="out" />
+ </method>
+
+ <!--
+ Install:
+ @url: the URL of the web app
+ @name: the human readable name of the web app
+ @install_token: the token acquired via org.freedesktop.portal.InstallDynamicLauncher
+ @desktop_file_id: the desktop file id of the installed app, with a
+ ".desktop" suffix
+
+ Installs a web app. This interface is expected to be used by trusted
+ system components such as GNOME Software, which can acquire an
+ @install_token using the portal method
+ org.freedesktop.portal.DynamicLauncher.RequestInstallToken(). This allows Epiphany
+ to install the web app without user interaction and despite being sandboxed.
+ This is desirable because the user would've already clicked "Install" in
+ Software; they should not have to confirm the operation again in a different
+ app (Epiphany).
+
+ The @install_token must be provided so that Epiphany can complete the
+ installation without a user-facing dialog. The icon given to
+ org.freedesktop.portal.InstallDynamicLauncher.RequestInstallToken() will
+ be used, and the name given to that method should match the @name given here.
+
+ If the arguments passed are invalid this method returns the error
+ `org.gnome.Epiphany.WebAppProvider.Error.InvalidArgs`, and otherwise
+ `org.gnome.Epiphany.WebAppProvider.Error.Failed`.
+ -->
+ <method name="Install">
+ <arg type="s" name="url" direction="in" />
+ <arg type="s" name="name" direction="in" />
+ <arg type="s" name="install_token" direction="in" />
+ <arg type="s" name="desktop_file_id" direction="out" />
+ </method>
+
+ <!--
+ Uninstall:
+ @desktop_file_id: the filename of the .desktop file for an installed web
+ app, with the .desktop suffix
+
+ Uninstalls a web app. Note that the @desktop_file_id is just a filename
+ not a full path, and it's the same one returned by the
+ GetInstalledWebApps() method.
+
+ The error `org.gnome.Epiphany.WebAppProvider.Error.NotInstalled` will be
+ returned if the specified web app is not installed. The other possible
+ error values are `org.gnome.Epiphany.WebAppProvider.Error.InvalidArgs`
+ and `org.gnome.Epiphany.WebAppProvider.Error.Failed`.
+ -->
+ <method name="Uninstall">
+ <arg type="s" name="desktop_file_id" direction="in" />
+ </method>
+ <!--
+ Version:
+
+ The API version number, to be incremented for backwards compatible
+ changes so clients can determine which features are available. For
+ backwards incompatible changes, the interface name will change.
+ -->
+ <property name="Version" type="u" access="read"/>
+ </interface>
+</node>
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..626381f
--- /dev/null
+++ b/plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="addon">
+ <id>org.gnome.Software.Plugin.Epiphany</id>
+ <extends>org.gnome.Software.desktop</extends>
+ <name>Web Apps Support</name>
+ <summary>Run popular web applications in a browser</summary>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <update_contact>mwleeds_at_protonmail.com</update_contact>
+</component>
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..cea7d6c
--- /dev/null
+++ b/plugins/fedora-langpacks/gs-plugin-fedora-langpacks.c
@@ -0,0 +1,140 @@
+/* -*- 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 <suanand@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * 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 <gnome-software.h>
+
+#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_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);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+ g_hash_table_insert (self->locale_langpack_map, "en_GB", "langpacks-en_GB");
+ g_hash_table_insert (self->locale_langpack_map, "pt_BR", "langpacks-pt_BR");
+ g_hash_table_insert (self->locale_langpack_map, "zh_CN", "langpacks-zh_CN");
+ g_hash_table_insert (self->locale_langpack_map, "zh_TW", "langpacks-zh_TW");
+ g_hash_table_insert (self->locale_langpack_map, "zh_HK", "langpacks-zh_HK");
+#pragma GCC diagnostic pop
+}
+
+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..2a6a428
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..c56058a
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+
+#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..c3dc057
--- /dev/null
+++ b/plugins/fedora-langpacks/meson.build
@@ -0,0 +1,34 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginFedoraLangpacks"']
+
+shared_module(
+ 'gs_plugin_fedora-langpacks',
+ sources : 'gs-plugin-fedora-langpacks.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+if get_option('tests')
+ cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"']
+ e = executable(
+ 'gs-self-test-fedora-langpacks',
+ compiled_schemas,
+ sources : [
+ 'gs-self-test.c',
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..1f788ca
--- /dev/null
+++ b/plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
@@ -0,0 +1,855 @@
+/* -*- 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 <klember@redhat.com>
+ * Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <json-glib/json-glib.h>
+#include <gnome-software.h>
+
+#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) */
+};
+
+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 '%s' as we're not Fedora", gs_plugin_get_name (plugin));
+ return;
+ }
+ self->distros = g_ptr_array_new_with_free_func ((GDestroyNotify) _pkgdb_item_free);
+ self->settings = g_settings_new ("org.gnome.software");
+
+ /* require the GnomeSoftware::CpeName metadata */
+ gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "os-release");
+
+ /* 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_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)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+ g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
+ 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 */
+ gs_app_set_summary_missing (app_dl,
+ /* TRANSLATORS: status text when downloading */
+ _("Downloading upgrade information…"));
+
+ 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));
+}
+
+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;
+
+ 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;
+ }
+
+ /* success */
+ self->is_valid = FALSE;
+
+ g_task_return_boolean (task, TRUE);
+}
+
+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);
+ 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-%u-workstation",
+ 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;
+
+ /* 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 PkgdbItem *
+_get_item_by_cpe_name (GPtrArray *distros,
+ const gchar *cpe_name)
+{
+ guint64 version;
+ g_auto(GStrv) split = NULL;
+
+ /* split up 'cpe:/o:fedoraproject:fedora:26' to sections */
+ split = g_strsplit (cpe_name, ":", -1);
+ if (g_strv_length (split) < 5) {
+ g_warning ("CPE invalid format: %s", cpe_name);
+ return NULL;
+ }
+
+ /* find the correct collection */
+ version = g_ascii_strtoull (split[4], NULL, 10);
+ if (version == 0) {
+ g_warning ("failed to parse CPE version: %s", split[4]);
+ return NULL;
+ }
+ for (guint i = 0; i < distros->len; i++) {
+ PkgdbItem *item = g_ptr_array_index (distros, i);
+ if (g_ascii_strcasecmp (item->name, split[3]) == 0 &&
+ item->version == version)
+ return item;
+ }
+ return NULL;
+}
+
+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 (GPtrArray *distros,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ PkgdbItem *item;
+ const gchar *cpe_name;
+
+ /* not for us */
+ if (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM)
+ return TRUE;
+
+ /* not enough metadata */
+ cpe_name = gs_app_get_metadata_item (app, "GnomeSoftware::CpeName");
+ if (cpe_name == NULL)
+ return TRUE;
+
+ /* find item */
+ item = _get_item_by_cpe_name (distros, cpe_name);
+ if (item == NULL) {
+ g_warning ("did not find %s", cpe_name);
+ return TRUE;
+ }
+
+ /* fix the state */
+ switch (item->status) {
+ case PKGDB_ITEM_STATUS_ACTIVE:
+ case PKGDB_ITEM_STATUS_DEVEL:
+ gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+ break;
+ case PKGDB_ITEM_STATUS_EOL:
+ gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE);
+ break;
+ default:
+ break;
+ }
+
+ 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;
+ g_autoptr(GError) local_error = NULL;
+
+ 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 (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..058dc2f
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..9058572
--- /dev/null
+++ b/plugins/fedora-pkgdb-collections/meson.build
@@ -0,0 +1,14 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginFedoraPkgdbCollections"']
+
+shared_module(
+ 'gs_plugin_fedora-pkgdb-collections',
+ sources : 'gs-plugin-fedora-pkgdb-collections.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..b59515b
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#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..610c8a8
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gnome-software.h>
+#include <flatpak.h>
+
+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..7377f6d
--- /dev/null
+++ b/plugins/flatpak/gs-flatpak-transaction.c
@@ -0,0 +1,761 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include "gs-flatpak-app.h"
+#include "gs-flatpak-transaction.h"
+
+struct _GsFlatpakTransaction {
+ FlatpakTransaction parent_instance;
+ GHashTable *refhash; /* ref:GsApp */
+ GError *first_operation_error;
+};
+
+enum {
+ SIGNAL_REF_TO_APP,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (GsFlatpakTransaction, gs_flatpak_transaction, FLATPAK_TYPE_TRANSACTION)
+
+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_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)
+{
+ GPtrArray *related_to_ops; /* (element-type FlatpakTransactionOperation) */
+
+ if (op == root_op)
+ return 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))
+ return TRUE;
+ }
+
+ 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
+ *
+ * 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)
+{
+ 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)
+ 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)) {
+ /* 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)
+{
+ GPtrArray *related_to_ops = flatpak_transaction_operation_get_related_to_ops (root_op);
+
+ /* Update progress for @root_op */
+ update_progress_for_op (self, progress, ops, current_op, root_op);
+
+ /* 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);
+ }
+}
+
+static void
+_transaction_progress_changed_cb (FlatpakTransactionProgress *progress,
+ gpointer user_data)
+{
+ ProgressData *data = user_data;
+ GsApp *app = data->app;
+ GsFlatpakTransaction *self = data->transaction;
+ 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));
+ update_progress_for_op_recurse_up (self, progress, ops, data->operation, data->operation);
+}
+
+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);
+
+ 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 (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);
+ }
+ return FALSE; /* stop */
+}
+
+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)
+{
+ 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_transaction_add_rebase (transaction, remote, rebased_to_ref,
+ NULL, previous_ids, &local_error) ||
+ !flatpak_transaction_add_uninstall (transaction, ref, &local_error)) {
+ /* There's no way to make the whole transaction fail on
+ * this error path, so just print a warning and return
+ * FALSE, which will cause the operation on the
+ * end-of-lifed ref not to be skipped.
+ */
+ g_warning ("Failed to rebase %s to %s: %s", ref, rebased_to_ref, local_error->message);
+ 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 applications */
+ 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->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;
+
+ 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);
+}
+
+FlatpakTransaction *
+gs_flatpak_transaction_new (FlatpakInstallation *installation,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsFlatpakTransaction *self;
+ self = g_initable_new (GS_TYPE_FLATPAK_TRANSACTION,
+ cancellable, error,
+ "installation", installation,
+ NULL);
+ if (self == NULL)
+ return NULL;
+ return FLATPAK_TRANSACTION (self);
+}
diff --git a/plugins/flatpak/gs-flatpak-transaction.h b/plugins/flatpak/gs-flatpak-transaction.h
new file mode 100644
index 0000000..1cc2a07
--- /dev/null
+++ b/plugins/flatpak/gs-flatpak-transaction.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) 2018 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gnome-software.h>
+#include <flatpak.h>
+
+G_BEGIN_DECLS
+
+#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,
+ 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);
+
+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..9675810
--- /dev/null
+++ b/plugins/flatpak/gs-flatpak-utils.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) 2017-2018 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <ostree.h>
+
+#include <glib/gi18n.h>
+
+#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, _("Applications"));
+
+ 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:"))) {
+ 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", "accent_color");
+ gs_app_set_metadata (app, "GnomeSoftware::PackagingIcon", "flatpak-symbolic");
+}
diff --git a/plugins/flatpak/gs-flatpak-utils.h b/plugins/flatpak/gs-flatpak-utils.h
new file mode 100644
index 0000000..8275828
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+G_BEGIN_DECLS
+
+#include <gnome-software.h>
+
+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..aac55b1
--- /dev/null
+++ b/plugins/flatpak/gs-flatpak.c
@@ -0,0 +1,4624 @@
+/* -*- 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 <jrocha@endlessm.com>
+ * Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2016-2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/* 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 <config.h>
+
+#include <glib/gi18n.h>
+#include <xmlb.h>
+
+#include "gs-appstream.h"
+#include "gs-flatpak-app.h"
+#include "gs-flatpak.h"
+#include "gs-flatpak-utils.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 */
+ GMutex installed_refs_mutex;
+ GHashTable *broken_remotes;
+ GMutex broken_remotes_mutex;
+ GFileMonitor *monitor;
+ AsComponentScope scope;
+ GsPlugin *plugin;
+ XbSilo *silo;
+ GRWLock silo_lock;
+ 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) {
+ 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_kind_from_flatpak (GsApp *app, FlatpakRef *xref)
+{
+ if (flatpak_ref_get_kind (xref) == FLATPAK_REF_KIND_APP) {
+ gs_app_set_kind (app, AS_COMPONENT_KIND_DESKTOP_APP);
+ } else if (flatpak_ref_get_kind (xref) == FLATPAK_REF_KIND_RUNTIME) {
+ 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 {
+ gs_app_set_kind (app, AS_COMPONENT_KIND_RUNTIME);
+ }
+ }
+}
+
+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 GsAppPermissions *
+perms_from_metadata (GKeyFile *keyfile)
+{
+ char **strv;
+ char *str;
+ GsAppPermissions *permissions = gs_app_permissions_new ();
+ GsAppPermissionsFlags flags = GS_APP_PERMISSIONS_FLAGS_UNKNOWN;
+
+ 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;
+ if (strv != NULL && g_strv_contains ((const gchar * const*)strv, "session-bus"))
+ flags |= GS_APP_PERMISSIONS_FLAGS_SESSION_BUS;
+ 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;
+ 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;
+ 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-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 }
+ };
+ 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 (str != NULL && g_str_equal (str, "talk"))
+ flags |= GS_APP_PERMISSIONS_FLAGS_SETTINGS;
+ g_free (str);
+
+ if (!(flags & GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX)) {
+ str = g_key_file_get_string (keyfile, "Session Bus Policy", "org.freedesktop.Flatpak", NULL);
+ if (str != NULL && g_str_equal (str, "talk"))
+ flags |= GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX;
+ g_free (str);
+ }
+
+ if (!(flags & GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX)) {
+ str = g_key_file_get_string (keyfile, "Session Bus Policy", "org.freedesktop.impl.portal.PermissionStore", NULL);
+ if (str != NULL && g_str_equal (str, "talk"))
+ flags |= GS_APP_PERMISSIONS_FLAGS_ESCAPE_SANDBOX;
+ g_free (str);
+ }
+
+ /* no permissions set */
+ if (flags == GS_APP_PERMISSIONS_FLAGS_UNKNOWN)
+ flags = GS_APP_PERMISSIONS_FLAGS_NONE;
+
+ 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 = gs_app_permissions_new ();
+ g_autoptr(GError) error_local = NULL;
+
+ old_bytes = flatpak_installed_ref_load_metadata (FLATPAK_INSTALLED_REF (xref), NULL, NULL);
+ 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);
+ gs_app_permissions_set_flags (additional_permissions, GS_APP_PERMISSIONS_FLAGS_UNKNOWN);
+ } else {
+ g_autoptr(GsAppPermissions) old_permissions = NULL;
+ g_autoptr(GsAppPermissions) new_permissions = NULL;
+ const GPtrArray *new_paths;
+
+ 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);
+
+ gs_app_permissions_set_flags (additional_permissions,
+ gs_app_permissions_get_flags (new_permissions) &
+ ~gs_app_permissions_get_flags (old_permissions));
+
+ new_paths = gs_app_permissions_get_filesystem_read (new_permissions);
+ for (guint i = 0; new_paths && i < new_paths->len; i++) {
+ const gchar *new_path = g_ptr_array_index (new_paths, i);
+ if (!gs_app_permissions_contains_filesystem_read (old_permissions, new_path))
+ gs_app_permissions_add_filesystem_read (additional_permissions, new_path);
+ }
+
+ new_paths = gs_app_permissions_get_filesystem_full (new_permissions);
+ for (guint i = 0; new_paths && i < new_paths->len; i++) {
+ const gchar *new_path = g_ptr_array_index (new_paths, i);
+ if (!gs_app_permissions_contains_filesystem_full (old_permissions, new_path))
+ gs_app_permissions_add_filesystem_full (additional_permissions, new_path);
+ }
+ }
+
+ /* no new permissions set */
+ if (gs_app_permissions_get_flags (additional_permissions) == GS_APP_PERMISSIONS_FLAGS_UNKNOWN)
+ gs_app_permissions_set_flags (additional_permissions, GS_APP_PERMISSIONS_FLAGS_NONE);
+
+ gs_app_permissions_seal (additional_permissions);
+ gs_app_set_update_permissions (app, additional_permissions);
+
+ if (gs_app_permissions_get_flags (additional_permissions) != GS_APP_PERMISSIONS_FLAGS_NONE)
+ 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_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,
+ 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 (!(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 && !(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_rw_lock_writer_lock (&self->silo_lock);
+ if (self->silo != NULL)
+ xb_silo_invalidate (self->silo);
+ g_rw_lock_writer_unlock (&self->silo_lock);
+}
+
+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 (&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 <id>%s</id> 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 <bundle> 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;
+}
+
+#if LIBXMLB_CHECK_VERSION(0,3,0)
+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;
+}
+#endif
+
+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;
+#if LIBXMLB_CHECK_VERSION(0,3,0)
+ g_autoptr(XbBuilderFixup) fixup5 = NULL;
+#endif
+
+ /* 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 <id> 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 <metadata> to <custom> 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);
+
+#if LIBXMLB_CHECK_VERSION(0,3,0)
+ 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);
+#endif
+
+ 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 GInputStream *
+gs_plugin_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_flatpak_load_desktop_fn (GsFlatpak *self,
+ XbBuilder *builder,
+ const gchar *filename,
+ const gchar *icon_prefix,
+ 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 ();
+ g_autoptr(XbBuilderFixup) fixup = NULL;
+
+ /* add support for desktop files */
+ xb_builder_source_add_adapter (source, "application/x-desktop",
+ gs_plugin_appstream_load_desktop_cb, NULL, NULL);
+
+ /* add the flatpak search keyword */
+ fixup = xb_builder_fixup_new ("AddKeywordFlatpak",
+ gs_flatpak_add_flatpak_keyword_cb,
+ self, NULL);
+ xb_builder_fixup_set_max_depth (fixup, 2);
+ xb_builder_source_add_fixup (source, fixup);
+
+ /* set the component metadata */
+ 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);
+
+ /* add source */
+ if (!xb_builder_source_load_file (source, file,
+#if LIBXMLB_CHECK_VERSION(0, 2, 0)
+ XB_BUILDER_SOURCE_FLAG_WATCH_DIRECTORY,
+#else
+ XB_BUILDER_SOURCE_FLAG_WATCH_FILE,
+#endif
+ cancellable,
+ error)) {
+ return FALSE;
+ }
+
+ /* success */
+ xb_builder_import_source (builder, source);
+ return TRUE;
+}
+
+static void
+gs_flatpak_rescan_installed (GsFlatpak *self,
+ XbBuilder *builder,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *fn;
+ g_autoptr(GFile) path = NULL;
+ g_autoptr(GDir) dir = NULL;
+ g_autofree gchar *path_str = NULL;
+ g_autofree gchar *path_exports = NULL;
+ g_autofree gchar *path_apps = NULL;
+
+ /* add all installed desktop files */
+ path = flatpak_installation_get_path (self->installation_noninteractive);
+ path_str = g_file_get_path (path);
+ path_exports = g_build_filename (path_str, "exports", NULL);
+ path_apps = g_build_filename (path_exports, "share", "applications", NULL);
+ dir = g_dir_open (path_apps, 0, NULL);
+ if (dir == NULL)
+ return;
+ while ((fn = g_dir_read_name (dir)) != NULL) {
+ g_autofree gchar *filename = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ /* ignore */
+ if (g_strcmp0 (fn, "mimeinfo.cache") == 0)
+ continue;
+
+ /* parse desktop files */
+ filename = g_build_filename (path_apps, fn, NULL);
+ if (!gs_flatpak_load_desktop_fn (self,
+ builder,
+ filename,
+ path_exports,
+ cancellable,
+ &error_local)) {
+ g_debug ("ignoring %s: %s", filename, error_local->message);
+ continue;
+ }
+ }
+}
+
+static gboolean
+gs_flatpak_rescan_appstream_store (GsFlatpak *self,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *const *locales = g_get_language_names ();
+ g_autofree gchar *blobfn = NULL;
+ g_autoptr(GFile) file = NULL;
+ g_autoptr(GPtrArray) xremotes = NULL;
+ g_autoptr(GRWLockReaderLocker) reader_locker = NULL;
+ g_autoptr(GRWLockWriterLocker) writer_locker = NULL;
+ g_autoptr(XbBuilder) builder = NULL;
+ g_autoptr(GMainContext) old_thread_default = NULL;
+
+ reader_locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+ /* everything is okay */
+ if (self->silo != NULL && xb_silo_is_valid (self->silo))
+ return TRUE;
+ g_clear_pointer (&reader_locker, g_rw_lock_reader_locker_free);
+
+ /* drat! silo needs regenerating */
+ writer_locker = g_rw_lock_writer_locker_new (&self->silo_lock);
+ g_clear_object (&self->silo);
+
+ /* 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);
+ }
+
+ /* add current locales */
+ for (guint i = 0; locales[i] != NULL; i++)
+ xb_builder_add_locale (builder, locales[i]);
+
+ /* 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 FALSE;
+ }
+ 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 FALSE;
+ }
+ }
+ }
+
+ /* add any installed files without AppStream info */
+ gs_flatpak_rescan_installed (self, builder, cancellable, error);
+
+ /* 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 FALSE;
+ 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);
+
+ if (old_thread_default != NULL)
+ g_main_context_push_thread_default (old_thread_default);
+
+ if (self->silo == NULL)
+ return FALSE;
+
+ /* success */
+ return TRUE;
+}
+
+static gboolean
+gs_flatpak_rescan_app_data (GsFlatpak *self,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ 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;
+ }
+
+ if (!gs_flatpak_rescan_appstream_store (self, interactive, cancellable, error)) {
+ gs_flatpak_internal_data_changed (self);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Returns with a read lock held on @self->silo_lock on success.
+ The *locker should be NULL when being called. */
+static gboolean
+ensure_flatpak_silo_with_locker (GsFlatpak *self,
+ GRWLockReaderLocker **locker,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* should not hold the lock when called */
+ g_return_val_if_fail (*locker == NULL, FALSE);
+
+ /* ensure valid */
+ if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
+ return FALSE;
+
+ *locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+
+ while (self->silo == NULL) {
+ g_clear_pointer (locker, g_rw_lock_reader_locker_free);
+
+ if (!gs_flatpak_rescan_appstream_store (self, interactive, cancellable, error)) {
+ gs_flatpak_internal_data_changed (self);
+ return FALSE;
+ }
+
+ /* At this point either rescan_appstream_store() returned an error or it successfully
+ * initialised self->silo. There is the possibility that another thread will invalidate
+ * the silo before we regain the lock. If so, we’ll have to rescan again. */
+ *locker = g_rw_lock_reader_locker_new (&self->silo_lock);
+ }
+
+ 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;
+
+ /* 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 */
+ if (!gs_flatpak_rescan_appstream_store (self, interactive, cancellable, error)) {
+ 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, cancellable);
+
+ 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, 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, 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;
+ GPtrArray *icons;
+
+ 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_get_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);
+}
+
+/* @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 = flatpak_installation_get_remote_by_name (installation,
+ gs_app_get_id (app),
+ 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, 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_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 = flatpak_installation_get_remote_by_name (gs_flatpak_get_installation (self, interactive),
+ gs_app_get_origin (app),
+ 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;
+}
+
+/* the _unlocked() version doesn't call gs_flatpak_rescan_app_data,
+ * in order to avoid taking the writer lock on self->silo_lock */
+static gboolean
+gs_flatpak_refine_app_state_unlocked (GsFlatpak *self,
+ GsApp *app,
+ gboolean interactive,
+ 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 (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 (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 (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN &&
+ gs_app_get_origin (app) != NULL) {
+ g_autoptr(FlatpakRemote) xremote = NULL;
+ xremote = flatpak_installation_get_remote_by_name (installation,
+ gs_app_get_origin (app),
+ 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,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* ensure valid */
+ if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
+ return FALSE;
+
+ return gs_flatpak_refine_app_state_unlocked (self, app, interactive, 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_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);
+ 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_unlocked (self, app, interactive, 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_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);
+
+ /* 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; 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; 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) {
+ gs_app_add_quirk (app_addon, GS_APP_QUIRK_HIDE_EVERYWHERE);
+ g_debug ("hiding %s since it's not related to %s",
+ addon_ref, gs_app_get_unique_id (app));
+ } else {
+ gs_app_remove_quirk (app_addon, GS_APP_QUIRK_HIDE_EVERYWHERE);
+ g_debug ("unhiding %s since it's related to %s",
+ addon_ref, gs_app_get_unique_id (app));
+ }
+ }
+ 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_unlocked (self,
+ app_runtime,
+ interactive,
+ 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,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *const *locales = g_get_language_names ();
+ 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);
+
+ /* add current locales */
+ for (guint i = 0; locales[i] != NULL; i++)
+ xb_builder_add_locale (builder, locales[i]);
+
+ /* 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
+ * <bundle> 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, 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;
+#if LIBXMLB_CHECK_VERSION(0, 3, 0)
+ g_autoptr(XbQuery) query = NULL;
+ g_auto(XbQueryContext) context = XB_QUERY_CONTEXT_INIT ();
+#else
+ g_autofree gchar *xpath = NULL;
+ g_autofree gchar *source_safe = NULL;
+#endif
+ 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;
+
+#if LIBXMLB_CHECK_VERSION(0, 3, 0)
+ 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);
+#else
+ source_safe = xb_string_escape (renamed_to);
+ xpath = g_strdup_printf ("components[@origin='%s']/component/bundle[@type='flatpak'][text()='%s']/..",
+ origin, source_safe);
+ component = xb_silo_query_first (silo, xpath, NULL);
+#endif
+
+ /* 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,
+ GsPluginRefineFlags flags,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *origin = gs_app_get_origin (app);
+ const gchar *source = gs_app_get_source_default (app);
+ g_autofree gchar *source_safe = NULL;
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(XbNode) component = NULL;
+
+ if (origin == NULL || source == NULL)
+ return TRUE;
+
+ /* find using source and origin */
+ 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;
+
+ /* 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;
+ }
+
+ if (component == NULL) {
+ g_autoptr(FlatpakInstalledRef) installed_ref = NULL;
+ g_autoptr(GBytes) appstream_gz = NULL;
+
+ g_debug ("no match for %s: %s", xpath, error_local->message);
+
+ g_clear_error (&error_local);
+
+ /* 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,
+ cancellable, error);
+ }
+
+ if (!gs_appstream_refine_app (self->plugin, app, silo, component, flags, 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_unlocked (GsFlatpak *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ gboolean interactive,
+ GRWLockReaderLocker **locker,
+ 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;
+
+ g_clear_pointer (locker, g_rw_lock_reader_locker_free);
+
+ if (!ensure_flatpak_silo_with_locker (self, locker, interactive, cancellable, error))
+ return FALSE;
+
+ /* always do AppStream properties */
+ if (!gs_flatpak_refine_appstream (self, app, self->silo, flags, 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_unlocked (self, app, interactive, 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, self->silo, flags, 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(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GsAppList) addons = NULL;
+ g_autoptr(GString) errors = NULL;
+ guint ii, sz;
+
+ 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;
+
+ /* To have refined also the state */
+ gs_app_set_state (addon, GS_APP_STATE_UNKNOWN);
+
+ if (!gs_flatpak_refine_app_unlocked (self, addon, flags, interactive, &locker, 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,
+ 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,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+
+ /* ensure valid */
+ if (!gs_flatpak_rescan_app_data (self, interactive, cancellable, error))
+ return FALSE;
+
+ return gs_flatpak_refine_app_unlocked (self, app, flags, interactive, &locker, cancellable, error);
+}
+
+gboolean
+gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
+ GsAppList *list, GsPluginRefineFlags refine_flags,
+ gboolean interactive,
+ GCancellable *cancellable, GError **error)
+{
+ const gchar *id;
+ g_autofree gchar *xpath = NULL;
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) components = NULL;
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+
+ /* not enough info to find */
+ id = gs_app_get_id (app);
+ if (id == NULL)
+ return TRUE;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ /* find all apps when matching any prefixes */
+ xpath = g_strdup_printf ("components/component/id[text()='%s']/..", id);
+ components = xb_silo_query (self->silo, xpath, 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;
+ }
+
+ gs_flatpak_ensure_remote_title (self, interactive, cancellable);
+
+ for (guint i = 0; i < components->len; i++) {
+ XbNode *component = g_ptr_array_index (components, i);
+ g_autoptr(GsApp) new = NULL;
+ new = gs_appstream_create_app (self->plugin, self->silo, component, error);
+ if (new == NULL)
+ return FALSE;
+ gs_flatpak_claim_app (self, new);
+ if (!gs_flatpak_refine_app_unlocked (self, new, refine_flags, interactive, &locker, cancellable, error))
+ return FALSE;
+ gs_app_subsume_metadata (new, app);
+ gs_app_list_add (list, new);
+ }
+
+ /* 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 = flatpak_installation_get_remote_by_name (installation,
+ gs_app_get_id (app),
+ 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, 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) {
+ if (!gs_flatpak_refine_appstream_from_bytes (self, app, NULL, NULL,
+ appstream_gz,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID,
+ interactive,
+ 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 *const *locales = g_get_language_names ();
+ const gchar *remote_name;
+ 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_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);
+
+ /* add current locales */
+ for (guint i = 0; locales[i] != NULL; i++)
+ xb_builder_add_locale (builder, locales[i]);
+
+ /* 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, 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_list_free_full (g_steal_pointer (&txn_ops), g_object_unref);
+
+#if FLATPAK_CHECK_VERSION(1,13,1)
+ /* fetch remote ref */
+ 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, cancellable);
+#else
+ app = gs_flatpak_create_app (self, remote_name, parsed_ref, NULL, interactive, 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:"))) {
+ g_autoptr(GIcon) icon = gs_remote_icon_new (ref_icon);
+ gs_app_add_icon (app, icon);
+ }
+
+ /* set the origin data */
+ xremote = flatpak_installation_get_remote_by_name (installation,
+ remote_name,
+ 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);
+ }
+
+ /* get extra AppStream data if available */
+ if (!gs_flatpak_refine_appstream (self, app, silo,
+ GS_PLUGIN_REFINE_FLAGS_MASK,
+ 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(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GMutexLocker) app_silo_locker = NULL;
+ g_autoptr(GPtrArray) silos_to_remove = g_ptr_array_new ();
+ GHashTableIter iter;
+ gpointer key, value;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_search (self->plugin, self->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 *silo = g_ptr_array_index (silos_to_remove, i);
+ g_hash_table_remove (self->app_silos, silo);
+ }
+
+ 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(GRWLockReaderLocker) locker = NULL;
+ g_autoptr(GMutexLocker) app_silo_locker = NULL;
+ g_autoptr(GPtrArray) silos_to_remove = g_ptr_array_new ();
+ GHashTableIter iter;
+ gpointer key, value;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_search_developer_apps (self->plugin, self->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 *silo = g_ptr_array_index (silos_to_remove, i);
+ g_hash_table_remove (self->app_silos, silo);
+ }
+
+ return TRUE;
+}
+
+gboolean
+gs_flatpak_add_category_apps (GsFlatpak *self,
+ GsCategory *category,
+ GsAppList *list,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ return gs_appstream_add_category_apps (self->plugin, self->silo,
+ category, list,
+ cancellable, error);
+}
+
+gboolean
+gs_flatpak_refine_category_sizes (GsFlatpak *self,
+ GPtrArray *list,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ return gs_appstream_refine_category_sizes (self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_add_popular (self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_add_featured (self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ return gs_appstream_add_deployment_featured (self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_add_alternates (self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_add_recent (self->plugin, self->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(GRWLockReaderLocker) locker = NULL;
+
+ if (!ensure_flatpak_silo_with_locker (self, &locker, interactive, cancellable, error))
+ return FALSE;
+
+ if (!gs_appstream_url_to_app (self->plugin, self->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;
+ }
+ if (self->silo != NULL)
+ g_object_unref (self->silo);
+ if (self->monitor != NULL)
+ g_object_unref (self->monitor);
+
+ 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_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_rw_lock_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_rw_lock_init (&self->silo_lock);
+
+ g_mutex_init (&self->installed_refs_mutex);
+ self->installed_refs = 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;
+}
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
new file mode 100644
index 0000000..b3f8a13
--- /dev/null
+++ b/plugins/flatpak/gs-flatpak.h
@@ -0,0 +1,184 @@
+/* -*- 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 <jrocha@endlessm.com>
+ * Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gnome-software.h>
+#include <flatpak.h>
+
+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,
+ 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,
+ GCancellable *cancellable,
+ GError **error);
+gboolean gs_flatpak_refine_wildcard (GsFlatpak *self,
+ GsApp *app,
+ GsAppList *list,
+ GsPluginRefineFlags flags,
+ gboolean interactive,
+ 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);
+
+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..7c893ef
--- /dev/null
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -0,0 +1,2326 @@
+/* -*- 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 <jrocha@endlessm.com>
+ * Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2017-2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * 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 <config.h>
+
+#include <flatpak.h>
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+
+#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-worker-thread.h"
+
+#include "gs-plugin-flatpak.h"
+
+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;
+};
+
+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_clear_pointer (&self->installations, g_ptr_array_unref);
+ 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");
+}
+
+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));
+}
+
+/* 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;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, gs_plugin_flatpak_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);
+ 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);
+}
+
+gboolean
+gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ for (guint i = 0; i < self->installations->len; i++) {
+ GsFlatpak *flatpak = g_ptr_array_index (self->installations, i);
+ if (!gs_flatpak_add_sources (flatpak, list, interactive, cancellable, error))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ for (guint i = 0; i < self->installations->len; i++) {
+ GsFlatpak *flatpak = g_ptr_array_index (self->installations, i);
+ g_autoptr(GError) local_error = NULL;
+ if (!gs_flatpak_add_updates (flatpak, list, interactive, cancellable, &local_error))
+ g_debug ("Failed to get updates for '%s': %s", gs_flatpak_get_id (flatpak), local_error->message);
+ }
+ gs_plugin_cache_lookup_by_state (plugin, list, GS_APP_STATE_INSTALLING);
+ return TRUE;
+}
+
+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,
+ 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, cancellable, error);
+}
+
+
+static gboolean
+refine_app (GsPluginFlatpak *self,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* 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;
+
+ /* 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) {
+ if (!gs_plugin_flatpak_refine_app (self, runtime,
+ flags,
+ interactive,
+ cancellable,
+ error)) {
+ return FALSE;
+ }
+ }
+ }
+ 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(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);
+
+ 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);
+
+ if (!gs_flatpak_refine_wildcard (flatpak, app, list, 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_flatpak_refine_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (result), error);
+}
+
+gboolean
+gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsFlatpak *flatpak = gs_plugin_flatpak_get_handler (GS_PLUGIN_FLATPAK (plugin), app);
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ if (flatpak == NULL)
+ return TRUE;
+
+ return gs_flatpak_launch (flatpak, app, interactive, cancellable, error);
+}
+
+/* ref full */
+static GsApp *
+gs_plugin_flatpak_find_app_by_ref (GsPluginFlatpak *self,
+ const gchar *ref,
+ gboolean interactive,
+ 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;
+ }
+ 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);
+}
+
+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");
+}
+
+static FlatpakTransaction *
+_build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
+ 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, 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);
+}
+
+gboolean
+gs_plugin_download (GsPlugin *plugin, GsAppList *list,
+ GCancellable *cancellable, GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ g_autoptr(GHashTable) applist_by_flatpaks = NULL;
+ GHashTableIter iter;
+ gpointer key, value;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* build and run transaction for each flatpak installation */
+ applist_by_flatpaks = _group_apps_by_installation (self, list);
+ 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) {
+ g_autoptr(GError) error_local = NULL;
+
+ if (!gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle, cancellable, &error_local)) {
+ g_warning ("Failed to block on download scheduler: %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ }
+ }
+
+ /* build and run non-deployed transaction */
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
+ if (transaction == NULL) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ 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);
+ g_autofree gchar *ref = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ ref = gs_flatpak_app_get_ref_display (app);
+ if (flatpak_transaction_add_update (transaction, ref, NULL, NULL, &error_local))
+ continue;
+
+ /* Errors about missing remotes are not fatal, as that’s
+ * a not-uncommon situation. */
+ if (g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_REMOTE_NOT_FOUND)) {
+ g_autoptr(GsPluginEvent) event = NULL;
+
+ g_warning ("Skipping update for ‘%s’: %s", ref, 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);
+ } else {
+ gs_flatpak_error_convert (&error_local);
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ return FALSE;
+ }
+ }
+
+ if (!gs_flatpak_transaction_run (transaction, cancellable, error)) {
+ gs_flatpak_error_convert (error);
+ remove_schedule_entry (schedule_entry_handle);
+ return FALSE;
+ }
+
+ remove_schedule_entry (schedule_entry_handle);
+
+ /* Traverse over the GsAppList again and set that the update has been already downloaded
+ * for the apps. */
+ for (guint i = 0; i < gs_app_list_length (list_tmp); i++) {
+ GsApp *app = gs_app_list_index (list_tmp, i);
+ gs_app_set_is_update_downloaded (app, TRUE);
+ }
+ }
+
+ return TRUE;
+}
+
+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);
+ }
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ GsFlatpak *flatpak;
+ g_autoptr(FlatpakTransaction) transaction = NULL;
+ g_autofree gchar *ref = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* not supported */
+ flatpak = gs_plugin_flatpak_get_handler (self, app);
+ if (flatpak == NULL)
+ return TRUE;
+
+ /* is a source, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ /* build and run transaction */
+ transaction = _build_transaction (plugin, flatpak, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE), cancellable, error);
+ if (transaction == NULL) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ /* 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);
+
+ ref = gs_flatpak_app_get_ref_display (app);
+ if (!flatpak_transaction_add_uninstall (transaction, ref, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_REMOVING);
+
+ /* run transaction */
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ if (!gs_flatpak_transaction_run (transaction, cancellable, error)) {
+ gs_flatpak_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* get any new state */
+ gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWN, 0);
+ gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWN, 0);
+
+ if (!gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ if (!gs_flatpak_refine_app (flatpak, app,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID,
+ interactive,
+ cancellable, error)) {
+ g_prefix_error (error, "failed to run refine for %s: ", ref);
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ gs_flatpak_refine_addons (flatpak,
+ app,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID,
+ GS_APP_STATE_REMOVING,
+ interactive,
+ cancellable);
+
+ return TRUE;
+}
+
+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);
+ }
+ }
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ GsFlatpak *flatpak;
+ g_autoptr(FlatpakTransaction) transaction = NULL;
+ g_autoptr(GError) error_local = NULL;
+ gpointer schedule_entry_handle = NULL;
+ gboolean already_installed = FALSE;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* 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);
+ return TRUE;
+ }
+
+ /* set the app scope */
+ gs_plugin_flatpak_ensure_scope (plugin, app);
+
+ /* not supported */
+ flatpak = gs_plugin_flatpak_get_handler (self, app);
+ if (flatpak == NULL)
+ return TRUE;
+
+ /* is a source, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ /* build */
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
+ if (transaction == NULL) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ /* 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);
+ g_autoptr(GBytes) blob = NULL;
+ if (file == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no local file set for bundle %s",
+ gs_app_get_unique_id (app));
+ return FALSE;
+ }
+ blob = g_file_load_bytes (file, cancellable, NULL, error);
+ if (blob == NULL) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ if (!flatpak_transaction_add_install_flatpakref (transaction, blob, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ /* 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 (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no local file set for bundle %s",
+ gs_app_get_unique_id (app));
+ return FALSE;
+ }
+ if (!flatpak_transaction_add_install_bundle (transaction, file,
+ NULL, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ /* 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, &error_local)) {
+ /* Somehow, the app might already be installed. */
+ if (g_error_matches (error_local, FLATPAK_ERROR,
+ FLATPAK_ERROR_ALREADY_INSTALLED)) {
+ already_installed = TRUE;
+ g_clear_error (&error_local);
+ } else {
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ }
+ }
+
+ gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_INSTALLING);
+
+ if (!interactive) {
+ /* FIXME: Add additional details here, especially the download
+ * size bounds (using `size-minimum` and `size-maximum`, both
+ * type `t`). */
+ if (!gs_metered_block_app_on_download_scheduler (app, &schedule_entry_handle, cancellable, &error_local)) {
+ g_warning ("Failed to block on download scheduler: %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ }
+ }
+
+ /* run transaction */
+ if (!already_installed) {
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ if (!gs_flatpak_transaction_run (transaction, cancellable, &error_local)) {
+ /* Somehow, the app might already be installed. */
+ if (g_error_matches (error_local, FLATPAK_ERROR,
+ FLATPAK_ERROR_ALREADY_INSTALLED)) {
+ already_installed = TRUE;
+ g_clear_error (&error_local);
+ } else {
+ if (g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_REF_NOT_FOUND)) {
+ const gchar *origin = gs_app_get_origin (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 (app),
+ error_local->message);
+ g_clear_error (&error_local);
+ error_local = g_steal_pointer (&error_tmp);
+ }
+ }
+ }
+ }
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ gs_flatpak_error_convert (error);
+ gs_app_set_state_recover (app);
+ remove_schedule_entry (schedule_entry_handle);
+ return FALSE;
+ }
+ }
+ }
+
+ if (already_installed) {
+ /* Set the app back to UNKNOWN so that refining it gets all the right details. */
+ g_debug ("App %s is already installed", gs_app_get_unique_id (app));
+ gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
+ }
+
+ remove_schedule_entry (schedule_entry_handle);
+
+ /* get any new state */
+ if (!gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ if (!gs_flatpak_refine_app (flatpak, app,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID,
+ interactive,
+ cancellable, error)) {
+ g_prefix_error (error, "failed to run refine for %s: ",
+ gs_app_get_unique_id (app));
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ gs_flatpak_refine_addons (flatpak,
+ app,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ID,
+ GS_APP_STATE_INSTALLING,
+ interactive,
+ cancellable);
+
+ return TRUE;
+}
+
+static gboolean
+gs_plugin_flatpak_update (GsPlugin *plugin,
+ GsFlatpak *flatpak,
+ GsAppList *list_tmp,
+ gboolean interactive,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(FlatpakTransaction) transaction = NULL;
+ gboolean is_update_downloaded = TRUE;
+ gpointer schedule_entry_handle = NULL;
+
+ if (!interactive) {
+ g_autoptr(GError) error_local = NULL;
+
+ if (!gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle, cancellable, &error_local)) {
+ g_warning ("Failed to block on download scheduler: %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ }
+ }
+
+ /* build and run transaction */
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
+ if (transaction == NULL) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+
+ 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;
+ g_autoptr(GError) error_local = NULL;
+
+ ref = gs_flatpak_app_get_ref_display (app);
+ if (flatpak_transaction_add_update (transaction, ref, NULL, NULL, 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 about missing remotes are not fatal, as that’s
+ * a not-uncommon situation. */
+ if (g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_REMOTE_NOT_FOUND)) {
+ g_autoptr(GsPluginEvent) event = NULL;
+
+ g_warning ("Skipping update for ‘%s’: %s", ref, 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);
+ } else {
+ gs_flatpak_error_convert (&error_local);
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ return FALSE;
+ }
+ }
+
+ /* run 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 (app, GS_APP_STATE_INSTALLING);
+
+ /* If all apps' update are previously downloaded and available locally,
+ * FlatpakTransaction should run with no-pull flag. This is the case
+ * for apps' autoupdates. */
+ is_update_downloaded &= gs_app_get_is_update_downloaded (app);
+ }
+
+ if (is_update_downloaded) {
+ flatpak_transaction_set_no_pull (transaction, TRUE);
+ }
+
+ /* automatically clean up unused EOL runtimes when updating */
+ flatpak_transaction_set_include_unused_uninstall_ops (transaction, TRUE);
+
+ if (!gs_flatpak_transaction_run (transaction, cancellable, error)) {
+ 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);
+ }
+ gs_flatpak_error_convert (error);
+ remove_schedule_entry (schedule_entry_handle);
+ return FALSE;
+ } else {
+ /* Reset the state to have it updated */
+ 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 (app, GS_APP_STATE_UNKNOWN);
+ }
+ }
+
+ remove_schedule_entry (schedule_entry_handle);
+ gs_plugin_updates_changed (plugin);
+
+ /* get any new state */
+ if (!gs_flatpak_refresh (flatpak, G_MAXUINT, interactive, cancellable, error)) {
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ 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,
+ cancellable, error)) {
+ g_prefix_error (error, "failed to run refine for %s: ", ref);
+ gs_flatpak_error_convert (error);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ g_autoptr(GHashTable) applist_by_flatpaks = NULL;
+ GHashTableIter iter;
+ gpointer key, value;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* build and run transaction for each flatpak installation */
+ applist_by_flatpaks = _group_apps_by_installation (self, list);
+ 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);
+ gboolean success;
+
+ 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);
+ success = gs_plugin_flatpak_update (plugin, flatpak, list_tmp, interactive, cancellable, error);
+ gs_flatpak_set_busy (flatpak, FALSE);
+ if (!success)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+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,
+ 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;
+
+ /* 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, 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);
+
+ /* this is new */
+ return g_steal_pointer (&app);
+}
+
+static GsApp *
+gs_plugin_flatpak_file_to_app_ref (GsPluginFlatpak *self,
+ GFile *file,
+ gboolean interactive,
+ 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, 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,
+ 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);
+}
+
+gboolean
+gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ g_autofree gchar *content_type = NULL;
+ g_autoptr(GsApp) app = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+ 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 FALSE;
+ if (g_strv_contains (mimetypes_bundle, content_type)) {
+ app = gs_plugin_flatpak_file_to_app_bundle (self, file, interactive,
+ cancellable, error);
+ if (app == NULL)
+ return FALSE;
+ } else if (g_strv_contains (mimetypes_repo, content_type)) {
+ app = gs_plugin_flatpak_file_to_app_repo (self, file, interactive,
+ cancellable, error);
+ if (app == NULL)
+ return FALSE;
+ } else if (g_strv_contains (mimetypes_ref, content_type)) {
+ app = gs_plugin_flatpak_file_to_app_ref (self, file, interactive,
+ cancellable, error);
+ if (app == NULL)
+ return FALSE;
+ }
+ 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_app_list_add (list, app);
+ }
+ return TRUE;
+}
+
+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);
+ g_autoptr(GRWLockReaderLocker) locker = NULL;
+ 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;
+ 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);
+ }
+
+ 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_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;
+ }
+
+ 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;
+ }
+ }
+
+ 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);
+}
+
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFlatpak *self = GS_PLUGIN_FLATPAK (plugin);
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ 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, url, interactive, cancellable, error))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+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;
+}
+
+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..8426156
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..6f4bd7f
--- /dev/null
+++ b/plugins/flatpak/gs-self-test.c
@@ -0,0 +1,2003 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+
+#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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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), ==, "*/*/*/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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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);
+ icon = gs_app_get_icon_for_size (app, 64, 1, NULL);
+ g_assert_nonnull (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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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(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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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, };
+
+ /* 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 */
+ g_object_unref (plugin_job);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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), ==, 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) sources2 = NULL;
+ g_autoptr(GsAppList) sources = 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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) sources2 = NULL;
+ g_autoptr(GsAppList) sources = 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file_repo,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME,
+ NULL);
+ 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), ==, "*/*/*/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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION,
+ NULL);
+ 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(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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", runtime,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", refine_flags,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app2,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES, NULL);
+ 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(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, };
+
+ /* 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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", old_runtime,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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);
+}
+
+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, };
+
+ /* 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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
+ "app", app,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", runtime,
+ NULL);
+ 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 ("<?xml version=\"1.0\"?>\n"
+ "<components version=\"0.9\">\n"
+ " <component type=\"desktop\">\n"
+ " <id>zeus.desktop</id>\n"
+ " <name>Zeus</name>\n"
+ " <summary>A teaching application</summary>\n"
+ " </component>\n"
+ "</components>\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..6a0baed
--- /dev/null
+++ b/plugins/flatpak/meson.build
@@ -0,0 +1,63 @@
+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'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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')
+
+ 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'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..44d6d03
--- /dev/null
+++ b/plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="addon">
+ <id>org.gnome.Software.Plugin.Flatpak</id>
+ <extends>org.gnome.Software.desktop</extends>
+ <name>Flatpak Support</name>
+ <summary>Flatpak is a framework for desktop applications on Linux</summary>
+ <url type="homepage">http://flatpak.org/</url>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <update_contact>richard_at_hughsie.com</update_contact>
+</component>
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
--- /dev/null
+++ b/plugins/flatpak/tests/app-extension-update/org.test.Chiron.Extension/files/.empty
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..d884539
--- /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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2017 Endless Mobile, Inc.
+ Author: Joaquim Rocha <jrocha@endlessm.com>
+-->
+<component type="runtime">
+ <id>org.test.Chiron.Extension</id>
+ <metadata_license>CC0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Chiron App Extension</name>
+ <summary>Test extension for flatpak self tests</summary>
+</component>
+
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
--- /dev/null
+++ b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/.empty
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
--- /dev/null
+++ b/plugins/flatpak/tests/app-extension/org.test.Chiron.Extension/files/share/libtest/README
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..d884539
--- /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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2017 Endless Mobile, Inc.
+ Author: Joaquim Rocha <jrocha@endlessm.com>
+-->
+<component type="runtime">
+ <id>org.test.Chiron.Extension</id>
+ <metadata_license>CC0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Chiron App Extension</name>
+ <summary>Test extension for flatpak self tests</summary>
+</component>
+
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..0d912a8
--- /dev/null
+++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop">
+ <id>org.test.Chiron.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Chiron</name>
+ <summary>Single line synopsis</summary>
+ <description><p>Long description.</p></description>
+ <url type="homepage">http://127.0.0.1/</url>
+ <releases>
+ <release date="2014-12-15" version="1.2.3">
+ <description><p>This is better.</p></description>
+ </release>
+ </releases>
+</component>
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 0000000..0c38f2f
--- /dev/null
+++ b/plugins/flatpak/tests/app-extension/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png
Binary files differ
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..74eb9db
--- /dev/null
+++ b/plugins/flatpak/tests/app-update/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop">
+ <id>org.test.Chiron</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Chiron</name>
+ <summary>Single line synopsis</summary>
+ <description><p>Long description.</p></description>
+ <url type="homepage">http://127.0.0.1/</url>
+ <releases>
+ <release date="2015-02-13" version="1.2.4">
+ <description><p>This is best.</p></description>
+ </release>
+ <release date="2014-12-15" version="1.2.3">
+ <description><p>This is better.</p></description>
+ </release>
+ </releases>
+</component>
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..58af082
--- /dev/null
+++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/appdata/org.test.Chiron.appdata.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
+<component type="desktop">
+ <id>org.test.Chiron</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Chiron</name>
+ <summary>Single line synopsis</summary>
+ <description><p>Long description.</p></description>
+ <url type="homepage">http://127.0.0.1/</url>
+ <releases>
+ <release date="2014-12-15" version="1.2.3">
+ <description><p>This is better.</p></description>
+ </release>
+ </releases>
+</component>
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 0000000..0c38f2f
--- /dev/null
+++ b/plugins/flatpak/tests/app-with-runtime/org.test.Chiron/files/share/icons/hicolor/128x128/apps/org.test.Chiron.png
Binary files differ
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
--- /dev/null
+++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/files/.empty
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
--- /dev/null
+++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/libtest/README
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..5d68c60
--- /dev/null
+++ b/plugins/flatpak/tests/app-with-runtime/org.test.Runtime/usr/share/metainfo/org.test.Runtime.metainfo.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2017 Richard Hughes <richard@hughsie.com> -->
+<component type="runtime">
+ <id>org.test.Runtime</id>
+ <metadata_license>CC0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <name>Test runtime</name>
+ <summary>Test runtime for flatpak self tests</summary>
+</component>
+
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 0000000..ce038e9
--- /dev/null
+++ b/plugins/flatpak/tests/chiron.flatpak
Binary files differ
diff --git a/plugins/flatpak/tests/flatpakrepos.tar.gz b/plugins/flatpak/tests/flatpakrepos.tar.gz
new file mode 100644
index 0000000..f8bcfde
--- /dev/null
+++ b/plugins/flatpak/tests/flatpakrepos.tar.gz
Binary files differ
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..c27f5a5
--- /dev/null
+++ b/plugins/fwupd/gs-fwupd-app.c
@@ -0,0 +1,309 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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)
+{
+ 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);
+}
+
+void
+gs_fwupd_app_set_from_device (GsApp *app, FwupdDevice *dev)
+{
+ GPtrArray *guids;
+
+ /* something can be done */
+ if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_UPDATABLE))
+ gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE);
+
+ /* only can be applied in systemd-offline */
+ if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_ONLY_OFFLINE))
+ gs_app_set_metadata (app, "fwupd::OnlyOffline", "");
+
+
+ /* 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 */
+ if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_INTERNAL))
+ gs_app_add_quirk (app, GS_APP_QUIRK_REMOVABLE_HARDWARE);
+
+ 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_device_get_description (dev) != NULL) {
+ g_autofree gchar *tmp = NULL;
+ tmp = as_markup_convert_simple (fwupd_device_get_description (dev), NULL);
+ if (tmp != NULL)
+ gs_app_set_description (app, GS_APP_QUALITY_NORMAL, tmp);
+ }
+
+ /* needs action */
+ if (fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_NEEDS_BOOTLOADER))
+ 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);
+ }
+ }
+
+ /* 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;
+ tmp = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
+ 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..5a3e9f2
--- /dev/null
+++ b/plugins/fwupd/gs-fwupd-app.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) 2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gnome-software.h>
+#include <fwupd.h>
+
+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,
+ 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..b5d99b7
--- /dev/null
+++ b/plugins/fwupd/gs-plugin-fwupd.c
@@ -0,0 +1,1414 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <fwupd.h>
+#include <fcntl.h>
+#include <gio/gio.h>
+#include <gio/gunixfdlist.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
+#include <gnome-software.h>
+
+#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;
+};
+
+G_DEFINE_TYPE (GsPluginFwupd, gs_plugin_fwupd, GS_TYPE_PLUGIN)
+
+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 ();
+
+ /* 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);
+
+ G_OBJECT_CLASS (gs_plugin_fwupd_parent_class)->dispose (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,
+ 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)
+{
+ FwupdRelease *rel = fwupd_device_get_release_default (dev);
+ 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);
+ app = gs_plugin_cache_lookup (plugin, id);
+ if (app == NULL) {
+ app = gs_app_new (id);
+ gs_plugin_cache_add (plugin, id, app);
+ }
+
+ /* 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, 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_description (app, GS_APP_QUALITY_LOWEST, fwupd_device_get_description (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);
+ 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);
+}
+
+gboolean
+gs_plugin_add_updates_historical (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GsApp) app = NULL;
+ g_autoptr(FwupdDevice) dev = NULL;
+
+ /* get historical updates */
+ dev = fwupd_client_get_results (self->client,
+ FWUPD_DEVICE_ID_ANY,
+ cancellable,
+ &error_local);
+ if (dev == NULL) {
+ if (g_error_matches (error_local,
+ FWUPD_ERROR,
+ FWUPD_ERROR_NOTHING_TO_DO))
+ return TRUE;
+ if (g_error_matches (error_local,
+ FWUPD_ERROR,
+ FWUPD_ERROR_NOT_FOUND))
+ return TRUE;
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+
+ /* parse */
+ app = gs_plugin_fwupd_new_app_from_device (plugin, dev);
+ if (app == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "failed to build result for %s",
+ fwupd_device_get_id (dev));
+ return FALSE;
+ }
+ gs_app_list_add (list, app);
+ return TRUE;
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ g_autoptr(GError) error_local = NULL;
+ g_autoptr(GPtrArray) devices = NULL;
+
+ /* get current list of updates */
+ devices = fwupd_client_get_devices (self->client, cancellable, &error_local);
+ if (devices == NULL) {
+ 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_debug ("no devices (%s)", error_local->message);
+ return TRUE;
+ }
+ g_debug ("Failed to get devices: %s", error_local->message);
+ return TRUE;
+ }
+ for (guint i = 0; i < devices->len; i++) {
+ FwupdDevice *dev = g_ptr_array_index (devices, i);
+ FwupdRelease *rel_newest;
+ g_autoptr(GError) error_local2 = NULL;
+ g_autoptr(GPtrArray) rels = NULL;
+ g_autoptr(GsApp) app = NULL;
+
+ /* 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, app);
+ continue;
+ }
+
+ /* not going to have results, so save a D-Bus round-trip */
+ if (!fwupd_device_has_flag (dev, FWUPD_DEVICE_FLAG_SUPPORTED))
+ continue;
+
+ /* get the releases for this device and filter for validity */
+ rels = fwupd_client_get_upgrades (self->client,
+ fwupd_device_get_id (dev),
+ cancellable, &error_local2);
+ if (rels == NULL) {
+ if (g_error_matches (error_local2,
+ FWUPD_ERROR,
+ FWUPD_ERROR_NOTHING_TO_DO)) {
+ g_debug ("no updates for %s", fwupd_device_get_id (dev));
+ continue;
+ }
+ if (g_error_matches (error_local2,
+ FWUPD_ERROR,
+ FWUPD_ERROR_NOT_SUPPORTED)) {
+ g_debug ("not supported for %s", fwupd_device_get_id (dev));
+ continue;
+ }
+ g_warning ("failed to get upgrades for %s: %s]",
+ fwupd_device_get_id (dev),
+ error_local2->message);
+ continue;
+ }
+
+ /* normal device update */
+ rel_newest = g_ptr_array_index (rels, 0);
+ fwupd_device_add_release (dev, rel_newest);
+ app = gs_plugin_fwupd_new_app (plugin, dev, &error_local2);
+ if (app == NULL) {
+ g_debug ("%s", error_local2->message);
+ continue;
+ }
+
+ /* add update descriptions for all releases inbetween */
+ if (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;
+ desc = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
+ 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_app_list_add (list, app);
+ }
+ return TRUE;
+}
+
+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);
+
+ if (!fwupd_remote_get_enabled (remote))
+ 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++;
+ fwupd_client_refresh_remote_async (client, remote, cancellable,
+ refresh_remote_cb, g_object_ref (task));
+ }
+
+ 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);
+}
+
+static gboolean
+gs_plugin_fwupd_install (GsPluginFwupd *self,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *device_id;
+ FwupdInstallFlags install_flags = 0;
+ GFile *local_file;
+ g_autofree gchar *filename = NULL;
+ gboolean downloaded_to_cache = FALSE;
+ g_autoptr(FwupdDevice) dev = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ /* not set */
+ local_file = gs_app_get_local_file (app);
+ if (local_file == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "not enough data for fwupd %s",
+ filename);
+ return FALSE;
+ }
+
+ /* file does not yet exist */
+ filename = g_file_get_path (local_file);
+ if (!g_file_query_exists (local_file, cancellable)) {
+ const gchar *uri = gs_fwupd_app_get_update_uri (app);
+ g_autoptr(GFile) file = g_file_new_for_path (filename);
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ if (!fwupd_client_download_file (self->client,
+ uri, file,
+ FWUPD_CLIENT_DOWNLOAD_FLAG_NONE,
+ cancellable,
+ error)) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+
+ downloaded_to_cache = TRUE;
+ }
+
+ /* limit to single device? */
+ device_id = gs_fwupd_app_get_device_id (app);
+ if (device_id == NULL)
+ device_id = FWUPD_DEVICE_ID_ANY;
+
+ /* set the last object */
+ g_set_object (&self->app_current, app);
+
+ /* only offline supported */
+ if (gs_app_get_metadata_item (app, "fwupd::OnlyOffline") != NULL)
+ install_flags |= FWUPD_INSTALL_FLAG_OFFLINE;
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ if (!fwupd_client_install (self->client, device_id,
+ filename, install_flags,
+ cancellable, error)) {
+ gs_plugin_fwupd_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* delete the file from the cache */
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ if (downloaded_to_cache) {
+ if (!g_file_delete (local_file, cancellable, error))
+ return FALSE;
+ }
+
+ /* does the device have an update message */
+ dev = fwupd_client_get_device_by_id (self->client, device_id,
+ cancellable, &error_local);
+ 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", error_local->message);
+ } else {
+ if (fwupd_device_get_update_message (dev) != NULL) {
+ g_autoptr(AsScreenshot) ss = as_screenshot_new ();
+
+ /* image is optional */
+ if (fwupd_device_get_update_image (dev) != NULL) {
+ g_autoptr(AsImage) im = as_image_new ();
+ as_image_set_kind (im, AS_IMAGE_KIND_SOURCE);
+ as_image_set_url (im, fwupd_device_get_update_image (dev));
+ as_screenshot_add_image (ss, im);
+ }
+
+ /* caption is required */
+ as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT);
+ as_screenshot_set_caption (ss, fwupd_device_get_update_message (dev), NULL);
+ gs_app_set_action_screenshot (app, ss);
+
+ /* require the dialog */
+ gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION);
+ }
+ }
+
+ /* success */
+ return TRUE;
+}
+
+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);
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* source -> remote, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ /* firmware */
+ return gs_plugin_fwupd_install (self, app, cancellable, error);
+}
+
+gboolean
+gs_plugin_download_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ GFile *local_file;
+ g_autofree gchar *filename = NULL;
+ gpointer schedule_entry_handle = NULL;
+ g_autoptr(GError) error_local = NULL;
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* not set */
+ local_file = gs_app_get_local_file (app);
+ if (local_file == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "not enough data for fwupd %s",
+ filename);
+ return FALSE;
+ }
+
+ /* file does not yet exist */
+ filename = g_file_get_path (local_file);
+ if (!g_file_query_exists (local_file, cancellable)) {
+ const gchar *uri = gs_fwupd_app_get_update_uri (app);
+ g_autoptr(GFile) file = g_file_new_for_path (filename);
+ gboolean download_success;
+
+ if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) {
+ if (!gs_metered_block_app_on_download_scheduler (app, &schedule_entry_handle, cancellable, &error_local)) {
+ g_warning ("Failed to block on download scheduler: %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ }
+ }
+
+ download_success = fwupd_client_download_file (self->client,
+ uri, file,
+ FWUPD_CLIENT_DOWNLOAD_FLAG_NONE,
+ cancellable,
+ error);
+ if (!download_success)
+ gs_plugin_fwupd_error_convert (error);
+
+ if (!gs_metered_remove_from_download_scheduler (schedule_entry_handle, NULL, &error_local))
+ g_warning ("Failed to remove schedule entry: %s", error_local->message);
+
+ if (!download_success)
+ return FALSE;
+ }
+ gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0);
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* locked devices need unlocking, rather than installing */
+ if (gs_fwupd_app_get_is_locked (app)) {
+ const gchar *device_id;
+ device_id = gs_fwupd_app_get_device_id (app);
+ if (device_id == NULL) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "not enough data for fwupd unlock");
+ return FALSE;
+ }
+ if (!fwupd_client_unlock (self->client, device_id,
+ cancellable, error)) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /* update means install */
+ if (!gs_plugin_fwupd_install (self, app, cancellable, error)) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ g_autofree gchar *content_type = NULL;
+ g_autofree gchar *filename = NULL;
+ g_autoptr(GPtrArray) devices = NULL;
+ const gchar *mimetypes[] = {
+ "application/vnd.ms-cab-compressed",
+ 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 FALSE;
+ if (!g_strv_contains (mimetypes, content_type))
+ return TRUE;
+
+ /* get results */
+ filename = g_file_get_path (file);
+ devices = fwupd_client_get_details (self->client,
+ filename,
+ cancellable,
+ error);
+ if (devices == NULL) {
+ gs_plugin_fwupd_error_convert (error);
+ return FALSE;
+ }
+ 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);
+
+ /* 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_list_add (list, app);
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginFwupd *self = GS_PLUGIN_FWUPD (plugin);
+ g_autoptr(GPtrArray) remotes = NULL;
+
+ /* find all remotes */
+ remotes = fwupd_client_get_remotes (self->client, cancellable, error);
+ if (remotes == NULL)
+ return FALSE;
+ 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 = 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, fwupd_remote_get_enabled (remote) ?
+ 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"));
+ gs_app_list_add (list, app);
+ }
+ return TRUE;
+}
+
+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) {
+ if (fwupd_remote_get_enabled (remote) &&
+ fwupd_remote_get_kind (remote) != FWUPD_REMOTE_KIND_LOCAL &&
+ !remote_cache_is_expired (remote, cache_age)) {
+ GCancellable *cancellable = g_task_get_cancellable (task);
+ fwupd_client_refresh_remote_async (self->client, remote, cancellable,
+ gs_plugin_fwupd_enable_repository_remote_refresh_ready_cb,
+ g_steal_pointer (&task));
+ 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;
+
+ 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;
+}
+
+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..6114814
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..f02a9f0
--- /dev/null
+++ b/plugins/fwupd/gs-self-test.c
@@ -0,0 +1,111 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <fwupd.h>
+
+#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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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);
+ g_assert_cmpstr (gs_app_get_description (app), ==,
+ "This is the first paragraph in the example "
+ "cab file.\n\nThis is the second paragraph.");
+#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..8ed030b
--- /dev/null
+++ b/plugins/fwupd/meson.build
@@ -0,0 +1,54 @@
+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',
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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')
+ cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"']
+ e = executable(
+ 'gs-self-test-fwupd',
+ compiled_schemas,
+ sources : [
+ 'gs-self-test.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..3f2067d
--- /dev/null
+++ b/plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="addon">
+ <id>org.gnome.Software.Plugin.Fwupd</id>
+ <extends>org.gnome.Software.desktop</extends>
+ <name>Firmware Upgrade Support</name>
+ <summary>Provides support for firmware upgrades</summary>
+ <url type="homepage">http://www.fwupd.org</url>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <update_contact>richard_at_hughsie.com</update_contact>
+</component>
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 0000000..6618361
--- /dev/null
+++ b/plugins/fwupd/tests/chiron-0.2.cab
Binary files differ
diff --git a/plugins/fwupd/tests/firmware.dfu b/plugins/fwupd/tests/firmware.dfu
new file mode 100644
index 0000000..50f00c0
--- /dev/null
+++ b/plugins/fwupd/tests/firmware.dfu
Binary files differ
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..d942fd8
--- /dev/null
+++ b/plugins/fwupd/tests/firmware.metainfo.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
+<component type="firmware">
+ <id>com.test.chiron.firmware</id>
+ <name>Chiron</name>
+ <summary>Single line synopsis</summary>
+ <description>
+ <p>
+ This is the first paragraph in the example cab file.
+ </p>
+ <p>
+ This is the second paragraph.
+ </p>
+ </description>
+ <provides>
+ <firmware type="flashed">fd9f37b4-36fb-5245-86a8-4d5993bb153b</firmware>
+ </provides>
+ <url type="homepage">http://127.0.0.1/</url>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <developer_name>ACME Corp</developer_name>
+ <releases>
+ <release urgency="medium" version="0.2" timestamp="1447353015">
+ <checksum target="content" filename="firmware.dfu"/>
+ <description>
+ <p>Latest firmware release.</p>
+ </description>
+ </release>
+ </releases>
+</component>
diff --git a/plugins/malcontent/gs-plugin-malcontent.c b/plugins/malcontent/gs-plugin-malcontent.c
new file mode 100644
index 0000000..d8825a9
--- /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+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n.h>
+#include <gnome-software.h>
+#include <libmalcontent/malcontent.h>
+#include <string.h>
+#include <math.h>
+
+#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_GET_APP_FILTER_FLAGS_INTERACTIVE : MCT_GET_APP_FILTER_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_GET_APP_FILTER_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..11f9a4a
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..149fde6
--- /dev/null
+++ b/plugins/malcontent/meson.build
@@ -0,0 +1,14 @@
+c_args = ['-DG_LOG_DOMAIN="GsPluginMalcontent"']
+
+shared_module(
+ 'gs_plugin_malcontent',
+ sources : 'gs-plugin-malcontent.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..711b488
--- /dev/null
+++ b/plugins/meson.build
@@ -0,0 +1,43 @@
+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('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('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
diff --git a/plugins/modalias/gs-plugin-modalias.c b/plugins/modalias/gs-plugin-modalias.c
new file mode 100644
index 0000000..9efbcf1
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <fnmatch.h>
+#include <gudev/gudev.h>
+
+#include <gnome-software.h>
+
+#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_get_icons (app) != NULL)
+ 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..386a667
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..e2c59da
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 ("<?xml version=\"1.0\"?>\n"
+ "<components version=\"0.9\">\n"
+ " <component type=\"driver\">\n"
+ " <id>com.hughski.ColorHug2.driver</id>\n"
+ " <name>ColorHug2</name>\n"
+ " <summary>ColorHug2 Colorimeter Driver</summary>\n"
+ " <pkgname>colorhug-client</pkgname>\n"
+ " <provides>\n"
+ " <modalias>pci:*</modalias>\n"
+ " </provides>\n"
+ " </component>\n"
+ " <info>\n"
+ " <scope>system</scope>\n"
+ " </info>\n"
+ "</components>\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..fc0c806
--- /dev/null
+++ b/plugins/modalias/meson.build
@@ -0,0 +1,36 @@
+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',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : [ plugin_libs, gudev ],
+)
+
+if get_option('tests')
+ e = executable(
+ 'gs-self-test-modalias',
+ compiled_schemas,
+ sources : [
+ 'gs-self-test.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ dependencies : [
+ plugin_libs,
+ ],
+ c_args : cargs,
+ )
+ test('gs-self-test-modalias', e, suite: ['plugins', 'modalias'], env: test_env)
+endif
diff --git a/plugins/packagekit/gs-markdown.c b/plugins/packagekit/gs-markdown.c
new file mode 100644
index 0000000..b7be06b
--- /dev/null
+++ b/plugins/packagekit/gs-markdown.c
@@ -0,0 +1,856 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib.h>
+
+#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 links or 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_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 *bullet_start;
+ const gchar *bullet_end;
+ const gchar *rule;
+} 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 *line)
+{
+ return (g_str_has_prefix (line, "- ") ||
+ g_str_has_prefix (line, "* ") ||
+ g_str_has_prefix (line, "+ ") ||
+ g_str_has_prefix (line, " - ") ||
+ g_str_has_prefix (line, " * ") ||
+ g_str_has_prefix (line, " + "));
+}
+
+static gboolean
+gs_markdown_to_text_line_is_header1 (const gchar *line)
+{
+ return g_str_has_prefix (line, "# ");
+}
+
+static gboolean
+gs_markdown_to_text_line_is_header2 (const gchar *line)
+{
+ return g_str_has_prefix (line, "## ");
+}
+
+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 ("<a href=\"%s\">%s</a>",
+ 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 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;
+ }
+
+ /* 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_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[2]);
+ 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[2]);
+ 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[3]);
+ 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 = "<i>";
+ self->tags.em_end = "</i>";
+ self->tags.strong_start = "<b>";
+ self->tags.strong_end = "</b>";
+ self->tags.code_start = "<tt>";
+ self->tags.code_end = "</tt>";
+ self->tags.h1_start = "<big>";
+ self->tags.h1_end = "</big>";
+ self->tags.h2_start = "<b>";
+ self->tags.h2_end = "</b>";
+ self->tags.bullet_start = "• ";
+ self->tags.bullet_end = "";
+ self->tags.rule = "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n";
+ self->escape = TRUE;
+ self->autolinkify = TRUE;
+ break;
+ case GS_MARKDOWN_OUTPUT_HTML:
+ /* XHTML */
+ self->tags.em_start = "<em>";
+ self->tags.em_end = "<em>";
+ self->tags.strong_start = "<strong>";
+ self->tags.strong_end = "</strong>";
+ self->tags.code_start = "<code>";
+ self->tags.code_end = "</code>";
+ self->tags.h1_start = "<h1>";
+ self->tags.h1_end = "</h1>";
+ self->tags.h2_start = "<h2>";
+ self->tags.h2_end = "</h2>";
+ self->tags.bullet_start = "<li>";
+ self->tags.bullet_end = "</li>";
+ self->tags.rule = "<hr>";
+ 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.bullet_start = "* ";
+ self->tags.bullet_end = "";
+ self->tags.rule = " ----- \n";
+ 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;
+
+ 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 (g_str_has_suffix (self->processed->str, "\n"))
+ g_string_set_size (self->processed, self->processed->len - 1);
+
+ /* get a copy */
+ temp = g_strdup (self->processed->str);
+ 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..51e6233
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+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..7ae42c1
--- /dev/null
+++ b/plugins/packagekit/gs-packagekit-helper.c
@@ -0,0 +1,141 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib.h>
+
+#include "gs-packagekit-helper.h"
+#include "packagekit-common.h"
+
+struct _GsPackagekitHelper {
+ GObject parent_instance;
+ GHashTable *apps;
+ GsApp *progress_app;
+ GsAppList *progress_list;
+ GsPlugin *plugin;
+};
+
+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);
+ } 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);
+}
+
+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);
+}
+
+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..594d0c0
--- /dev/null
+++ b/plugins/packagekit/gs-packagekit-helper.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) 2016-2018 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gnome-software.h>
+#include <packagekit-glib2/packagekit.h>
+
+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);
+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..7727ce3
--- /dev/null
+++ b/plugins/packagekit/gs-packagekit-task.c
@@ -0,0 +1,280 @@
+/* -*- 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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+
+#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 * */
+ GsPluginAction action;
+ 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->action) {
+ case GS_PLUGIN_ACTION_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_PLUGIN_ACTION_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_PLUGIN_ACTION_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,
+ GsPluginAction action,
+ gboolean interactive)
+{
+ GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task);
+
+ g_return_if_fail (GS_IS_PACKAGEKIT_TASK (task));
+
+ priv->action = action;
+
+ /* 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);
+}
+
+GsPluginAction
+gs_packagekit_task_get_action (GsPackagekitTask *task)
+{
+ GsPackagekitTaskPrivate *priv = gs_packagekit_task_get_instance_private (task);
+
+ g_return_val_if_fail (GS_IS_PACKAGEKIT_TASK (task), GS_PLUGIN_ACTION_UNKNOWN);
+
+ return priv->action;
+}
+
+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..ff4bcc6
--- /dev/null
+++ b/plugins/packagekit/gs-packagekit-task.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 Red Hat <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gnome-software.h>
+#include <packagekit-glib2/packagekit.h>
+
+#include "gs-packagekit-helper.h"
+
+G_BEGIN_DECLS
+
+#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,
+ GsPluginAction action,
+ gboolean interactive);
+GsPluginAction gs_packagekit_task_get_action (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..5b601c9
--- /dev/null
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -0,0 +1,4080 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2017 Canonical Ltd
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <glib/gi18n-lib.h>
+#include <gnome-software.h>
+#include <gsettings-desktop-schemas/gdesktop-enums.h>
+#include <packagekit-glib2/packagekit.h>
+#include <string.h>
+
+#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 the offline update.
+ *
+ * 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) */
+};
+
+G_DEFINE_TYPE (GsPluginPackagekit, gs_plugin_packagekit, GS_TYPE_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_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_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);
+
+ /* 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);
+
+ /* 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);
+
+ 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_OBJECT_CLASS (gs_plugin_packagekit_parent_class)->finalize (object);
+}
+
+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 gboolean
+gs_plugin_add_sources_related (GsPlugin *plugin,
+ GHashTable *hash,
+ GCancellable *cancellable,
+ GError **error)
+{
+ guint i;
+ GsApp *app;
+ GsApp *app_tmp;
+ PkBitfield filter;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_related = NULL;
+ const gchar *id;
+ gboolean ret = TRUE;
+ g_autoptr(GsAppList) installed = gs_app_list_new ();
+ g_autoptr(PkResults) results = NULL;
+
+ filter = pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED,
+ PK_FILTER_ENUM_NEWEST,
+ PK_FILTER_ENUM_ARCH,
+ PK_FILTER_ENUM_NOT_COLLECTIONS,
+ -1);
+
+ task_related = gs_packagekit_task_new (plugin);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_related), GS_PLUGIN_ACTION_GET_SOURCES, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_packages (PK_CLIENT (task_related),
+ filter,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ g_prefix_error (error, "failed to get sources related: ");
+ return FALSE;
+ }
+ ret = gs_plugin_packagekit_add_results (plugin,
+ installed,
+ results,
+ error);
+ if (!ret)
+ return FALSE;
+ for (i = 0; i < gs_app_list_length (installed); i++) {
+ g_auto(GStrv) split = NULL;
+ 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 (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "invalid package-id: %s",
+ gs_app_get_source_id_default (app));
+ return FALSE;
+ }
+ if (g_str_has_prefix (split[PK_PACKAGE_ID_DATA], "installed:")) {
+ id = split[PK_PACKAGE_ID_DATA] + 10;
+ app_tmp = g_hash_table_lookup (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);
+ }
+ }
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ PkBitfield filter;
+ PkRepoDetail *rd;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_sources = NULL;
+ const gchar *id;
+ guint i;
+ g_autoptr(GHashTable) hash = NULL;
+ g_autoptr(PkResults) results = NULL;
+ g_autoptr(GPtrArray) array = NULL;
+
+ /* ask PK for the repo details */
+ filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NOT_SOURCE,
+ PK_FILTER_ENUM_NOT_DEVELOPMENT,
+ -1);
+
+ task_sources = gs_packagekit_task_new (plugin);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_sources), GS_PLUGIN_ACTION_GET_SOURCES, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_repo_list (PK_CLIENT (task_sources),
+ filter,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error))
+ return FALSE;
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ array = pk_results_get_repo_detail_array (results);
+ for (i = 0; i < array->len; i++) {
+ g_autoptr(GsApp) app = NULL;
+ rd = g_ptr_array_index (array, i);
+ id = pk_repo_detail_get_id (rd);
+ 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_NORMAL,
+ pk_repo_detail_get_description (rd));
+ gs_app_set_summary (app,
+ GS_APP_QUALITY_NORMAL,
+ 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"));
+ gs_app_list_add (list, app);
+ g_hash_table_insert (hash,
+ g_strdup (id),
+ (gpointer) app);
+ }
+
+ /* get every application on the system and add it as a related package
+ * if it matches */
+ return gs_plugin_add_sources_related (plugin, hash, cancellable, error);
+}
+
+static gboolean
+gs_plugin_app_origin_repo_enable (GsPluginPackagekit *self,
+ PkTask *task_enable_repo,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(GsApp) repo_app = NULL;
+ g_autoptr(PkResults) results = NULL;
+ g_autoptr(PkError) error_code = 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 FALSE;
+ }
+
+ /* do sync call */
+ gs_plugin_status_update (plugin, app, GS_PLUGIN_STATUS_WAITING);
+ results = pk_client_repo_enable (PK_CLIENT (task_enable_repo),
+ repo_id,
+ TRUE,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ 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 (error);
+ } else if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_utils_error_add_origin_id (error, app);
+ return FALSE;
+ }
+
+ /* now that the repo is enabled, the app (not the repo!) moves from
+ * UNAVAILABLE state to AVAILABLE */
+ gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
+
+ /* Construct a simple fake GsApp for the repository, used only by the signal handler */
+ repo_app = gs_app_new (repo_id);
+ gs_app_set_state (repo_app, GS_APP_STATE_INSTALLED);
+ gs_plugin_repository_changed (plugin, repo_app);
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+ g_autoptr(GsAppList) addons = NULL;
+ GPtrArray *source_ids;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_install = NULL;
+ const gchar *package_id;
+ guint i;
+ g_autofree gchar *local_filename = NULL;
+ g_auto(GStrv) package_ids = NULL;
+ g_autoptr(GPtrArray) array_package_ids = NULL;
+ g_autoptr(PkResults) results = NULL;
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* enable repo, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ /* queue for install if installation needs the network */
+ if (!gs_plugin_get_network_available (plugin)) {
+ gs_app_set_state (app, GS_APP_STATE_QUEUED_FOR_INSTALL);
+ return TRUE;
+ }
+
+ /* Set up a #PkTask to handle the D-Bus calls to packagekitd. */
+ task_install = gs_packagekit_task_new (plugin);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_install), GS_PLUGIN_ACTION_INSTALL, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ if (gs_app_get_state (app) == GS_APP_STATE_UNAVAILABLE) {
+ /* get everything up front we need */
+ source_ids = gs_app_get_source_ids (app);
+ if (source_ids->len == 0) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "installing not available");
+ return FALSE;
+ }
+ package_ids = g_new0 (gchar *, 2);
+ package_ids[0] = g_strdup (g_ptr_array_index (source_ids, 0));
+
+ /* enable the repo where the unavailable app is coming from */
+ if (!gs_plugin_app_origin_repo_enable (self, task_install, app, cancellable, error))
+ return FALSE;
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+
+ /* FIXME: this is a hack, to allow PK time to re-initialize
+ * everything in order to match an actual result. The root cause
+ * is probably some kind of hard-to-debug race in the daemon. */
+ g_usleep (G_USEC_PER_SEC * 3);
+
+ /* actually install the package */
+ gs_packagekit_helper_add_app (helper, app);
+
+ results = pk_task_install_packages_sync (task_install,
+ package_ids,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* state is known */
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+
+ /* if we remove the app again later, we should be able to
+ * cancel the installation if we'd never installed it */
+ gs_app_set_allow_cancel (app, TRUE);
+
+ /* no longer valid */
+ gs_app_clear_source_ids (app);
+ return TRUE;
+ }
+
+ /* get the list of available package ids to install */
+ switch (gs_app_get_state (app)) {
+ case GS_APP_STATE_AVAILABLE:
+ case GS_APP_STATE_UPDATABLE:
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ source_ids = gs_app_get_source_ids (app);
+ if (source_ids->len == 0) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "installing not available");
+ return FALSE;
+ }
+
+ addons = gs_app_dup_addons (app);
+ array_package_ids = app_list_get_package_ids (addons,
+ gs_app_get_to_be_installed,
+ TRUE);
+
+ for (i = 0; i < source_ids->len; i++) {
+ package_id = g_ptr_array_index (source_ids, i);
+ if (package_is_installed (package_id))
+ continue;
+ g_ptr_array_add (array_package_ids, (gpointer) package_id);
+ }
+
+ if (array_package_ids->len == 0) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no packages to install");
+ return FALSE;
+ }
+
+ /* NULL-terminate the array */
+ g_ptr_array_add (array_package_ids, NULL);
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+
+ 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))
+ gs_app_set_state (addon, GS_APP_STATE_INSTALLING);
+ }
+ gs_packagekit_helper_add_app (helper, app);
+
+ results = pk_task_install_packages_sync (task_install,
+ (gchar **) array_package_ids->pdata,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) {
+ GsApp *addon = gs_app_list_index (addons, i);
+ if (gs_app_get_state (addon) == GS_APP_STATE_INSTALLING)
+ gs_app_set_state_recover (addon);
+ }
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* state is known */
+ for (i = 0; addons != NULL && i < gs_app_list_length (addons); i++) {
+ GsApp *addon = gs_app_list_index (addons, i);
+ if (gs_app_get_state (addon) == GS_APP_STATE_INSTALLING) {
+ gs_app_set_state (addon, GS_APP_STATE_INSTALLED);
+ gs_app_clear_source_ids (addon);
+ }
+ }
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+
+ break;
+ case GS_APP_STATE_AVAILABLE_LOCAL:
+ if (gs_app_get_local_file (app) == NULL) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "local package, but no filename");
+ return FALSE;
+ }
+ local_filename = g_file_get_path (gs_app_get_local_file (app));
+ package_ids = g_strsplit (local_filename, "\t", -1);
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ gs_packagekit_helper_add_app (helper, app);
+
+ results = pk_task_install_files_sync (task_install,
+ package_ids,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* 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);
+ break;
+ default:
+ g_set_error (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)));
+ return FALSE;
+ }
+
+ /* no longer valid */
+ gs_app_clear_source_ids (app);
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *package_id;
+ GPtrArray *source_ids;
+ g_autoptr(GsAppList) addons = NULL;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_remove = NULL;
+ guint i;
+ guint cnt = 0;
+ g_autoptr(PkResults) results = NULL;
+ g_auto(GStrv) package_ids = NULL;
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* disable repo, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ /* get the list of available package ids to install */
+ source_ids = gs_app_get_source_ids (app);
+ if (source_ids->len == 0) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "removing not available");
+ return FALSE;
+ }
+ package_ids = g_new0 (gchar *, source_ids->len + 1);
+ for (i = 0; i < source_ids->len; i++) {
+ package_id = g_ptr_array_index (source_ids, i);
+ if (!package_is_installed (package_id))
+ continue;
+ package_ids[cnt++] = g_strdup (package_id);
+ }
+ if (cnt == 0) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no packages to remove");
+ return FALSE;
+ }
+
+ /* do the action */
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ gs_packagekit_helper_add_app (helper, app);
+
+ task_remove = gs_packagekit_task_new (plugin);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_remove), GS_PLUGIN_ACTION_REMOVE, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_task_remove_packages_sync (task_remove,
+ package_ids,
+ TRUE, GS_PACKAGEKIT_AUTOREMOVE,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* Make sure addons' state is updated as well */
+ 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_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);
+
+ return TRUE;
+}
+
+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_app_set_state (app, GS_APP_STATE_UPDATABLE);
+ 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_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_app_set_state (app, GS_APP_STATE_UPDATABLE);
+ gs_plugin_cache_add (plugin, pk_package_get_id (package), app);
+ return app;
+}
+
+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;
+ g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GsApp) first_app = NULL;
+ gboolean all_downloaded = TRUE;
+
+ /* 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_PLUGIN_ACTION_GET_UPDATES, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_updates (PK_CLIENT (task_updates),
+ pk_bitfield_value (PK_FILTER_ENUM_NONE),
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, 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;
+
+ 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;
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GError) local_error = NULL;
+ if (!gs_plugin_packagekit_add_updates (plugin, list, cancellable, &local_error))
+ g_debug ("Failed to get updates: %s", local_error->message);
+ return TRUE;
+}
+
+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));
+ gboolean interactive = (flags & GS_PLUGIN_LIST_APPS_FLAGS_INTERACTIVE);
+ g_autoptr(GTask) task = NULL;
+ const gchar *provides_tag = 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);
+
+ 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_PLUGIN_ACTION_UNKNOWN, interactive);
+
+ if (gs_app_query_get_provides_files (query) != 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 **) gs_app_query_get_provides_files (query),
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ list_apps_cb, g_steal_pointer (&task));
+ } else if (gs_app_query_get_provides (query, &provides_tag) != 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 {
+ g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ "Unsupported query");
+ }
+}
+
+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, &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)
+{
+ 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);
+}
+
+gboolean
+gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ return gs_plugin_app_launch_filtered (plugin, app, plugin_packagekit_pick_rpm_desktop_file_cb, NULL, error);
+}
+
+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_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, &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);
+}
+
+/*
+ * gs_plugin_packagekit_fixup_update_description:
+ *
+ * Lets assume Fedora is sending us valid markdown, but fall back to
+ * plain text if this fails.
+ */
+static gchar *
+gs_plugin_packagekit_fixup_update_description (const gchar *text)
+{
+ gchar *tmp;
+ g_autoptr(GsMarkdown) markdown = NULL;
+
+ /* nothing to do */
+ if (text == NULL)
+ return 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);
+ tmp = gs_markdown_parse (markdown, text);
+ if (tmp != NULL)
+ return tmp;
+ return g_strdup (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_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,
+ 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;
+ }
+ gs_plugin_packagekit_error_convert (&error_local);
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "Failed to get prepared IDs: %s",
+ error_local->message);
+ return FALSE;
+ }
+
+ /* 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) (not nullable) */
+ gchar *filename; /* (owned) (not nullable) */
+} SearchFilesData;
+
+static void
+search_files_data_free (SearchFilesData *data)
+{
+ g_free (data->filename);
+ g_clear_object (&data->app);
+ g_clear_object (&data->refine_task);
+ 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,
+ const gchar *filename)
+{
+ g_autoptr(SearchFilesData) data = g_new0 (SearchFilesData, 1);
+ data->refine_task = refine_task_add_operation (refine_task);
+ data->app = g_object_ref (app);
+ data->filename = g_strdup (filename);
+
+ 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
+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(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;
+
+ 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;
+
+ /* 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))) {
+ 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);
+ }
+ }
+
+ /* 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, &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) {
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ g_autofree gchar *fn = NULL;
+ GsApp *app = gs_app_list_index (list, i);
+ const gchar *tmp;
+ const gchar *to_array[] = { NULL, NULL };
+ g_autoptr(GsPackagekitHelper) helper = NULL;
+
+ 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;
+ 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;
+ }
+
+ helper = gs_packagekit_helper_new (plugin);
+ to_array[0] = fn;
+ gs_packagekit_helper_add_app (helper, app);
+ pk_client_search_files_async (data_unowned->client_refine,
+ pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1),
+ (gchar **) to_array,
+ cancellable,
+ gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper),
+ search_files_cb,
+ search_files_data_new_operation (task, app, fn));
+ }
+ }
+
+ /* Refine repo package names */
+ for (guint i = 0; i < gs_app_list_length (repos_list); i++) {
+ GsApp *app = gs_app_list_index (repos_list, i);
+ const gchar *filename;
+ const gchar *to_array[] = { NULL, NULL };
+ g_autoptr(GsPackagekitHelper) helper = NULL;
+
+ filename = gs_app_get_metadata_item (app, "repos::repo-filename");
+
+ /* set the source package name for an installed .repo file */
+ helper = gs_packagekit_helper_new (plugin);
+ to_array[0] = filename;
+ gs_packagekit_helper_add_app (helper, app);
+
+ pk_client_search_files_async (data_unowned->client_refine,
+ pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, -1),
+ (gchar **) to_array,
+ cancellable,
+ gs_packagekit_helper_cb, refine_task_add_progress_data (task, helper),
+ search_files_cb,
+ search_files_data_new_operation (task, app, filename));
+ }
+
+ /* 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);
+
+ /* 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);
+
+ /* 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, &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 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, &local_error)) {
+ g_prefix_error (&local_error, "failed to search file %s: ", search_files_data->filename);
+ refine_task_complete_operation_with_error (refine_task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ /* get results */
+ packages = pk_results_get_package_array (results);
+ 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 ("Failed to find one package for %s, %s, [%u]",
+ gs_app_get_id (search_files_data->app), search_files_data->filename, 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);
+ 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;
+
+ results = pk_client_generic_finish (client, result, &local_error);
+ if (!gs_plugin_packagekit_results_valid (results, &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;
+ }
+
+ /* 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;
+ g_autofree gchar *desc = NULL;
+ PkUpdateDetail *update_detail;
+
+ /* 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);
+ desc = gs_plugin_packagekit_fixup_update_description (tmp);
+ if (desc != NULL)
+ gs_app_set_update_details_markup (app, desc);
+ break;
+ }
+ }
+
+ 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, &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, &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;
+ #ifdef HAVE_PK_PACKAGE_GET_UPDATE_SEVERITY
+ 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;
+ }
+ #else
+ switch (pk_package_get_info (pkg)) {
+ case PK_INFO_ENUM_AVAILABLE:
+ case PK_INFO_ENUM_NORMAL:
+ case PK_INFO_ENUM_LOW:
+ case PK_INFO_ENUM_ENHANCEMENT:
+ gs_app_set_update_urgency (app, AS_URGENCY_KIND_LOW);
+ break;
+ case PK_INFO_ENUM_BUGFIX:
+ gs_app_set_update_urgency (app, AS_URGENCY_KIND_MEDIUM);
+ break;
+ case PK_INFO_ENUM_SECURITY:
+ gs_app_set_update_urgency (app, AS_URGENCY_KIND_CRITICAL);
+ break;
+ case PK_INFO_ENUM_IMPORTANT:
+ gs_app_set_update_urgency (app, AS_URGENCY_KIND_HIGH);
+ break;
+ default:
+ gs_app_set_update_urgency (app, AS_URGENCY_KIND_UNKNOWN);
+ g_warning ("unhandled info state %s",
+ pk_info_enum_to_string (pk_package_get_info (pkg)));
+ break;
+ }
+ #endif
+ }
+
+ 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", &timestamp);
+ 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 gboolean
+gs_plugin_packagekit_download (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error);
+
+static void
+gs_plugin_packagekit_auto_prepare_update_thread (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ GsPlugin *plugin = source_object;
+ g_autoptr(GsAppList) list = NULL;
+ g_autoptr(GError) local_error = NULL;
+
+ g_return_if_fail (GS_IS_PLUGIN_PACKAGEKIT (plugin));
+
+ list = gs_app_list_new ();
+ if (!gs_plugin_packagekit_add_updates (plugin, list, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ if (gs_app_list_length (list) > 0 &&
+ !gs_plugin_packagekit_download (plugin, list, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ /* Ignore errors here */
+ gs_plugin_systemd_update_cache (GS_PLUGIN_PACKAGEKIT (source_object), 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);
+ 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_setup_async (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+ g_autoptr(GTask) task = NULL;
+
+ g_debug ("PackageKit version: %d.%d.%d",
+ PK_MAJOR_VERSION,
+ PK_MINOR_VERSION,
+ PK_MICRO_VERSION);
+
+ 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, &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 gboolean
+gs_plugin_packagekit_refresh_guess_app_id (GsPluginPackagekit *self,
+ GsApp *app,
+ const gchar *filename,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_auto(GStrv) files = NULL;
+ g_autoptr(PkTask) task_local = NULL;
+ g_autoptr(PkResults) results = NULL;
+ g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GString) basename_best = g_string_new (NULL);
+
+ /* get file list so we can work out ID */
+ files = g_strsplit (filename, "\t", -1);
+ gs_packagekit_helper_add_app (helper, app);
+
+ task_local = gs_packagekit_task_new (plugin);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_local), GS_PLUGIN_ACTION_FILE_TO_APP, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_files_local (PK_CLIENT (task_local),
+ files,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_utils_error_add_origin_id (error, app);
+ return FALSE;
+ }
+ array = pk_results_get_files_array (results);
+ if (array->len == 0) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "no files for %s", filename);
+ return FALSE;
+ }
+
+ /* 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);
+ gchar **fns = 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 (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 (app, AS_COMPONENT_KIND_DESKTOP_APP);
+ gs_app_set_id (app, basename_best->str);
+ }
+
+ return TRUE;
+}
+
+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_packagekit_local_check_installed (GsPluginPackagekit *self,
+ PkTask *task_local,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ PkBitfield filter;
+ const gchar *names[] = { gs_app_get_source_default (app), NULL };
+ g_autoptr(GPtrArray) packages = NULL;
+ g_autoptr(PkResults) results = NULL;
+
+ filter = pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST,
+ PK_FILTER_ENUM_ARCH,
+ PK_FILTER_ENUM_INSTALLED,
+ -1);
+ results = pk_client_resolve (PK_CLIENT (task_local), filter, (gchar **) names,
+ cancellable, NULL, NULL, error);
+ if (results == NULL) {
+ gs_plugin_packagekit_error_convert (error);
+ return FALSE;
+ }
+ packages = pk_results_get_package_array (results);
+ if (packages->len > 0) {
+ gboolean is_higher_version = FALSE;
+ const gchar *app_version = gs_app_get_version (app);
+ for (guint i = 0; i < packages->len; i++){
+ PkPackage *pkg = g_ptr_array_index (packages, i);
+ gs_app_add_source_id (app, pk_package_get_id (pkg));
+ if (!is_higher_version &&
+ as_vercmp_simple (pk_package_get_version (pkg), app_version) < 0)
+ is_higher_version = TRUE;
+ }
+ if (!is_higher_version) {
+ gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ }
+ }
+ return TRUE;
+}
+
+gboolean
+gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+ const gchar *package_id;
+ PkDetails *item;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_local = NULL;
+ g_autoptr(PkResults) results = NULL;
+ g_autofree gchar *content_type = NULL;
+ g_autofree gchar *filename = NULL;
+ g_autofree gchar *license_spdx = NULL;
+ g_auto(GStrv) files = NULL;
+ g_auto(GStrv) split = NULL;
+ g_autoptr(GPtrArray) array = NULL;
+ g_autoptr(GsApp) app = 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 (file, cancellable, error);
+ if (content_type == NULL)
+ return FALSE;
+ if (!g_strv_contains (mimetypes, content_type))
+ return TRUE;
+
+ /* get details */
+ filename = g_file_get_path (file);
+ files = g_strsplit (filename, "\t", -1);
+
+ task_local = gs_packagekit_task_new (plugin);
+ pk_client_set_cache_age (PK_CLIENT (task_local), G_MAXUINT);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_local), GS_PLUGIN_ACTION_FILE_TO_APP, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_details_local (PK_CLIENT (task_local),
+ files,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error))
+ return FALSE;
+
+ /* get results */
+ array = pk_results_get_details_array (results);
+ if (array->len == 0) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "no details for %s", filename);
+ return FALSE;
+ }
+ if (array->len > 1) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "too many details [%u] for %s",
+ array->len, filename);
+ return FALSE;
+ }
+
+ /* 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_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_INVALID_FORMAT,
+ "invalid package-id: %s", package_id);
+ return FALSE;
+ }
+ 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_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);
+ license_spdx = as_license_to_spdx_id (pk_details_get_license (item));
+ gs_app_set_license (app, GS_APP_QUALITY_LOWEST, license_spdx);
+ add_quirks_from_package_name (app, split[PK_PACKAGE_ID_NAME]);
+
+ /* is already installed? */
+ if (!gs_plugin_packagekit_local_check_installed (self,
+ task_local,
+ app,
+ cancellable,
+ error))
+ return FALSE;
+
+ /* look for a desktop file so we can use a valid application id */
+ if (!gs_plugin_packagekit_refresh_guess_app_id (self,
+ app,
+ filename,
+ cancellable,
+ error))
+ return FALSE;
+
+ gs_app_list_add (list, app);
+ return TRUE;
+}
+
+static gboolean
+gs_plugin_packagekit_convert_error (GError **error,
+ PkErrorEnum error_enum,
+ const gchar *details)
+{
+ 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;
+ }
+ return FALSE;
+}
+
+gboolean
+gs_plugin_add_updates_historical (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(PkResults) results = NULL;
+ 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);
+
+ 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);
+ return FALSE;
+ }
+
+ /* 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;
+ }
+
+ return gs_plugin_packagekit_convert_error (error,
+ pk_error_get_code (error_code),
+ pk_error_get_details (error_code));
+ }
+
+ /* 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_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;
+}
+
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+ g_autofree gchar *scheme = NULL;
+ g_autofree gchar *path = NULL;
+ const gchar *id = NULL;
+ const gchar * const *id_like = NULL;
+ g_auto(GStrv) package_ids = NULL;
+ g_autoptr(PkResults) results = NULL;
+ g_autoptr(GsApp) app = NULL;
+ g_autoptr(GsOsRelease) os_release = NULL;
+ g_autoptr(GPtrArray) packages = NULL;
+ g_autoptr(GPtrArray) details = NULL;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkClient) client_url_to_app = NULL;
+
+ path = gs_utils_get_url_path (url);
+
+ /* only do this for apt:// on debian or debian-like distros */
+ os_release = gs_os_release_new (error);
+ if (os_release == NULL) {
+ g_prefix_error (error, "failed to determine OS information:");
+ return FALSE;
+ } else {
+ 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 ||
+ g_strv_contains (id_like, "debian")))) {
+ return TRUE;
+ }
+ }
+
+ 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);
+
+ package_ids = g_new0 (gchar *, 2);
+ package_ids[0] = g_strdup (path);
+
+ client_url_to_app = pk_client_new ();
+ pk_client_set_interactive (client_url_to_app, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_resolve (client_url_to_app,
+ pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, PK_FILTER_ENUM_ARCH, -1),
+ package_ids,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ g_prefix_error (error, "failed to resolve package_ids: ");
+ return FALSE;
+ }
+
+ /* 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)
+ return TRUE;
+
+ 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 (GS_PLUGIN (self), packages, app);
+ gs_plugin_packagekit_refine_details_app (plugin, details_collection, prepared_updates, app);
+
+ gs_app_list_add (list, app);
+ } else {
+ g_warning ("no results returned");
+ }
+
+ return TRUE;
+}
+
+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(GError) error = 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);
+}
+
+gboolean
+gs_plugin_app_upgrade_download (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_upgrade = NULL;
+ g_autoptr(PkResults) results = NULL;
+
+ /* 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;
+
+ /* ask PK to download enough packages to upgrade the system */
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ 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_PLUGIN_ACTION_UPGRADE_DOWNLOAD, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_task_upgrade_system_sync (task_upgrade,
+ gs_app_get_version (app),
+ PK_UPGRADE_KIND_ENUM_COMPLETE,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* state is known */
+ gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+ return TRUE;
+}
+
+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, &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_PLUGIN_ACTION_ENABLE_REPO,
+ (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, &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_PLUGIN_ACTION_DISABLE_REPO,
+ (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);
+}
+
+static gboolean
+_download_only (GsPluginPackagekit *self,
+ GsAppList *list,
+ GsAppList *progress_list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPlugin *plugin = GS_PLUGIN (self);
+ g_auto(GStrv) package_ids = NULL;
+ g_autoptr(GsPackagekitHelper) helper = gs_packagekit_helper_new (plugin);
+ g_autoptr(PkTask) task_refresh = NULL;
+ g_autoptr(PkPackageSack) sack = NULL;
+ g_autoptr(PkResults) results2 = NULL;
+ g_autoptr(PkResults) results = NULL;
+
+ /* get the list of packages to update */
+ gs_plugin_status_update (plugin, 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_refresh = gs_packagekit_task_new (plugin);
+ pk_task_set_only_download (task_refresh, TRUE);
+ gs_packagekit_task_setup (GS_PACKAGEKIT_TASK (task_refresh), GS_PLUGIN_ACTION_DOWNLOAD, gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+
+ results = pk_client_get_updates (PK_CLIENT (task_refresh),
+ pk_bitfield_value (PK_FILTER_ENUM_NONE),
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ if (!gs_plugin_packagekit_results_valid (results, error)) {
+ return FALSE;
+ }
+
+ /* download all the packages */
+ sack = pk_results_get_package_sack (results);
+ if (pk_package_sack_get_size (sack) == 0)
+ return TRUE;
+ package_ids = pk_package_sack_get_ids (sack);
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, i);
+ gs_packagekit_helper_add_app (helper, app);
+ }
+ gs_packagekit_helper_set_progress_list (helper, 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 */
+ results2 = pk_task_update_packages_sync (task_refresh,
+ package_ids,
+ cancellable,
+ gs_packagekit_helper_cb, helper,
+ error);
+
+ gs_app_list_override_progress (progress_list, GS_APP_PROGRESS_UNKNOWN);
+ if (results2 == NULL) {
+ gs_plugin_packagekit_error_convert (error);
+ return FALSE;
+ }
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ return FALSE;
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, i);
+ /* To indicate the app is already downloaded */
+ gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 0);
+ }
+ return TRUE;
+}
+
+static gboolean
+gs_plugin_packagekit_download (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+ g_autoptr(GsAppList) list_tmp = gs_app_list_new ();
+ g_autoptr(GError) error_local = NULL;
+ gboolean retval;
+ gpointer schedule_entry_handle = NULL;
+
+ /* 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 (list_tmp, 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 (list_tmp, app_tmp);
+ }
+ }
+
+ if (gs_app_list_length (list_tmp) == 0)
+ return TRUE;
+
+ if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) {
+ if (!gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle, cancellable, &error_local)) {
+ g_warning ("Failed to block on download scheduler: %s",
+ error_local->message);
+ g_clear_error (&error_local);
+ }
+ }
+
+ retval = _download_only (self, list_tmp, list, cancellable, error);
+
+ if (!gs_metered_remove_from_download_scheduler (schedule_entry_handle, NULL, &error_local))
+ g_warning ("Failed to remove schedule entry: %s", error_local->message);
+
+ if (retval)
+ gs_plugin_updates_changed (plugin);
+
+ return retval;
+}
+
+gboolean
+gs_plugin_download (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return gs_plugin_packagekit_download (plugin, list, cancellable, 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_PLUGIN_ACTION_UNKNOWN, 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, &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);
+}
+
+#ifdef HAVE_PK_OFFLINE_WITH_FLAGS
+
+static PkOfflineFlags
+gs_systemd_get_offline_flags (GsPlugin *plugin)
+{
+ if (gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
+ return PK_OFFLINE_FLAGS_INTERACTIVE;
+ return PK_OFFLINE_FLAGS_NONE;
+}
+
+static gboolean
+gs_systemd_call_trigger (GsPlugin *plugin,
+ PkOfflineAction action,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return pk_offline_trigger_with_flags (action,
+ gs_systemd_get_offline_flags (plugin),
+ cancellable, error);
+}
+
+static gboolean
+gs_systemd_call_cancel (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return pk_offline_cancel_with_flags (gs_systemd_get_offline_flags (plugin), cancellable, error);
+}
+
+static gboolean
+gs_systemd_call_trigger_upgrade (GsPlugin *plugin,
+ PkOfflineAction action,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return pk_offline_trigger_upgrade_with_flags (action,
+ gs_systemd_get_offline_flags (plugin),
+ cancellable, error);
+}
+
+#else /* HAVE_PK_OFFLINE_WITH_FLAGS */
+
+static GDBusCallFlags
+gs_systemd_get_gdbus_call_flags (GsPlugin *plugin)
+{
+ if (gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
+ return G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION;
+ return G_DBUS_CALL_FLAGS_NONE;
+}
+
+static gboolean
+gs_systemd_call_trigger (GsPlugin *plugin,
+ PkOfflineAction action,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *tmp;
+ g_autoptr(GVariant) res = NULL;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ tmp = pk_offline_action_to_string (action);
+ res = g_dbus_connection_call_sync (gs_plugin_get_system_bus_connection (plugin),
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ "org.freedesktop.PackageKit.Offline",
+ "Trigger",
+ g_variant_new ("(s)", tmp),
+ NULL,
+ gs_systemd_get_gdbus_call_flags (plugin),
+ -1,
+ cancellable,
+ error);
+ if (res == NULL)
+ return FALSE;
+ return TRUE;
+}
+
+static gboolean
+gs_systemd_call_cancel (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GVariant) res = NULL;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ res = g_dbus_connection_call_sync (gs_plugin_get_system_bus_connection (plugin),
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ "org.freedesktop.PackageKit.Offline",
+ "Cancel",
+ NULL,
+ NULL,
+ gs_systemd_get_gdbus_call_flags (plugin),
+ -1,
+ cancellable,
+ error);
+ if (res == NULL)
+ return FALSE;
+ return TRUE;
+}
+
+static gboolean
+gs_systemd_call_trigger_upgrade (GsPlugin *plugin,
+ PkOfflineAction action,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *tmp;
+ g_autoptr(GVariant) res = NULL;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ tmp = pk_offline_action_to_string (action);
+ res = g_dbus_connection_call_sync (gs_plugin_get_system_bus_connection (plugin),
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ "org.freedesktop.PackageKit.Offline",
+ "TriggerUpgrade",
+ g_variant_new ("(s)", tmp),
+ NULL,
+ gs_systemd_get_gdbus_call_flags (plugin),
+ -1,
+ cancellable,
+ error);
+ if (res == NULL)
+ return FALSE;
+ return TRUE;
+}
+
+#endif /* HAVE_PK_OFFLINE_WITH_FLAGS */
+
+static gboolean
+_systemd_trigger_app (GsPluginPackagekit *self,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* 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->is_triggered)
+ return TRUE;
+
+ /* trigger offline update */
+ if (!gs_systemd_call_trigger (GS_PLUGIN (self), PK_OFFLINE_ACTION_REBOOT, cancellable, error)) {
+ gs_plugin_packagekit_error_convert (error);
+ return FALSE;
+ }
+
+ /* don't rely on the file monitor */
+ gs_plugin_packagekit_refresh_is_triggered (self, cancellable);
+
+ /* success */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+
+ /* any are us? */
+ 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);
+
+ /* try to trigger this app */
+ if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)) {
+ if (!_systemd_trigger_app (self, app, cancellable, error))
+ return FALSE;
+ continue;
+ }
+
+ /* 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 (!_systemd_trigger_app (self, app_tmp, cancellable, error))
+ return FALSE;
+ }
+ }
+
+ /* success */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update_cancel (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginPackagekit *self = GS_PLUGIN_PACKAGEKIT (plugin);
+
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ /* already in correct state */
+ if (!self->is_triggered)
+ return TRUE;
+
+ /* cancel offline update */
+ if (!gs_systemd_call_cancel (plugin, cancellable, error)) {
+ gs_plugin_packagekit_error_convert (error);
+ return FALSE;
+ }
+
+ /* don't rely on the file monitor */
+ gs_plugin_packagekit_refresh_is_triggered (self, cancellable);
+
+ /* success! */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_upgrade_trigger (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ if (!gs_systemd_call_trigger_upgrade (plugin, PK_OFFLINE_ACTION_REBOOT, cancellable, error)) {
+ gs_plugin_packagekit_error_convert (error);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+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;
+}
+
+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..8b698d0
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..51ae947
--- /dev/null
+++ b/plugins/packagekit/gs-self-test.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) 2013-2017 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 =
+ "<big>OEMs</big>\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 <tt>http://www.hughsie.com/with_spaces_in_url</tt> 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 = "<b><i> This software is currently in alpha state </b></i>";
+ 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 <i>very</i> 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 <i>very</i> short paragraph that is not usual.\n"
+ "• This is the second bullett point.\n"
+ "• And the third.\n"
+ "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n"
+ "Paragraph one isn&apos;t <b>very</b> long at all.\n"
+ "Paragraph two isn&apos;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 <b>update</b> description in bohdi.\n"
+ "⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n"
+ "<big>Big title</big>\n"
+ "The <i>following</i> things 'were' fixed:\n"
+ "• Fix <tt>dave</tt>\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 & <spaces>";
+ markdown_expected =
+ "• list &amp; &lt;spaces&gt;";
+ text = gs_markdown_parse (md, markdown);
+ g_assert_cmpstr (text, ==, markdown_expected);
+ g_free (text);
+
+ /* markdown (URLs) */
+ markdown = "this is the http://www.hughsie.com/ coolest site";
+ markdown_expected =
+ "this is the "
+ "<a href=\"http://www.hughsie.com/\">http://www.hughsie.com/</a>"
+ " 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 <tt>CONFIG_UEVENT_HELPER_PATH</tt> present");
+ g_free (text);
+
+ /* markdown (end of bullett) */
+ markdown = "*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"
+ "\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\n";
+ markdown_expected =
+ "<i>Thu Mar 12 12:00:00 2009</i> Dan Walsh <tt>&lt;dwalsh@redhat.com&gt;</tt> - 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"
+ "<i>Tue Mar 10 12:00:00 2009</i> Dan Walsh <tt>&lt;dwalsh@redhat.com&gt;</tt> - 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ NULL);
+ 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..8dc2d5d
--- /dev/null
+++ b/plugins/packagekit/meson.build
@@ -0,0 +1,50 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginPackageKit"']
+cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"']
+deps = [
+ plugin_libs,
+ packagekit,
+]
+
+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',
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : deps,
+)
+
+if get_option('tests')
+ 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'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..4b6b165
--- /dev/null
+++ b/plugins/packagekit/packagekit-common.c
@@ -0,0 +1,585 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <packagekit-glib2/packagekit.h>
+
+#include <gnome-software.h>
+
+#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)
+{
+ 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;
+
+ /* daemon errors */
+ if (error_tmp->code <= 0xff) {
+ switch (error_tmp->code) {
+ case PK_CLIENT_ERROR_CANNOT_START_DAEMON:
+ case PK_CLIENT_ERROR_INVALID_FILE:
+ 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;
+ default:
+ error_tmp->code = GS_PLUGIN_ERROR_FAILED;
+ break;
+ }
+
+ /* backend errors */
+ } else {
+ switch (error_tmp->code - 0xff) {
+ case PK_ERROR_ENUM_INVALID_PACKAGE_FILE:
+ case PK_ERROR_ENUM_NOT_SUPPORTED:
+ case PK_ERROR_ENUM_PACKAGE_INSTALL_BLOCKED:
+ 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;
+ 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, GError **error)
+{
+ g_autoptr(PkError) error_code = NULL;
+
+ /* method failed? */
+ if (results == NULL) {
+ gs_plugin_packagekit_error_convert (error);
+ 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);
+ 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_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;
+ case PK_INFO_ENUM_INSTALLING:
+ case PK_INFO_ENUM_UPDATING:
+ case PK_INFO_ENUM_DOWNGRADING:
+ case PK_INFO_ENUM_OBSOLETING:
+ case PK_INFO_ENUM_UNTRUSTED:
+ break;
+ case PK_INFO_ENUM_UNAVAILABLE:
+ 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) {
+ /* 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));
+
+ /* 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);
+ }
+ 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++) {
+ #ifdef HAVE_PK_DETAILS_GET_DOWNLOAD_SIZE
+ guint64 download_sz;
+ #endif
+ 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) {
+ g_autofree gchar *license_spdx = NULL;
+ license_spdx = as_license_to_spdx_id (pk_details_get_license (details));
+ 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);
+ #ifdef HAVE_PK_DETAILS_GET_DOWNLOAD_SIZE
+ 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;
+ #endif
+ }
+
+ #ifndef HAVE_PK_DETAILS_GET_DOWNLOAD_SIZE
+ download_size = install_size;
+ #endif
+
+ /* 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");
+}
diff --git a/plugins/packagekit/packagekit-common.h b/plugins/packagekit/packagekit-common.h
new file mode 100644
index 0000000..6d673bc
--- /dev/null
+++ b/plugins/packagekit/packagekit-common.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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <gnome-software.h>
+
+#include <packagekit-glib2/packagekit.h>
+
+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);
+gboolean gs_plugin_packagekit_results_valid (PkResults *results,
+ 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);
+
+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 0000000..1453f48
--- /dev/null
+++ b/plugins/packagekit/tests/chiron-1.1-1.fc24.x86_64.rpm
Binary files differ
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 <richard@hughsie.com> - 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..8e57e8b
--- /dev/null
+++ b/plugins/repos/gs-plugin-repos.c
@@ -0,0 +1,422 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#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;
+ }
+}
+
+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..36ceeed
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..5a0d108
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..81172d2
--- /dev/null
+++ b/plugins/repos/meson.build
@@ -0,0 +1,35 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginRepos"']
+cargs += ['-DLOCALPLUGINDIR="' + meson.current_build_dir() + '"']
+
+shared_module(
+ 'gs_plugin_repos',
+ sources : 'gs-plugin-repos.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ c_args : cargs,
+ dependencies : plugin_libs,
+)
+
+if get_option('tests')
+ cargs += ['-DTESTDATADIR="' + join_paths(meson.current_source_dir(), 'tests') + '"']
+ e = executable(
+ 'gs-self-test-repos',
+ compiled_schemas,
+ sources : [
+ 'gs-self-test.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..b983c24
--- /dev/null
+++ b/plugins/rpm-ostree/gs-plugin-rpm-ostree.c
@@ -0,0 +1,2878 @@
+/* -*- 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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+
+#include <gnome-software.h>
+
+#include <fcntl.h>
+#include <gio/gio.h>
+#include <gio/gunixfdlist.h>
+#include <glib/gstdio.h>
+#include <glib/gi18n-lib.h>
+#include <libdnf/libdnf.h>
+#include <ostree.h>
+#include <rpm/rpmdb.h>
+#include <rpm/rpmlib.h>
+#include <rpm/rpmts.h>
+#include <rpmostree.h>
+
+#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 and libdnf 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;
+ DnfContext *dnf_context;
+ gboolean update_triggered;
+ guint inactive_timeout_id;
+};
+
+G_DEFINE_TYPE (GsPluginRpmOstree, gs_plugin_rpm_ostree, GS_TYPE_PLUGIN)
+
+#define assert_in_worker(self) \
+ g_assert (gs_worker_thread_is_in_worker_context (self->worker))
+
+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->dnf_context);
+ g_clear_object (&self->worker);
+
+ 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_OBJECT_CLASS (gs_plugin_rpm_ostree_parent_class)->finalize (object);
+}
+
+static void
+gs_plugin_rpm_ostree_init (GsPluginRpmOstree *self)
+{
+ /* only works on OSTree */
+ if (!g_file_test ("/run/ostree-booted", G_FILE_TEST_EXISTS)) {
+ gs_plugin_set_enabled (GS_PLUGIN (self), FALSE);
+ return;
+ }
+
+ g_mutex_init (&self->mutex);
+
+ /* 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");
+}
+
+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 {
+ 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_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)
+ 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);
+ g_clear_object (&self->dnf_context);
+ 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),
+ 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,
+ 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),
+ 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,
+ "",
+ &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,
+ 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, 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, 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;
+ 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_slice_free (TransactionProgress, self);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(TransactionProgress, transaction_progress_free);
+
+static void
+transaction_progress_end (TransactionProgress *self)
+{
+ self->complete = TRUE;
+ 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, "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);
+ }
+}
+
+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, NULL, NULL);
+}
+
+static gboolean
+gs_rpmostree_transaction_get_response_sync (GsRPMOSTreeSysroot *sysroot_proxy,
+ const gchar *transaction_address,
+ TransactionProgress *tp,
+ 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,
+ &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 (&current_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 (&notify_handler, sysroot_proxy);
+ g_clear_signal_handler (&cancelled_handler, cancellable);
+ return TRUE;
+ }
+ g_main_context_iteration (main_context, TRUE);
+ }
+
+ g_clear_signal_handler (&notify_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)
+{
+ 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)
+ return g_steal_pointer (&app);
+
+ /* 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);
+ gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 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);
+ return g_steal_pointer (&app);
+}
+
+static GsApp *
+app_from_single_pkg_variant (GsPlugin *plugin, GVariant *variant, gboolean addition)
+{
+ 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)
+ return g_steal_pointer (&app);
+
+ /* 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);
+ gs_app_set_size_download (app, GS_SIZE_TYPE_VALID, 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);
+ return g_steal_pointer (&app);
+}
+
+static GVariant *
+make_rpmostree_options_variant (gboolean reboot,
+ gboolean allow_downgrade,
+ gboolean cache_only,
+ gboolean download_only,
+ gboolean skip_purge,
+ gboolean no_pull_base,
+ gboolean dry_run,
+ gboolean no_overrides)
+{
+ GVariantDict dict;
+ g_variant_dict_init (&dict, NULL);
+ g_variant_dict_insert (&dict, "reboot", "b", reboot);
+ g_variant_dict_insert (&dict, "allow-downgrade", "b", allow_downgrade);
+ g_variant_dict_insert (&dict, "cache-only", "b", cache_only);
+ g_variant_dict_insert (&dict, "download-only", "b", download_only);
+ g_variant_dict_insert (&dict, "skip-purge", "b", skip_purge);
+ g_variant_dict_insert (&dict, "no-pull-base", "b", no_pull_base);
+ g_variant_dict_insert (&dict, "dry-run", "b", dry_run);
+ g_variant_dict_insert (&dict, "no-overrides", "b", no_overrides);
+ 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,
+ 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,
+ fd_list,
+ out_transaction_address,
+ NULL,
+ cancellable,
+ error);
+}
+
+#define RPMOSTREE_CORE_CACHEDIR "/var/cache/rpm-ostree/"
+#define RPMOSTREE_DIR_CACHE_REPOMD "repomd"
+#define RPMOSTREE_DIR_CACHE_SOLV "solv"
+
+static DnfContext *
+gs_rpmostree_create_bare_dnf_context (GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(DnfContext) context = dnf_context_new ();
+
+ dnf_context_set_repo_dir (context, "/etc/yum.repos.d");
+ dnf_context_set_cache_dir (context, RPMOSTREE_CORE_CACHEDIR RPMOSTREE_DIR_CACHE_REPOMD);
+ dnf_context_set_solv_dir (context, RPMOSTREE_CORE_CACHEDIR RPMOSTREE_DIR_CACHE_SOLV);
+ dnf_context_set_cache_age (context, G_MAXUINT);
+ dnf_context_set_enable_filelists (context, FALSE);
+
+ if (!dnf_context_setup (context, cancellable, error)) {
+ gs_rpmostree_error_convert (error);
+ return NULL;
+ }
+
+ return g_steal_pointer (&context);
+}
+
+static gboolean
+gs_rpmostree_ref_dnf_context_locked (GsPluginRpmOstree *self,
+ GsRPMOSTreeOS **out_os_proxy,
+ GsRPMOSTreeSysroot **out_sysroot_proxy,
+ DnfContext **out_dnf_context,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(DnfContext) context = NULL;
+ g_autoptr(DnfState) state = NULL;
+ g_autoptr(GsRPMOSTreeOS) os_proxy = NULL;
+ g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL;
+
+ if (!gs_rpmostree_ref_proxies_locked (self, &os_proxy, &sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ if (self->dnf_context != NULL) {
+ if (out_os_proxy)
+ *out_os_proxy = g_steal_pointer (&os_proxy);
+ if (out_sysroot_proxy)
+ *out_sysroot_proxy = g_steal_pointer (&sysroot_proxy);
+ if (out_dnf_context)
+ *out_dnf_context = g_object_ref (self->dnf_context);
+ return TRUE;
+ }
+
+ context = gs_rpmostree_create_bare_dnf_context (cancellable, error);
+ if (!context)
+ return FALSE;
+
+ state = dnf_state_new ();
+
+ if (!dnf_context_setup_sack_with_flags (context, state, DNF_CONTEXT_SETUP_SACK_FLAG_SKIP_RPMDB, error)) {
+ gs_rpmostree_error_convert (error);
+ return FALSE;
+ }
+
+ g_set_object (&self->dnf_context, context);
+
+ if (out_os_proxy)
+ *out_os_proxy = g_steal_pointer (&os_proxy);
+ if (out_sysroot_proxy)
+ *out_sysroot_proxy = g_steal_pointer (&sysroot_proxy);
+ if (out_dnf_context)
+ *out_dnf_context = g_object_ref (self->dnf_context);
+
+ return TRUE;
+}
+
+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;
+
+ assert_in_worker (self);
+
+ {
+ 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,
+ &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,
+ cancellable,
+ error)) {
+ gs_rpmostree_error_convert (error);
+ return FALSE;
+ }
+ }
+
+ if (data->cache_age_secs == G_MAXUINT64)
+ return TRUE;
+
+ {
+ g_autofree gchar *transaction_address = NULL;
+ g_autoptr(GsApp) progress_app = gs_app_new (gs_plugin_get_name (plugin));
+ g_autoptr(GVariant) options = NULL;
+ 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);
+
+ options = make_rpmostree_options_variant (FALSE, /* reboot */
+ FALSE, /* allow-downgrade */
+ FALSE, /* cache-only */
+ TRUE, /* download-only */
+ FALSE, /* skip-purge */
+ FALSE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+ done = FALSE;
+ while (!done) {
+ done = TRUE;
+ if (!gs_rpmostree_os_call_upgrade_sync (os_proxy,
+ options,
+ 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;
+ }
+ 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,
+ cancellable,
+ error)) {
+ gs_rpmostree_error_convert (error);
+ return FALSE;
+ }
+ }
+
+ {
+ 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,
+ 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,
+ 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;
+ g_autoptr(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ if (!gs_rpmostree_ref_proxies (self, &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);
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin);
+ g_autoptr(GVariant) cached_update = NULL;
+ g_autoptr(GVariant) rpm_diff = NULL;
+ g_autoptr(GsRPMOSTreeOS) os_proxy = NULL;
+ g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL;
+ g_autoptr(GError) local_error = NULL;
+ const gchar *checksum = NULL;
+ const gchar *version = NULL;
+ g_auto(GVariantDict) cached_update_dict;
+
+ if (!gs_rpmostree_ref_proxies (self, &os_proxy, &sysroot_proxy, cancellable, &local_error)) {
+ g_debug ("Failed to ref proxies to get updates: %s", local_error->message);
+ return TRUE;
+ }
+
+ /* ensure D-Bus properties are updated before reading them */
+ if (!gs_rpmostree_sysroot_call_reload_sync (sysroot_proxy, cancellable, &local_error)) {
+ g_debug ("Failed to call reload to get updates: %s", local_error->message);
+ return TRUE;
+ }
+
+ 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 TRUE;
+ if (!g_variant_dict_lookup (&cached_update_dict, "version", "&s", &version))
+ return TRUE;
+
+ g_debug ("got CachedUpdate version '%s', checksum '%s'", version, checksum);
+
+ rpm_diff = g_variant_dict_lookup_value (&cached_update_dict, "rpm-diff", G_VARIANT_TYPE ("a{sv}"));
+ if (rpm_diff != NULL) {
+ 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 FALSE;
+ }
+ 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 FALSE;
+ }
+ 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 FALSE;
+ }
+ 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 FALSE;
+ }
+
+ /* 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);
+ 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);
+ 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);
+ 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);
+ if (app != NULL)
+ gs_app_list_add (list, app);
+ g_variant_unref (child);
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+trigger_rpmostree_update (GsPluginRpmOstree *self,
+ GsApp *app,
+ GsRPMOSTreeOS *os_proxy,
+ GsRPMOSTreeSysroot *sysroot_proxy,
+ 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 (FALSE, /* reboot */
+ FALSE, /* allow-downgrade */
+ TRUE, /* cache-only */
+ FALSE, /* download-only */
+ FALSE, /* skip-purge */
+ FALSE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+ done = FALSE;
+ while (!done) {
+ done = TRUE;
+ if (!gs_rpmostree_os_call_upgrade_sync (os_proxy,
+ options,
+ 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,
+ cancellable,
+ error)) {
+ gs_rpmostree_error_convert (error);
+ return FALSE;
+ }
+
+ self->update_triggered = TRUE;
+
+ /* success */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update_app (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin);
+ GsAppList *related = gs_app_get_related (app);
+ g_autoptr(GsRPMOSTreeOS) os_proxy = NULL;
+ g_autoptr(GsRPMOSTreeSysroot) sysroot_proxy = NULL;
+
+ if (!gs_rpmostree_ref_proxies (self, &os_proxy, &sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ /* we don't currently don't put all updates in the OsUpdate proxy app */
+ if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY))
+ return trigger_rpmostree_update (self, app, os_proxy, sysroot_proxy, cancellable, error);
+
+ /* try to trigger each related app */
+ for (guint i = 0; i < gs_app_list_length (related); i++) {
+ GsApp *app_tmp = gs_app_list_index (related, i);
+ if (!trigger_rpmostree_update (self, app_tmp, os_proxy, sysroot_proxy, cancellable, error))
+ return FALSE;
+ }
+
+ /* success */
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_upgrade_trigger (GsPlugin *plugin,
+ GsApp *app,
+ 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, &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));
+
+ /* trigger the upgrade */
+ options = make_rpmostree_options_variant (FALSE, /* reboot */
+ TRUE, /* allow-downgrade */
+ TRUE, /* cache-only */
+ FALSE, /* download-only */
+ FALSE, /* skip-purge */
+ FALSE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+
+ done = FALSE;
+ while (!done) {
+ done = TRUE;
+ if (!gs_rpmostree_os_call_rebase_sync (os_proxy,
+ options,
+ new_refspec,
+ packages,
+ 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,
+ 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 {
+ return FALSE;
+ }
+ }
+
+ /* success */
+ return TRUE;
+}
+
+static gboolean
+gs_rpmostree_repo_enable (GsPlugin *plugin,
+ GsApp *app,
+ gboolean enable,
+ GsRPMOSTreeOS *os_proxy,
+ GsRPMOSTreeSysroot *sysroot_proxy,
+ 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),
+ &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,
+ 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;
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin);
+ 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(GMutexLocker) locker = NULL;
+ 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;
+
+ /* enable repo, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ if (!gs_rpmostree_ref_proxies (self, &os_proxy, &sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ 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_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "no source set");
+ return FALSE;
+ }
+
+ install_package = gs_app_get_source_default (app);
+ break;
+ case GS_APP_STATE_AVAILABLE_LOCAL:
+ if (gs_app_get_local_file (app) == NULL) {
+ g_set_error_literal (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "local package, but no filename");
+ return FALSE;
+ }
+
+ local_filename = g_file_get_path (gs_app_get_local_file (app));
+ break;
+ default:
+ g_set_error (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)));
+ return FALSE;
+ }
+
+ if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ tp->app = g_object_ref (app);
+
+ options = make_rpmostree_options_variant (FALSE, /* reboot */
+ FALSE, /* allow-downgrade */
+ FALSE, /* cache-only */
+ FALSE, /* download-only */
+ FALSE, /* skip-purge */
+ TRUE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+
+ done = FALSE;
+ while (!done) {
+ done = TRUE;
+ if (!rpmostree_update_deployment (os_proxy,
+ install_package,
+ NULL /* remove package */,
+ local_filename,
+ options,
+ &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);
+ 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,
+ cancellable,
+ error)) {
+ gs_rpmostree_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ /* 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);
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginRpmOstree *self = GS_PLUGIN_RPM_OSTREE (plugin);
+ 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;
+
+ if (!gs_rpmostree_ref_proxies (self, &os_proxy, &sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ /* disable repo, handled by dedicated function */
+ g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
+
+ if (!gs_rpmostree_wait_for_ongoing_transaction_end (sysroot_proxy, cancellable, error))
+ return FALSE;
+
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ tp->app = g_object_ref (app);
+
+ options = make_rpmostree_options_variant (FALSE, /* reboot */
+ FALSE, /* allow-downgrade */
+ TRUE, /* cache-only */
+ FALSE, /* download-only */
+ FALSE, /* skip-purge */
+ TRUE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+
+ 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,
+ &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);
+ 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,
+ cancellable,
+ error)) {
+ gs_rpmostree_error_convert (error);
+ gs_app_set_state_recover (app);
+ return FALSE;
+ }
+
+ 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);
+ }
+
+ return TRUE;
+}
+
+static DnfPackage *
+find_package_by_name (DnfSack *sack,
+ const char *pkgname)
+{
+ g_autoptr(GPtrArray) pkgs = NULL;
+ hy_autoquery HyQuery query = hy_query_create (sack);
+
+ hy_query_filter (query, HY_PKG_NAME, HY_EQ, pkgname);
+ hy_query_filter_latest_per_arch (query, TRUE);
+
+ pkgs = hy_query_run (query);
+ if (pkgs->len == 0)
+ return NULL;
+
+ return g_object_ref (pkgs->pdata[pkgs->len-1]);
+}
+
+static GPtrArray *
+find_packages_by_provides (DnfSack *sack,
+ gchar **search)
+{
+ g_autoptr(GPtrArray) pkgs = NULL;
+ hy_autoquery HyQuery query = hy_query_create (sack);
+
+ hy_query_filter_provides_in (query, search);
+ hy_query_filter_latest_per_arch (query, TRUE);
+
+ pkgs = hy_query_run (query);
+
+ return g_steal_pointer (&pkgs);
+}
+
+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));
+ 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_available_packages_app (GsPlugin *plugin,
+ DnfSack *sack,
+ GsApp *app)
+{
+ g_autoptr(DnfPackage) pkg = NULL;
+
+ pkg = find_package_by_name (sack, gs_app_get_source_default (app));
+ if (pkg != NULL) {
+ gs_app_set_version (app, dnf_package_get_evr (pkg));
+ if (gs_app_get_state (app) == GS_APP_STATE_UNKNOWN)
+ gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
+
+ /* 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) {
+ const gchar *reponame = dnf_package_get_reponame (pkg);
+ 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, dnf_package_get_name (pkg));
+ gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, dnf_package_get_summary (pkg));
+
+ /* 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;
+ }
+ }
+
+ return TRUE /* found */;
+ }
+
+ return FALSE /* not found */;
+}
+
+static gboolean
+resolve_appstream_source_file_to_package_name (GsPlugin *plugin,
+ GsApp *app,
+ GsPluginRefineFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ Header h;
+ const gchar *fn;
+ gint rc;
+ g_auto(rpmdbMatchIterator) mi = NULL;
+ g_auto(rpmts) ts = NULL;
+
+ /* open db readonly */
+ ts = rpmtsCreate();
+ rpmtsSetRootDir (ts, NULL);
+ rc = rpmtsOpenDB (ts, O_RDONLY);
+ if (rc != 0) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_NOT_SUPPORTED,
+ "Failed to open rpmdb: %i", rc);
+ return FALSE;
+ }
+
+ /* look for a specific file */
+ fn = gs_app_get_metadata_item (app, "appstream::source-file");
+ if (fn == NULL)
+ return TRUE;
+
+ mi = rpmtsInitIterator (ts, 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) {
+ g_debug ("rpm: setting source to %s", name);
+ gs_app_add_source (app, name);
+ 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(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(DnfContext) dnf_context = NULL;
+ g_autoptr(OstreeRepo) ot_repo = NULL;
+ g_auto(GStrv) layered_packages_strv = NULL;
+ g_auto(GStrv) layered_local_packages_strv = NULL;
+ g_autofree gchar *checksum = NULL;
+
+ locker = g_mutex_locker_new (&self->mutex);
+
+ if (!gs_rpmostree_ref_dnf_context_locked (self, &os_proxy, &sysroot_proxy, &dnf_context, cancellable, error))
+ return FALSE;
+
+ ot_repo = g_object_ref (self->ot_repo);
+
+ if (!dnf_context)
+ return FALSE;
+
+ 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, 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]);
+ }
+
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, i);
+ gboolean found;
+
+ 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, cancellable, error))
+ return FALSE;
+ }
+ if (!gs_app_has_management_plugin (app, plugin))
+ continue;
+ if (gs_app_get_source_default (app) == NULL)
+ continue;
+
+ /* first try to resolve from installed packages */
+ found = resolve_installed_packages_app (plugin, packages, layered_packages, layered_local_packages, app);
+
+ /* if we didn't find anything, try resolving from available packages */
+ if (!found && dnf_context != NULL)
+ found = resolve_available_packages_app (plugin, dnf_context_get_sack (dnf_context), app);
+
+ /* if we still didn't find anything then it's likely a package
+ * that is still in appstream data, but removed from the repos */
+ if (!found)
+ g_debug ("failed to resolve %s", gs_app_get_unique_id (app));
+ }
+
+ 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);
+}
+
+gboolean
+gs_plugin_app_upgrade_download (GsPlugin *plugin,
+ GsApp *app,
+ 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, &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 (FALSE, /* reboot */
+ TRUE, /* allow-downgrade */
+ FALSE, /* cache-only */
+ TRUE, /* download-only */
+ FALSE, /* skip-purge */
+ FALSE, /* no-pull-base */
+ FALSE, /* dry-run */
+ FALSE); /* no-overrides */
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+ 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,
+ 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,
+ 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 gboolean
+plugin_rpmostree_pick_rpm_desktop_file_cb (GsPlugin *plugin,
+ GsApp *app,
+ const gchar *filename,
+ GKeyFile *key_file)
+{
+ 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);
+}
+
+gboolean
+gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ /* only process this app if was created by this plugin */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ return gs_plugin_app_launch_filtered (plugin, app, plugin_rpmostree_pick_rpm_desktop_file_cb, NULL, 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);
+}
+
+gboolean
+gs_plugin_file_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ GFile *file,
+ 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);
+ 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);
+ }
+ 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 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 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 = gs_app_list_new ();
+ GsPluginListAppsData *data = task_data;
+ const gchar *provides_tag = NULL;
+ GsAppQueryProvidesType provides_type = GS_APP_QUERY_PROVIDES_UNKNOWN;
+ g_autoptr(GError) local_error = NULL;
+ g_autoptr(GMutexLocker) locker = NULL;
+ g_autoptr(GPtrArray) pkglist = NULL;
+ g_autoptr(DnfContext) dnf_context = NULL;
+ g_auto(GStrv) provides = NULL;
+
+ assert_in_worker (self);
+
+ if (data->query != NULL) {
+ provides_type = gs_app_query_get_provides (data->query, &provides_tag);
+ }
+
+ /* Currently only support a subset of query properties, and only one set at once. */
+ if (provides_tag == NULL ||
+ 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;
+ }
+
+ /* Prepare a dnf context */
+ locker = g_mutex_locker_new (&self->mutex);
+
+ if (!gs_rpmostree_ref_dnf_context_locked (self, NULL, NULL, &dnf_context, cancellable, &local_error)) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
+ return;
+ }
+
+ g_clear_pointer (&locker, g_mutex_locker_free);
+
+ provides = what_provides_decompose (provides_type, provides_tag);
+ pkglist = find_packages_by_provides (dnf_context_get_sack (dnf_context), provides);
+ for (guint i = 0; i < pkglist->len; i++) {
+ DnfPackage *pkg = g_ptr_array_index (pkglist, i);
+ g_autoptr(GsApp) app = NULL;
+
+ app = gs_plugin_cache_lookup (GS_PLUGIN (self), dnf_package_get_nevra (pkg));
+ 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, dnf_package_get_name (pkg));
+
+ gs_plugin_cache_add (GS_PLUGIN (self), dnf_package_get_nevra (pkg), app);
+ gs_app_list_add (list, app);
+ }
+
+ g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref);
+}
+
+static GsAppList *
+gs_plugin_rpm_ostree_list_apps_finish (GsPlugin *plugin,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (result), error);
+}
+
+gboolean
+gs_plugin_add_sources (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(DnfContext) dnf_context = NULL;
+ GPtrArray *repos;
+
+ dnf_context = gs_rpmostree_create_bare_dnf_context (cancellable, error);
+ if (!dnf_context)
+ return FALSE;
+
+ repos = dnf_context_get_repos (dnf_context);
+ if (repos == NULL)
+ return TRUE;
+
+ for (guint i = 0; i < repos->len; i++) {
+ DnfRepo *repo = g_ptr_array_index (repos, i);
+ g_autofree gchar *description = NULL;
+ g_autoptr(GsApp) app = NULL;
+ gboolean enabled;
+
+ /* hide these from the user */
+ if (dnf_repo_is_devel (repo) || dnf_repo_is_source (repo))
+ continue;
+
+ app = gs_app_new (dnf_repo_get_id (repo));
+ 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);
+
+ enabled = (dnf_repo_get_enabled (repo) & DNF_REPO_ENABLED_PACKAGES) > 0;
+ gs_app_set_state (app, enabled ? GS_APP_STATE_INSTALLED : GS_APP_STATE_AVAILABLE);
+
+ description = dnf_repo_get_description (repo);
+ gs_app_set_name (app, GS_APP_QUALITY_LOWEST, description);
+ gs_app_set_summary (app, GS_APP_QUALITY_LOWEST, description);
+
+ gs_app_set_metadata (app, "GnomeSoftware::SortKey", "200");
+ gs_app_set_origin_ui (app, _("Operating System (OSTree)"));
+
+ gs_app_list_add (list, app);
+ }
+
+ return TRUE;
+}
+
+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, &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, 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;
+ g_autoptr(GError) local_error = NULL;
+
+ assert_in_worker (self);
+
+ if (!gs_rpmostree_ref_proxies (self, &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, 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 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;
+}
+
+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..ab322b7
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..724556e
--- /dev/null
+++ b/plugins/rpm-ostree/meson.build
@@ -0,0 +1,23 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginRpmOstree"']
+
+rpmostree_generated = gnome.gdbus_codegen(
+ 'gs-rpmostree-generated',
+ 'org.projectatomic.rpmostree1.xml',
+ interface_prefix : 'org.projectatomic.rpmostree1',
+ namespace : 'GsRPMOSTree'
+)
+
+shared_module(
+ 'gs_plugin_rpm-ostree',
+ rpmostree_generated,
+ sources : 'gs-plugin-rpm-ostree.c',
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ install : true,
+ install_dir: plugin_dir,
+ install_rpath: join_paths(rpm_ostree.get_variable('libdir'), 'rpm-ostree'),
+ c_args : cargs,
+ dependencies : [ plugin_libs, libdnf, 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..6ae04a4
--- /dev/null
+++ b/plugins/rpm-ostree/org.projectatomic.rpmostree1.xml
@@ -0,0 +1,458 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+
+ <!-- Deployment dictionary keys:
+ 'id' (type 's')
+ 'osname' (type 's')
+ 'serial' (type 'i')
+ 'checksum' (type 's')
+ 'version' (type 's')
+ 'timestamp' (type 't')
+ 'origin' (type 's')
+ 'signatures' (type 'av')
+ 'packages' (type 'as')
+ 'booted' (type 'b')
+ -->
+
+ <interface name="org.projectatomic.rpmostree1.Sysroot">
+ <!-- The booted OSName -->
+ <property name="Booted" type="o" access="read"/>
+
+ <!-- The system root path -->
+ <property name="Path" type="s" access="read"/>
+
+ <!-- The values are (method-name, sender-name, object path) -->
+ <property name="ActiveTransaction" type="(sss)" access="read"/>
+ <!-- A DBus address - connect to it to access its methods -->
+ <property name="ActiveTransactionPath" type="s" access="read"/>
+
+ <!-- (Currently) optional method to denote the client plans
+ to either invoke methods on the daemon, or monitor status.
+ If no clients are registered, the daemon may exit.
+
+ 'id (type 's') - Package/component name (e.g. `cockpit`, `gnome-software`)
+ -->
+ <method name="RegisterClient">
+ <arg type="a{sv}" name="options" direction="in"/>
+ </method>
+
+ <!-- You must call this if your process is no longer interested in talking to
+ rpm-ostree, but will remain connected to the bus.
+
+ No options are currently defined.
+ -->
+ <method name="UnregisterClient">
+ <arg type="a{sv}" name="options" direction="in"/>
+ </method>
+
+ <!-- Reload sysroot if changed. This can also be used as a way to sync with the daemon
+ to ensure e.g. D-Bus properties are updated before reading them. -->
+ <method name="Reload">
+ </method>
+
+ <!-- Like Reload, but also reload configuration files. -->
+ <method name="ReloadConfig">
+ </method>
+
+ <!-- none, check, stage -->
+ <property name="AutomaticUpdatePolicy" type="s" access="read"/>
+
+ <method name="CreateOSName">
+ <arg type="s" name="name"/>
+ <arg type="o" name="result" direction="out"/>
+ </method>
+
+ <method name="GetOS">
+ <arg name="name" type="s"/>
+ <arg name="object_path" type="o" direction="out"/>
+ </method>
+
+ <!-- Array of all deployments in boot order -->
+ <property name="Deployments" type="aa{sv}" access="read"/>
+ </interface>
+
+ <interface name="org.projectatomic.rpmostree1.OS">
+ <property name="BootedDeployment" type="a{sv}" access="read"/>
+ <property name="DefaultDeployment" type="a{sv}" access="read"/>
+ <property name="RollbackDeployment" type="a{sv}" access="read"/>
+
+ <!-- CachedUpdate dictionary keys:
+ 'osname' (type 's')
+ 'checksum' (type 's')
+ 'version' (type 's')
+ 'timestamp' (type 't')
+ 'origin' (type 's')
+ 'signatures' (type 'av')
+ 'gpg-enabled' (type 'b')
+ 'ref-has-new-commit' (type 'b')
+ TRUE if 'checksum' refers to a new base commit we're not booted in.
+ 'rpm-diff' (type 'a{sv}')
+ 'upgraded' (type 'a(us(ss)(ss))')
+ 'downgraded' (type 'a(us(ss)(ss))')
+ 'removed' (type 'a(usss)')
+ 'added' (type 'a(usss)')
+ 'advisories' (type 'a(suuasa{sv})')
+ -->
+ <property name="CachedUpdate" type="a{sv}" access="read"/>
+ <property name="HasCachedUpdateRpmDiff" type="b" access="read"/>
+
+ <!-- Available options:
+ "mode" (type 's')
+ One of auto, none, check. Defaults to auto, which follows configured
+ policy (available in AutomaticUpdatePolicy property).
+ "output-to-self" (type 'b')
+ Whether output should go to the daemon itself rather than the
+ transaction. Defaults to TRUE.
+
+ If automatic updates are not enabled, @enabled will be FALSE and
+ @transaction_address will be the empty string.
+ -->
+ <method name="AutomaticUpdateTrigger">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="b" name="enabled" direction="out"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <property name="Name" type="s" access="read"/>
+
+ <method name="GetDeploymentsRpmDiff">
+ <arg type="s" name="deployid0"/>
+ <arg type="s" name="deployid1"/>
+ <arg type="a(sua{sv})" name="result" direction="out"/>
+ </method>
+
+ <!-- Revision may be a full checksum or version string.
+
+ Available options:
+ "reboot" (type 'b')
+ -->
+ <method name="Deploy">
+ <arg type="s" name="revision" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+ </method>
+
+ <!-- details dictionary keys:
+ 'osname' (type 's')
+ 'checksum' (type 's')
+ 'version' (type 's')
+ 'timestamp' (type 't')
+ 'origin' (type 's')
+ 'signatures' (type 'av')
+ -->
+ <method name="GetCachedDeployRpmDiff">
+ <arg type="s" name="revision"/>
+ <arg type="as" name="packages"/>
+ <arg type="a(sua{sv})" name="result" direction="out"/>
+ <arg type="a{sv}" name="details" direction="out"/>
+ </method>
+
+ <method name="DownloadDeployRpmDiff">
+ <arg type="s" name="revision"/>
+ <arg type="as" name="packages"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "allow-downgrade" (type 'b')
+ "reboot" (type 'b')
+ -->
+ <method name="Upgrade">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+ </method>
+
+ <!-- details dictionary keys:
+ 'osname' (type 's')
+ 'checksum' (type 's')
+ 'version' (type 's')
+ 'timestamp' (type 't')
+ 'origin' (type 's')
+ 'signatures' (type 'av')
+ -->
+ <method name="GetCachedUpdateRpmDiff">
+ <arg type="s" name="deployid"/>
+ <arg type="a(sua{sv})" name="result" direction="out"/>
+ <arg type="a{sv}" name="details" direction="out"/>
+ </method>
+
+ <method name="DownloadUpdateRpmDiff">
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "reboot" (type 'b')
+ -->
+ <method name="Rollback">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "reboot" (type 'b')
+ -->
+ <method name="ClearRollbackTarget">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "skip-purge" (type 'b')
+ "reboot" (type 'b')
+ "revision" (type 's')
+ -->
+ <method name="Rebase">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="refspec"/>
+ <arg type="as" name="packages"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+ </method>
+
+ <!-- details dictionary keys:
+ 'osname' (type 's')
+ 'checksum' (type 's')
+ 'version' (type 's')
+ 'timestamp' (type 't')
+ 'origin' (type 's')
+ 'signatures' (type 'av')
+ -->
+ <method name="GetCachedRebaseRpmDiff">
+ <arg type="s" name="refspec"/>
+ <arg type="as" name="packages"/>
+ <arg type="a(sua{sv})" name="result" direction="out"/>
+ <arg type="a{sv}" name="details" direction="out"/>
+ </method>
+
+ <method name="DownloadRebaseRpmDiff">
+ <arg type="s" name="refspec"/>
+ <arg type="as" name="packages"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "reboot" (type 'b')
+ "dry-run" (type 'b')
+ -->
+ <method name="PkgChange">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="as" name="packages_added"/>
+ <arg type="as" name="packages_removed"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+ </method>
+
+ <method name="SetInitramfsState">
+ <arg type="b" name="regenerate" direction="in"/>
+ <arg type="as" name="args" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available options:
+ "reboot" (type 'b')
+ -->
+ <method name="KernelArgs">
+ <arg type="s" name="existing_kernel_arg_string"/>
+ <arg type="as" name="kernel_args_added" direction="in"/>
+ <arg type="as" name="kernel_args_replaced" direction="in"/>
+ <arg type="as" name="kernel_args_removed" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <method name="GetDeploymentBootConfig">
+ <arg type="s" name="deployid" />
+ <arg type="b" name="is_pending" direction="in"/>
+ <arg type="a{sv}" name="bootconfig" direction="out"/>
+ </method>
+
+ <method name="Cleanup">
+ <arg type="as" name="elements" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <method name="RefreshMd">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Set options in yum .repo files -->
+ <method name="ModifyYumRepo">
+ <arg type="s" name="repo_id" direction="in"/>
+ <arg type="a{ss}" name="settings" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ <!-- Available modifiers:
+ "set-refspec" (type 's')
+ "set-revision" (type 's')
+ "install-packages" (type 'as')
+ "uninstall-packages" (type 'as')
+ "install-local-packages" (type 'ah')
+ "override-remove-packages" (type 'as')
+ "override-reset-packages" (type 'as')
+ "override-replace-packages" (type 'as')
+ "override-replace-local-packages" (type 'ah')
+ "custom-origin" (type '(ss)')
+
+ Available options:
+ "reboot" (type 'b')
+ Initiate a reboot after transaction.
+ "allow-downgrade" (type 'b')
+ Allow newly pulled bases to have older timestamps than the
+ current base. Defaults to TRUE if either "set-refspec" or
+ "set-revision" is specified.
+ "skip-purge" (type 'b')
+ Do not purge the old refspec. Only valid if "set-refspec" is
+ specified.
+ "no-pull-base" (type 'b')
+ Do not pull a base layer from the remote. Not valid if
+ either "set-refspec" or "set-revision" is specified.
+ "dry-run" (type 'b')
+ Stop short of deploying the new tree. If layering packages,
+ the pkg diff is printed but packages are not downloaded or
+ imported.
+ "no-layering" (type 'b')
+ Remove all package requests. Requests in "install-packages"
+ are still subsequently processed if specified.
+ "no-overrides" (type 'b')
+ Remove all active overrides. Not valid if any override
+ modifiers are specified.
+ "no-initramfs" (type 'b')
+ Disable any initramfs regeneration.
+ "cache-only" (type 'b')
+ Do not update rpmmd repo metadata cache or ostree refspec.
+ Not valid if "download-only" is specified.
+ "download-only" (type 'b')
+ Update rpmmd repo metadata cache and ostree refspec. Do not
+ perform any deployments. This is like "dry-run" except that
+ the latter does not download and import packages. Not valid
+ if "cache-only" or "dry-run" is specified.
+ "allow-inactive-requests" (type 'b')
+ When installing packages, allow package requests which would
+ not immediately be active.
+ "idempotent-layering" (type 'b')
+ Don't error out on requests in install-* or uninstall-*
+ modifiers that are already satisfied.
+ -->
+ <method name="UpdateDeployment">
+ <arg type="a{sv}" name="modifiers" direction="in"/>
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+ </method>
+
+ </interface>
+
+ <interface name="org.projectatomic.rpmostree1.OSExperimental">
+
+ <!-- Just a test method -->
+ <method name="Moo">
+ <arg type="b" name="utf8" direction="in"/>
+ <arg type="s" name="result" direction="out"/>
+ </method>
+
+ <method name="LiveFs">
+ <arg type="a{sv}" name="options" direction="in"/>
+ <arg type="s" name="transaction_address" direction="out"/>
+ </method>
+
+ </interface>
+
+ <interface name="org.projectatomic.rpmostree1.Transaction">
+
+ <!-- A single-line human-readable string -->
+ <property name="Title" type="s" access="read"/>
+
+ <!-- Yes, we can. -->
+ <method name="Cancel"/>
+
+ <!-- For a client to call when ready to receive signals.
+ The return boolean indicates whether the transaction was
+ started by this method call (true) or was already started
+ by another client (false). -->
+ <method name="Start">
+ <arg type="b" name="started" direction="out"/>
+ </method>
+
+ <signal name="Finished">
+ <arg name="success" type="b" direction="out"/>
+ <arg name="error_message" type="s" direction="out"/>
+ </signal>
+
+ <!-- For miscellaneous messages; line-buffered. -->
+ <signal name="Message">
+ <arg name="text" type="s" direction="out"/>
+ </signal>
+
+ <!-- Tasks are notifications that work is being done. -->
+ <signal name="TaskBegin">
+ <arg name="text" type="s" direction="out"/>
+ </signal>
+
+ <signal name="TaskEnd">
+ <arg name="text" type="s" direction="out"/>
+ </signal>
+
+ <!-- Generic percentage progress. -->
+ <signal name="PercentProgress">
+ <arg name="text" type="s" direction="out"/>
+ <arg name="percentage" type="u" direction="out"/>
+ </signal>
+
+ <signal name="DownloadProgress">
+ <!-- time data, format is:
+ start time, elapsed seconds
+ -->
+ <arg name="time" type="(tt)" direction="out"/>
+
+ <!--
+ outstanding data counts, format is:
+ (outstanding fetches, outstanding writes)
+ -->
+ <arg name="outstanding" type="(uu)" direction="out"/>
+
+ <!--
+ metadata counts, format is:
+ (scanned, fetched, outstanding)
+ -->
+ <arg name="metadata" type="(uuu)" direction="out"/>
+
+ <!--
+ delta data, format is:
+ (total parts, fetched parts, total super blocks, total size)
+ -->
+ <arg name="delta" type="(uuut)" direction="out"/>
+
+ <!--
+ content data, format is:
+ (fetched, requested)
+ -->
+ <arg name="content" type="(uu)" direction="out"/>
+
+ <!--
+ transfer data, format is:
+ (bytes transfered, bytes/s)
+ -->
+ <arg name="transfer" type="(tt)" direction="out"/>
+ </signal>
+
+ <signal name="SignatureProgress">
+ <!-- An ostree GVariant containing signature data
+ see ostree_gpg_verify_result_get_all.
+ -->
+ <arg name="signature" type="av" direction="out"/>
+ <!-- The signed commit -->
+ <arg name="commit" type="s" direction="out"/>
+ </signal>
+
+ <!-- Indicates progress signals are done and subsequent
+ Message signals should be output on separate lines. -->
+ <signal name="ProgressEnd"/>
+ </interface>
+</node>
diff --git a/plugins/snap/gs-plugin-snap.c b/plugins/snap/gs-plugin-snap.c
new file mode 100644
index 0000000..460641c
--- /dev/null
+++ b/plugins/snap/gs-plugin-snap.c
@@ -0,0 +1,1924 @@
+/* -*- 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+
+ */
+
+#include <config.h>
+
+#include <gio/gdesktopappinfo.h>
+#include <glib/gi18n.h>
+#include <json-glib/json-glib.h>
+#include <snapd-glib/snapd-glib.h>
+#include <gnome-software.h>
+
+#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 *section,
+ const gchar *query,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GPtrArray) snaps = NULL;
+
+ snaps = snapd_client_find_section_sync (client, flags, section, 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", "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);
+}
+
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ g_autoptr(SnapdClient) client = NULL;
+ g_autofree gchar *scheme = NULL;
+ g_autofree gchar *path = NULL;
+ g_autoptr(GPtrArray) snaps = NULL;
+ g_autoptr(GsApp) app = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* not us */
+ scheme = gs_utils_get_url_scheme (url);
+ if (g_strcmp0 (scheme, "snap") != 0 &&
+ g_strcmp0 (scheme, "appstream") != 0)
+ return TRUE;
+
+ /* Create client. */
+ client = get_client (self, interactive, error);
+ if (client == NULL)
+ return FALSE;
+
+ /* create app */
+ path = gs_utils_get_url_path (url);
+ snaps = find_snaps (self, client,
+ SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_NAME,
+ NULL, path, cancellable, NULL);
+ if (snaps == NULL || snaps->len < 1) {
+ g_clear_pointer (&snaps, g_ptr_array_unref);
+ /* This works for the appstream:// URL-s */
+ snaps = find_snaps (self, client,
+ SNAPD_FIND_FLAGS_SCOPE_WIDE | SNAPD_FIND_FLAGS_MATCH_COMMON_ID,
+ NULL, path, cancellable, NULL);
+ }
+ if (snaps == NULL || snaps->len < 1)
+ return TRUE;
+
+ app = snap_to_app (self, g_ptr_array_index (snaps, 0), NULL);
+ gs_app_list_add (list, app);
+
+ return TRUE;
+}
+
+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 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;
+ 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);
+ }
+
+ /* 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_curated == GS_APP_QUERY_TRISTATE_FALSE ||
+ is_installed == 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;
+ }
+
+ /* 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_section_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_section_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_section_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_section_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_section_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));
+}
+
+/* @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_section_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_section_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;
+
+ 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, "<tt>");
+ serialize_nodes (children, text, indentation);
+ g_string_append (text, "</tt>");
+ return;
+
+ case SNAPD_MARKDOWN_NODE_TYPE_EMPHASIS:
+ g_string_append (text, "<i>");
+ serialize_nodes (children, text, indentation);
+ g_string_append (text, "</i>");
+ return;
+
+ case SNAPD_MARKDOWN_NODE_TYPE_STRONG_EMPHASIS:
+ g_string_append (text, "<b>");
+ serialize_nodes (children, text, indentation);
+ g_string_append (text, "</b>");
+ return;
+
+ case SNAPD_MARKDOWN_NODE_TYPE_URL:
+ url = g_string_new ("");
+ serialize_nodes (children, url, indentation);
+ g_string_append_printf (text, "<a href=\"%s\">%s</a>", 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(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)
+ 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 && gs_app_list_length (list) > 0) {
+ GsApp *app = gs_app_list_index (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));
+}
+
+gboolean
+gs_plugin_app_install (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ g_autoptr(SnapdClient) client = NULL;
+ const gchar *name, *channel;
+ SnapdInstallFlags flags = SNAPD_INSTALL_FLAGS_NONE;
+ gboolean result;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+ g_autoptr(GError) error_local = NULL;
+
+ /* We can only install apps we know of */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ client = get_client (self, interactive, error);
+ if (client == NULL)
+ return FALSE;
+
+ name = gs_app_get_metadata_item (app, "snap::name");
+ channel = gs_app_get_branch (app);
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+
+ if (g_strcmp0 (gs_app_get_metadata_item (app, "snap::confinement"), "classic") == 0)
+ flags |= SNAPD_INSTALL_FLAGS_CLASSIC;
+ result = snapd_client_install2_sync (client, flags, name, channel, NULL, progress_cb, app, cancellable, &error_local);
+
+ /* if already installed then just try to switch channel */
+ if (!result && g_error_matches (error_local, SNAPD_ERROR, SNAPD_ERROR_ALREADY_INSTALLED)) {
+ g_clear_error (&error_local);
+ result = snapd_client_refresh_sync (client, name, channel, progress_cb, app, cancellable, &error_local);
+ }
+
+ if (!result) {
+ gs_app_set_state_recover (app);
+ g_propagate_error (error, g_steal_pointer (&error_local));
+ snapd_error_convert (error);
+ return FALSE;
+ }
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+
+ return TRUE;
+}
+
+// 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 gboolean
+is_graphical (GsPluginSnap *self,
+ SnapdClient *client,
+ GsApp *app,
+ GCancellable *cancellable)
+{
+ g_autoptr(GPtrArray) plugs = NULL;
+ guint i;
+ g_autoptr(GError) error = NULL;
+
+ if (!snapd_client_get_connections2_sync (client,
+ SNAPD_GET_CONNECTIONS_FLAGS_SELECT_ALL, NULL, NULL,
+ NULL, NULL, &plugs, NULL,
+ cancellable, &error)) {
+ g_warning ("Failed to get connections: %s", error->message);
+ return FALSE;
+ }
+
+ for (i = 0; i < plugs->len; 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), gs_app_get_metadata_item (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)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+gboolean
+gs_plugin_launch (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ const gchar *launch_name;
+ const gchar *launch_desktop;
+ g_autoptr(GAppInfo) info = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* We can only launch apps we know of */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ 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)
+ return TRUE;
+
+ if (launch_desktop) {
+ info = (GAppInfo *)g_desktop_app_info_new_from_filename (launch_desktop);
+ } else {
+ g_autofree gchar *commandline = NULL;
+ g_autoptr(SnapdClient) client = NULL;
+ GAppInfoCreateFlags flags = G_APP_INFO_CREATE_NONE;
+
+ if (g_strcmp0 (launch_name, gs_app_get_metadata_item (app, "snap::name")) == 0)
+ commandline = g_strdup_printf ("snap run %s", launch_name);
+ else
+ commandline = g_strdup_printf ("snap run %s.%s", gs_app_get_metadata_item (app, "snap::name"), launch_name);
+
+ client = get_client (self, interactive, error);
+ if (client == NULL)
+ return FALSE;
+
+ if (!is_graphical (self, client, app, cancellable))
+ flags |= G_APP_INFO_CREATE_NEEDS_TERMINAL;
+ info = g_app_info_create_from_commandline (commandline, NULL, flags, error);
+ }
+
+ if (info == NULL)
+ return FALSE;
+
+ return g_app_info_launch (info, NULL, NULL, error);
+}
+
+gboolean
+gs_plugin_app_remove (GsPlugin *plugin,
+ GsApp *app,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ g_autoptr(SnapdClient) client = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ /* We can only remove apps we know of */
+ if (!gs_app_has_management_plugin (app, plugin))
+ return TRUE;
+
+ client = get_client (self, interactive, error);
+ if (client == NULL)
+ return FALSE;
+
+ gs_app_set_state (app, GS_APP_STATE_REMOVING);
+ if (!snapd_client_remove2_sync (client, SNAPD_REMOVE_FLAGS_NONE, gs_app_get_metadata_item (app, "snap::name"), progress_cb, app, cancellable, error)) {
+ gs_app_set_state_recover (app);
+ snapd_error_convert (error);
+ return FALSE;
+ }
+ gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
+ return TRUE;
+}
+
+gboolean
+gs_plugin_add_updates (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ g_autoptr(GPtrArray) apps = NULL;
+ g_autoptr(SnapdClient) client = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+ g_autoptr(GError) error_local = NULL;
+
+ client = get_client (self, interactive, &error_local);
+ if (client == NULL) {
+ g_debug ("Failed to get client to get updates: %s", error_local->message);
+ return TRUE;
+ }
+
+ /* Get the list of refreshable snaps */
+ apps = snapd_client_find_refreshable_sync (client, cancellable, &error_local);
+ if (apps == NULL) {
+ g_warning ("Failed to find refreshable snaps: %s", error_local->message);
+ return TRUE;
+ }
+
+ for (guint i = 0; i < apps->len; i++) {
+ SnapdSnap *snap = g_ptr_array_index (apps, i);
+ g_autoptr(GsApp) app = NULL;
+
+ /* Convert SnapdSnap to a GsApp */
+ 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);
+
+ /* Add GsApp to updatable GsAppList */
+ gs_app_list_add (list, app);
+ }
+
+ return TRUE;
+}
+
+gboolean
+gs_plugin_update (GsPlugin *plugin,
+ GsAppList *list,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsPluginSnap *self = GS_PLUGIN_SNAP (plugin);
+ g_autoptr(SnapdClient) client = NULL;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
+
+ client = get_client (self, interactive, error);
+ if (client == NULL)
+ return FALSE;
+
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ /* Get the name of the snap to refresh */
+ GsApp *app = gs_app_list_index (list, i);
+ const gchar *name = gs_app_get_metadata_item (app, "snap::name");
+
+ /* Refresh the snap */
+ gs_app_set_state (app, GS_APP_STATE_INSTALLING);
+
+ if (!snapd_client_refresh_sync (client, name, NULL, progress_cb, app, cancellable, error)) {
+ gs_app_set_state_recover (app);
+ snapd_error_convert (error);
+ return FALSE;
+ }
+
+ gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ }
+
+ return TRUE;
+}
+
+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;
+}
+
+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..26702a9
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+
+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..e748866
--- /dev/null
+++ b/plugins/snap/gs-self-test.c
@@ -0,0 +1,395 @@
+/* -*- 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+
+ */
+
+#include <snapd-glib/snapd-glib.h>
+
+#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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
+ NULL);
+ 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_newv (GS_PLUGIN_ACTION_REMOVE,
+ "app", app,
+ NULL);
+ 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..eceee1a
--- /dev/null
+++ b/plugins/snap/meson.build
@@ -0,0 +1,48 @@
+cargs = ['-DG_LOG_DOMAIN="GsPluginSnap"']
+
+shared_module(
+ 'gs_plugin_snap',
+ sources : [
+ 'gs-plugin-snap.c'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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')
+ 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'
+ ],
+ include_directories : [
+ include_directories('../..'),
+ include_directories('../../lib'),
+ ],
+ 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..2478778
--- /dev/null
+++ b/plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2016 Richard Hughes <richard@hughsie.com> -->
+<component type="addon">
+ <id>org.gnome.Software.Plugin.Snap</id>
+ <extends>org.gnome.Software.desktop</extends>
+ <name>Snap Support</name>
+ <summary>A snap is a universal Linux package</summary>
+ <url type="homepage">https://snapcraft.io/</url>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <update_contact>richard_at_hughsie.com</update_contact>
+</component>
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..0341c6f
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,69 @@
+ab
+af
+ar
+as
+be
+bg
+bn
+bs
+ca
+ca@valencia
+ckb
+cs
+da
+de
+el
+en_GB
+eo
+es
+eu
+fa
+fi
+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
+vi
+zh_CN
+zh_HK
+zh_TW
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..02574dd
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,123 @@
+data/metainfo/org.gnome.Software.metainfo.xml.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.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-tile.ui
+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
+lib/gs-desktop-data.c
+src/gs-common.c
+src/gs-dbus-helper.c
+src/gs-description-box.c
+src/gs-details-page.c
+src/gs-details-page.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-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
+src/gs-metered-data-dialog.ui
+src/gs-moderate-page.ui
+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-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-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-section.c
+src/gs-updates-section.ui
+src/gs-upgrade-banner.c
+src/gs-upgrade-banner.ui
+src/org.gnome.Software.desktop.in
+plugins/core/gs-plugin-generic-updates.c
+plugins/core/gs-plugin-rewrite-resource.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/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
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..0acb823
--- /dev/null
+++ b/po/ab.po
@@ -0,0 +1,5089 @@
+msgid ""
+msgstr ""
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2022-12-09 22:05+0000\n"
+"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
+"Language-Team: Abkhazian <daniel.abzakh@gmail.com>\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"
+"X-DamnedLies-Scope: partial\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:2099
+#: 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: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: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 "«%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:1027
+#, 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:1031
+#, 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 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» Ажыцәқәа ирнаалоит"
+
+#. 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» аиҳабацәа ирнаалоит"
+
+#. 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» ирнаалоит %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 "Ақәратә ҩаӡара"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "Нанба Наала <naala-nanba@rambler.ru>, 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:2156
+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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Ашьақәыргылара"
+
+#: src/gs-details-page.c:889
+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:913
+msgid "_Install…"
+msgstr "_Ашьақәыргылара"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr ""
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+msgid "You need internet access to write a review"
+msgstr ""
+
+#: src/gs-details-page.c:1737 src/gs-details-page.c:1753
+#, 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:907
+msgid "_Write Review"
+msgstr "_Ахцәажәара аҩра"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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 <a href=\"%s\">%s license</a>.\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:2837
+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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. 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: 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 ""
+
+#. 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 ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr ""
+
+#. 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 ""
+
+#. 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 ""
+
+#. 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 ""
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+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 "%s анеира ахьауа"
+
+#: 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:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr ""
+
+#: 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 ""
+
+#. 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:2696
+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 ""
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 <friedel@translate.org.za>, 2014.
+# Pieter Schoeman <pieter@sonbesie.co.za>, 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 <pieter@sonbesie.co.za>\n"
+"Language-Team: Afrikaans <pieter@sonbesie.co.za>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s is nie <a href=\"https://af.wikipedia.org/wiki/Vrye_sagteware\">vry en "
+"oopbronsagteware</a> 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 <shuaib.zahda@gmail.com>, 2014.
+# Safa Alfulaij <safa1996alfulaij@gmail.com>, 2014, 2016, ٢٠١٦.
+# Muhannad Alrusayni <muhannad.alrusayni@gmail.com>, 2016.
+# Khaled Hosny <khaledhosny@eglug.org>, 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 <khaledhosny@eglug.org>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\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<khaledhosny@eglug.org>\n"
+"شعيب زاهدة\t<shuaib.zahda@gmail.com>\n"
+"صفا الفليج\t<safa1996alfulaij@gmail.com>"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ليست <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">برمجية حرّة و مفتوحة المصدر</a>، و موفّرها هو \"%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 <ngoswami@redhat.com>, 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 <ngoswami@redhat.com>\n"
+"Language-Team: Assamese <kde-i18n-doc@kde.org>\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..1ef179f
--- /dev/null
+++ b/po/be.po
@@ -0,0 +1,5503 @@
+# 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.
+# 3abac <3abac@3a.by>, 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: 2022-10-23 07:25+0000\n"
+"PO-Revision-Date: 2022-10-23 19:33+0300\n"
+"Last-Translator: Launchpad translators\n"
+"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\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.0\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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Праз Software можна знайсці і ўсталяваць новыя праграмы і пашырэнні сістэмы, "
+"а таксама выдаліць ужо ўсталяваныя праграмы."
+
+#: 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 ""
+"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 "Падрабязнасці абнаўлення"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076
+#: src/gs-application.c:256
+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 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 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 ""
+"Выбар большага значэння паменшыць колькасць запытаў да аддаленага сервера, "
+"але абнаўленне здымкаў можа займаць больш часу. Пры значэнні 0, праверка "
+"ніколі не выконваецца, калі здымак ужо ёсць у кэшы."
+
+#: 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 ""
+"URL-адрас ліцэнзіі, які выкарыстоўваецца для праграм, што лічацца свабодным "
+"праграмным забеспячэннем"
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr ""
+"URI, які тлумачыць сутнасць несвабоднага і прапрыетарнага праграмнага "
+"забеспячэння"
+
+#: 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 ""
+"Спіс URL-адрасоў, якія ўказваюць на файлы, што будуць спампаваны ў папку "
+"swcatalog з appstream"
+
+#: 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 ""
+"Усталяваць файлы з AppStream у сістэмную папку для ўсіх карыстальнікаў. Калі "
+"false, файлы ўсталяваны ў нестандарты каталог XDG_DATA_HOME/swcatalog/xml"
+
+#: 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 ""
+"Парадак прыярытэту для фарматаў упакоўкі, , фарматы пералічаныя ўпачатку "
+"маюць большы прыярытэт і перавага аддаецца ім. Пусты масіў азначае "
+"прадвызначаны парадак. Не пералічаныя фарматы, разглядаюцца як самыя апошнія "
+"ў спісе. Прыклады фарматаў упакоўкі: deb, flatpak, rpm, snap."
+
+#: 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: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: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 "%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:1027
+#, 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:1031
+#, c-format
+msgid "%s is suitable for young children"
+msgstr "%s прыдатна для дзяцей школьнага ўзросту (6+)"
+
+#. 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 прыдатна для дзяцей старшага ўзросту (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:1043
+#, 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:1048
+#, 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: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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "Мае доступ да сэрвісаў D-Bus (сістэмная шына)"
+
+#: 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 "Мае доступ да сэрвісаў D-Bus (шына сеанса)"
+
+#: 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 "Новае ў версіі %s"
+
+#: 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 ""
+"Рэжым пры запуску: «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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Паказаць лакальны файл metainfo або appdata"
+
+#: 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 "Аддаваць перавагу лакальным файлавым крыніцам, а не AppStream"
+
+#: 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 Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Launchpad translators"
+
+#. 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 "Пра Software"
+
+#. 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 "Патрабуецца дадаткова спампаваць %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: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 "Крыніца: %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 "Перайменавана з %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Дапамагчы з перакладам %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 спраектавана, распрацавана і перакладзена інтэрнацыянальнай супольнасцю "
+"добраахвотнікаў.\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: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 "Увядзіце лік ад 1 да %u: "
+
+#. 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 "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 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 усталявана"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s – не з'яўляецца <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">свабодным праграмным забеспячэннем з адкрытым зыходным "
+"кодам</a> і пастаўляецца «%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 пастаўляецца «%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 ""
+"Усталяванне або выкарыстанне %s можа быць незаконным у некаторых краінах."
+
+#. 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] "Абнаўленні ўсталяваны"
+msgstr[2] "Абнаўленні ўсталяваны"
+
+#. 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] "Праграмы выдалены"
+msgstr[2] "Праграм выдалена"
+
+#. 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] "Каб змены ўступілі ў сілу, перазапусціце сістэму."
+msgstr[2] "Каб змены ўступілі ў сілу, перазапусціце сістэму."
+
+#. 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] "%d хвіліну таму"
+msgstr[1] "%d хвіліны таму"
+msgstr[2] "%d хвілін таму"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d гадзіну таму"
+msgstr[1] "%d гадзіны таму"
+msgstr[2] "%d гадзін таму"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d дзень таму"
+msgstr[1] "%d дні таму"
+msgstr[2] "%d дзён таму"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d тыдзень таму"
+msgstr[1] "%d тыдні таму"
+msgstr[2] "%d тыдняў таму"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d месяц таму"
+msgstr[1] "%d месяцы таму"
+msgstr[2] "%d месяцаў таму"
+
+#: src/gs-common.c:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years 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: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 "Праграма"
+
+#. 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: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 "Іншыя праграмы ад %s"
+
+#. 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:1734 src/gs-details-page.c:1750
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Немагчыма знайсці «%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 "Дапамагчы з _перакладам"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_Напісаць водгук"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] "Даступны шрыфты для сістэмы пісьма %s"
+msgstr[1] "Даступны шрыфты для сістэм пісьма %s"
+msgstr[2] "Даступны шрыфты для сістэм пісьма %s"
+
+#. 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] "Даступнае праграмнае забеспячэнне для %s"
+msgstr[1] "Даступнае праграмнае забеспячэнне для %s"
+msgstr[2] "Даступнае праграмнае забеспячэнне для %s"
+
+#: 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 "%s не знойдзена"
+
+#. 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 "Няма даступных праграм, якія б забяспечылі файл %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 ""
+"Звесткі пра %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Звесткі пра %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Звесткі пра %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:420
+#, 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:424
+#, 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 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 "Няма даступных драйвераў прынтара для %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 ""
+"Звесткі пра %s, а таксама варыянты атрымання драйвера, які падтрымлівае гэты "
+"прынтар, можна знайсці %s."
+
+#. 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] ""
+"Не ўдалося знайсці %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: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] ""
+"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s."
+msgstr[1] ""
+"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s."
+msgstr[2] ""
+"Не ўдалося знайсці %s. Каб атрымаць дадатковы звесткі, азнаёмцеся з %s."
+
+#: 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 "Не ўдалося знайсці: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Фармат файла %s"
+
+#: 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 "%s, магчыма, працуе на гэтай прыладзе"
+
+#. 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 працуе на гэтай прыладзе"
+
+#. 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 можа працаваць на гэтай прыладзе неналежным чынам"
+
+#. 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 можа не працаваць на гэтай прыладзе"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Гэта праграмнае забеспячэнне адкрыта распрацоўваецца супольнасцю "
+"добраахвотнікаў і распаўсюджваецца на ўмовах <a href=\"%s\">ліцэнзіі %s</"
+"a>.\n"
+"\n"
+"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ."
+
+#. 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 ""
+"Гэта праграмнае забеспячэнне адкрыта распрацоўваецца супольнасцю "
+"добраахвотнікаў і распаўсюджваецца на ўмовах ліцэнзіі %s.\n"
+"\n"
+"Вы маеце магчымасць зрабіць свой унёсак, каб палепшыць ПЗ."
+
+#: 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 ""
+"Гэта праграмнае забеспячэнне не адкрытае і толькі распрацоўшчыкі ведаюць як "
+"яно працуе. Часам гэта можа быць небяспечна, бо памылкі складана выявіць, а "
+"змены ўносяцца без нагляду.\n"
+"\n"
+"Вы не маеце магчымасці ўдзельнічаць у яго распрацоўцы."
+
+#. 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 ""
+"Задзейнічана злучэнне з тарыфікацыяй. Злучэнні з тарыфікацыяй маюць ліміт "
+"перадачы даных або звязаную з лімітам плату. Каб зэканоміць трафік, "
+"аўтаматычнае абнаўленне прыпынена.\n"
+"\n"
+"Аўтаматычнае абнаўленне ўзновіцца, калі будзе даступна безлімітнае злучэнне. "
+"Да гэтага часу, можна ўсталёўваць абнаўленні ўручную.\n"
+"\n"
+"Калі бягучае злучэнне было няправільна распазнана як лімітаванае, гэты "
+"параметр можна змяніць."
+
+#: 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 ""
+"Забяспечвае доступ да дадатковага ПЗ з %s. У тым ліку да некаторага "
+"прапрыетарнага праграмнага забеспячэння."
+
+#. 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:2829
+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 "Сапраўды выдаліць сховішча %s?"
+
+#. 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 ""
+"Усе праграмы з %s будуць выдалены. Каб карыстацца імі зноў, вам прыйдзецца "
+"пераўсталяваць сховішча."
+
+#. 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 "Сапраўды выдаліць %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 будзе выдалена. Каб карыстацца праграмай зноў, вам прыйдзецца "
+"пераўсталяваць яе."
+
+#: 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 ""
+"Частка ўсталяванага ў цяперашні час праграмнага забеспячэння несумяшчальная "
+"з %s. Калі вы працягнеце, наступнае ПЗ падчас абнаўлення будзе аўтаматычна "
+"выдалена:"
+
+#: 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 ""
+"Праграмнае забеспячэнне, усталяванае з «%s», больш не будзе атрымліваць "
+"абнаўленні."
+
+#: 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 "Сховішчы з выбраных старонніх крыніц — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 ""
+"Гэтыя сховішчы дапаўняюць прадвызначанае праграмнае забеспячэнне, якое "
+"пастаўляецца з %s."
+
+#. 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] "Усталявана %u праграма"
+msgstr[1] "Усталявана %u праграмы"
+msgstr[2] "Усталявана %u праграм"
+
+#. 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 дадатковы кампанент"
+msgstr[1] "Усталявана %u дадатковыя кампаненты"
+msgstr[2] "Усталявана %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-repo-row.c:175
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+msgstr[0] "%u праграма"
+msgstr[1] "%u праграмы"
+msgstr[2] "%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-repo-row.c:181
+#, 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 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 і %s усталяваны"
+msgstr[1] "%s і %s усталяваны"
+msgstr[2] "%s і %s усталяваны"
+
+#. 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 "Дрэнна"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Якія даныя адпраўляюцца, вы можаце знайсці ў <a href=\"https://odrs.gnome."
+"org/privacy\">палітыцы прыватнасці</a>. Будзе апублікавана пад вашым поўным "
+"імем, указаным ва ўліковым запісе."
+
+#: 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:93
+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: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 "%s патэнцыяльна небяспечная"
+
+#. 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 небяспечная"
+
+#. 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 "Састарэлая версія 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 "Наступны здымак"
+
+#: 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] "Яшчэ %u супадзенне"
+msgstr[1] "Яшчэ %u супадзенні"
+msgstr[2] "Яшчэ %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 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 "Немагчыма спампаваць абнаўленні ўбудаванай праграмы з %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 "Немагчыма спампаваць абнаўленні з %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 "Немагчыма спампаваць абнаўленні"
+
+#. 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 "Немагчыма спампаваць абнаўленні з %s: недастаткова месца на дыску"
+
+#. 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 "Немагчыма ўсталяваць %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 "Немагчыма ўсталяваць %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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Немагчыма ўсталяваць %s: не падтрымліваецца"
+
+#. 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 "Немагчыма ўсталяваць %s: недастаткова месца на дыску"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Немагчыма ўсталяваць %s. Нізкі ўзровень зараду батарэі"
+
+#. 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 "Немагчыма ўсталяваць %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 "Немагчыма абнавіць %s з %s, не ўдалося спампаваць"
+
+#. 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 "Немагчыма абнавіць %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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Немагчыма ўсталяваць абнаўленні з %s, не ўдалося спампаваць"
+
+#. 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 "Немагчыма абнавіць %s: недастаткова месца на дыску"
+
+#. 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 "Немагчыма абнавіць %s: патрабуецца праверка сапраўднасці"
+
+#. 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 "Немагчыма абнавіць %s: сапраўднасць не пацверджана"
+
+#. 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 ""
+"Немагчыма абнавіць %s: вы не маеце дазволу на абнаўленне праграмнага "
+"забеспячэння"
+
+#. 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 "Немагчыма абнавіць %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: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 "Немагчыма абнавіць %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: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 "Немагчыма абнавіць %s"
+
+#. 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 "Немагчыма абнавіць да %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 "Немагчыма абнавіць да %s, не ўдалося спампаваць"
+
+#. 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 "Немагчыма абнавіць да %s: патрабуецца доступ да інтэрнэту"
+
+#. 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 "Немагчыма абнавіць да %s: недастаткова месца на дыску"
+
+#. 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 "Немагчыма абнавіць да %s: патрабуецца праверка сапраўднасці"
+
+#. 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 "Немагчыма абнавіць да %s: сапраўднасць не пацверджана"
+
+#. 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 "Немагчыма абнавіць да %s: вы не маеце дазволу на абнаўленне"
+
+#. 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 "Немагчыма абнавіць да %s: патрабуецца сілкаванне ад электрасеткі"
+
+#. 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 "Немагчыма абнавіць да %s: нізкі ўзровень зараду батарэі"
+
+#. 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 "Немагчыма абнавіць да %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 "Немагчыма выдаліць %s: патрабуецца праверка сапраўднасці"
+
+#. 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 "Немагчыма выдаліць %s: сапраўднасць не пацверджана"
+
+#. 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 ""
+"Немагчыма выдаліць %s: вы не маеце дазволу на выдаленне праграмнага "
+"забеспячэння"
+
+#. 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 "Немагчыма выдаліць %s: патрабуецца сілкаванне ад электрасеткі"
+
+#. 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 "Немагчыма выдаліць %s: нізкі ўзровень зараду батарэі"
+
+#. 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 "Немагчыма выдаліць %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 "Немагчыма запусціць %s: не ўсталявана асяроддзе %s"
+
+#. 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 "Нешта пайшло не так"
+
+#. 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 "Недастаткова месца на дыску, вызваліце месца і паўтарыце спробу"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Не ўдалося ўсталяваць файл: фармат не падтрымліваецца"
+
+#. 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 "Не ўдалося ўсталяваць: памылка праверкі сапраўднасці"
+
+#. 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 "Немагчыма звязацца з %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 "Каб выкарыстоўваць новыя ўбудовы, трэба перазапусціць Software."
+
+#. 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 "Нізкі ўзровень зараду батарэі"
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Кэшаваныя даныя можна ачысціць праз <a href=\"dummy\">_налады праграмы</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (усталявана)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Усталяванне)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Выдаленне)"
+
+#. 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 "Усталявана %s"
+
+#: 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] "Абноўлена %u праграма — патрабуецца перазапуск"
+msgstr[1] "Абноўлена %u праграмы — патрабуецца перазапуск"
+msgstr[2] "Абноўлена %u праграм — патрабуецца перазапуск"
+
+#. 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 праграма"
+msgstr[1] "Абноўлена %u праграмы"
+msgstr[2] "Абноўлена %u праграм"
+
+#. 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 "%s і %s — абнаўленне выканана."
+
+#. 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 праграме патрабуецца перазапуск."
+msgstr[1] "%u праграмам патрабуецца перазапуск."
+msgstr[2] "%u праграмам патрабуецца перазапуск."
+
+#. 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 "Новая версія %s даступна для ўсталявання"
+
+#. 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 "Вітаем у %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] "Абнаўленні праграмнага забеспячэння ўсталяваны"
+msgstr[2] "Абнаўленні праграмнага забеспячэння ўсталяваны"
+
+#. 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] "Усталяваны важныя абнаўленні аперацыйнай сістэмы."
+msgstr[2] "Усталяваны важныя абнаўленні аперацыйнай сістэмы."
+
+#. 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 "Апошняя праверка адбывалася %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 больш не падтрымліваецца."
+
+#: 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 "Даступна %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:95
+#, c-format
+msgid "%s Available"
+msgstr "Даступна %s"
+
+#: 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 "Спампавана %s з %s"
+
+#. 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%%"
+
+#: 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 ""
+"Абнаўленні;Абнавіць;Крыніцы;Сховішчы;Рэпазіторыі;Параметры;Усталяваць;"
+"Высталяваць;Выдаліць;Праграма;Праграмнае;забеспячэнне;Крама;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: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 "Абнаўленне %s з новымі магчымасцямі і выпраўленнямі."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "Сэрвісу абнаўлення EOS не ўдалося атрымаць і ўжыць абнаўленне."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "GNOME 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: 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 "Flatpak – гэта фрэймворк для праграм пад Linux"
+
+#. 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 "Сістэмная папка %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Падпапка ў Хатняй папцы %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Папкі галоўнай сістэмы"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Канфігурацыя галоўнай сістэмы з /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Папка Стол"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Падпапка ў папцы Стол %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Папка Дакументы"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Падпапка ў папцы Дакументы %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Папка Музыка"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Падпапка ў папцы Музыка %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Папка Малюнкі"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Падпапка ў папцы Малюнкі %s"
+
+#: 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 "Падпапка ў папцы Публічныя файлы %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Папка Відэа"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Падпапка ў папцы Відэа %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Папка Шаблоны"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Падпапка ў папцы Шаблоны %s"
+
+#: 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 "Падпапка ў папцы кэшу карыстальніка %s"
+
+#: 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 "Падпапка ў папцы канфігурацыі карыстальніка %s"
+
+#: 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 "Падпапка ў папцы даных карыстальніка %s"
+
+#: 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 "Падпапка ў папцы карыстальніцкага асяроддзя выканання %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Доступ файлавай сістэмы да %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Атрыманне метаданых flatpak для %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Не ўдалося ўсталяваць дадатак «%s»: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Не ўдалося выдаліць дадатак «%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 ""
+"Аддалены «%s» не дазваляе ўсталяваць «%s», магчыма, з-за яго фільтра. "
+"Выдаліце фільтр і паўтарыце ўсталяванне. Падрабязныя звесткі пра памылку: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Абнаўленне 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Абнаўленне канфігурацыі %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Абнаўленне для камеры %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Абнаўленне для TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Абнаўленне для сэнсарнай панэлі %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Абнаўленне для мышы %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Абнаўленне для клавіятуры %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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Абнаўленне 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Абнаўленне для USB-прыёмніка %s"
+
+#: 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 "Аперацыйная сістэма (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"
+
+#, 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. Example packaging formats are: "
+#~| "deb, flatpak, rpm, snap."
+#~ 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."
+
+#, 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 ""
+#~ "Частка ўсталяванага ў цяперашні час праграмнага забеспячэння "
+#~ "несумяшчальная з %s. Калі вы працягнеце, наступнае ПЗ падчас абнаўлення "
+#~ "будзе аўтаматычна выдалена:"
+
+#~ msgid "_Upgrade"
+#~ msgstr "_Абнавіць"
+
+#~ msgid "Web App"
+#~ msgstr "Вэб-праграма"
+
+#, c-format
+#~ msgid "Device battery power is too low"
+#~ msgstr "У прылады нізкі ўзровень зараду батарэі"
+
+#~ msgid "Device cannot be used while the lid is closed"
+#~ msgstr "Прылада не можа выкарыстоўвацца калі вечка закрыта."
+
+#~ 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 "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 "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..6b3eb1f
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,5318 @@
+# Bulgarian translation of gnome-software po-file.
+# Copyright (C) 2017 gnome-software's COPYRIGHT HOLDER
+# Copyright (C) 2021, 2022 Alexander Shopov <ash@kambanaria.org>.
+# This file is distributed under the same license as the gnome-software package.
+# Lyubomir Vasilev <lyubomirv@abv.bg>, 2017.
+# Alexander Shopov <ash@kambanaria.org>, 2021, 2022.
+#
+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: 2022-09-06 19:57+0000\n"
+"PO-Revision-Date: 2022-09-12 13:33+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict-notifications@fsa-bg.org>\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"
+
+#: 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:2018
+#: src/gs-application.c:256
+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 ""
+"Ако е изключено, разделът с обновленията ще бъде скрит и „Управление на "
+"програмите“ няма да извършва никакви автоматични действия спрямо "
+"обновленията и надгражданията."
+
+#: 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 ""
+"Задаването на по-голяма стойност ще означава по-малко изтегляне на данни от "
+"сървъра, но ако снимките бъдат обновени, потребителят може да не ги види "
+"веднага. Стойност 0 означава никога да не се прави проверка за снимката на "
+"сървъра, ако тя вече е в кеша."
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: 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 ""
+"Списък от адреси, водещи към файлове на „AppStream“, които ще бъдат "
+"изтеглени в папка с информация за програмата"
+
+#: 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 ""
+"Инсталиране на файловете на „AppStream“ в системна папка за всички "
+"потребители. Ако е лъжа, файловете се инсталират в папката „$XDG_DATA_HOME/"
+"swcatalog/xmls“, което не е по стандарт"
+
+#: 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 ""
+"Списък на форматите на пакетите по приоритет, по-важните са отпред. Празен "
+"масив означава стандартен списък. Пропуснатите формати са все едно най-"
+"последни. Примерни формати: „deb“, „flatpak“, „rpm“, „snap“."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Системен инсталатор за „AppStream“ на „Управление на програмите“"
+
+#: 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 "Видът на съдържанието не може да бъде проверен: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 е подходяща за тинейджъри"
+
+#. 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 е подходяща за възрастни"
+
+#. 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 е подходяща за %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 "Възрастово ограничение"
+
+#: 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 "Достъпва услугите на D-Bus по системната шина"
+
+#: 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 "Достъпва услугите на D-Bus по сесийната шина"
+
+#: 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 "Ново във версия %s"
+
+#: 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 ""
+"Режим на стартиране. Един от следните: „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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Показване на локалния файл във формат „metainfo“ или „appdata“"
+
+#: 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 "Предпочитане на локални файлове като източници пред „AppStream“"
+
+#: 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 ""
+"Любомир Василев &lt;<a href='mailto:lyubomirv@abv.bg'>lyubomirv@abv.bg</"
+"a>&gt;\n"
+"Александър Шопов &lt;<a href='mailto:ash@kambanaria.org'>ash@kambanaria.org</"
+"a>&gt;\n"
+"\n"
+"Проектът за превод на GNOME има нужда от подкрепа.\n"
+"Научете повече за нас на <a href='https://fsa-bg.org/project/gtp'>уеб сайта</"
+"a> ни.\n"
+"Докладвайте за грешки в превода в <a href='https://fsa-bg.org/project/gtp/"
+"newticket'>съответния раздел</a>."
+
+#. 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 "Има нужда от %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: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 "Източник: %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 "Преименувано от „%s“"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Помогнете с превода на „%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 се проектира, разработва и превежда от международен екип от доброволци.\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: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 "Въведете число между 1 и %u: "
+
+#. 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 "„%s“ вече е инсталирана"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"„%s“ не е <a href='https://bg.wikipedia.org/wiki/Свободен_софтуер'>свободен "
+"софтуер</a> с <a href='https://bg.wikipedia.org/wiki/"
+"Софтуер_с_отворен_код'>отворен код</a> и се осигурява от „%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“ се осигурява от „%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 ""
+"В някои държави инсталирането и използването на „%s“ може да е незаконно."
+
+#. 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] "Преди %d минута"
+msgstr[1] "Преди %d минути"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "Преди %d час"
+msgstr[1] "Преди %d часа"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "Преди %d ден"
+msgstr[1] "Преди %d дни"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "Преди %d седмица"
+msgstr[1] "Преди %d седмици"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "Преди %d месец"
+msgstr[1] "Преди %d месеца"
+
+#: src/gs-common.c:891
+#, 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: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 "Програма"
+
+#. 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:332
+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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Инсталиране"
+
+#: src/gs-details-page.c:876
+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:900
+msgid "_Install…"
+msgstr "_Инсталиране…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Други програми от %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "За да публикувате рецензия, се нуждаете от връзка с Интернет"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Неуспешно търсене на „%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 "Помогнете с _превода"
+
+#. 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:216
+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] "Налични шрифтове за писмеността: %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: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: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 "„%s“ не е намерена"
+
+#. 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 "Няма програми, които предоставят файла „%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 ""
+"Може да откриете информация за „%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Може да откриете информация за „%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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Може да откриете информация за „%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:420
+#, 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:424
+#, 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 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 "Няма драйвери за принтер за „%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 ""
+"Може да откриете информация за „%s“, както и за възможните начини да се "
+"сдобиете с драйвер за този принтер, %s."
+
+#. 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] ""
+"Кодекът „%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: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] ""
+"Кодекът „%s“, който търсехте, не може да бъде открит. Прегледайте %s за "
+"повече информация."
+msgstr[1] ""
+"Кодеците „%s“, които търсехте, не може да бъдат открити. Прегледайте %s за "
+"повече информация."
+
+#: 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 "Няма резултати от търсенето: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Файлов формат %s"
+
+#: 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 "%s вероятно работи на това устройство"
+
+#. 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 работи на това устройство"
+
+#. 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 не работи правилно на това устройство"
+
+#. 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 не работи на това устройство"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Този софтуер се разработва публично от екип доброволци и се лицензира по "
+"условията на <a href='%s'>лиценза %s</a>.\n"
+"\n"
+"И вие може да допринесете и да го направите още по-добър."
+
+#. 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 ""
+"Този софтуер се разработва публично от екип доброволци и се лицензира по "
+"условията на %s.\n"
+"\n"
+"И вие може да допринесете и да го направите още по-добър."
+
+#: 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 ""
+"Този софтуер не се разработва публично и само разработчиците му знаят как работи. Той може да не е сигурен или надежден по труден за установяване начин. Той може да се промени без всякакво предупреждение.\n"
+"\n"
+"Твърде вероятно е да не може да допринесете за софтуера или да повлияете на разработката му."
+
+#. 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 ""
+"Текущата мрежа се измерва. Това означава ограничения на обема изтеглени "
+"данни или допълнително плащане за тях. За да се пестят данните, "
+"автоматичното обновяване е на пауза.\n"
+"\n"
+"Автоматичното обновяване ще се поднови при появата на неизмервана връзка. "
+"Дотогава може изрично ръчно да обновявате пакети.\n"
+"\n"
+"Друг вариант е текущата връзка да е идентифицирана като измервана по "
+"погрешка. В такъв случай може да промените настройката."
+
+#: 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 "Достъп до допълнителни програми от %s. Има и собственически софтуер."
+
+#. 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 "Наистина ли искате да премахнете източника „%s“?"
+
+#. 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 ""
+"Всички програми от „%s“ ще бъдат премахнати, и ако искате да ги ползвате "
+"отново, ще трябва пак да инсталирате източника."
+
+#. 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 "Наистина ли искате да деинсталирате „%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“ ще бъде деинсталирана, и ако искате да я ползвате отново, ще "
+"трябва пак да я инсталирате."
+
+#: 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 ""
+"Част от инсталирания софтуер е несъвместим с „%s“. Ако продължите, следните "
+"пакети ще бъдат премахнати автоматично по време на надграждането:"
+
+#: 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 "Програмите, инсталирани от „%s“, повече няма да бъдат обновявани."
+
+#: 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 "Допълнителни източници от избрани трети страни — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 "Тези източници допълват програмите от %s."
+
+#. 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] "%u инсталирана програма"
+msgstr[1] "%u инсталирани програми"
+
+#. 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 инсталирана добавка"
+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-repo-row.c:175
+#, 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 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 добавка"
+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-repo-row.c:188
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "Инсталирани: %s и %s"
+msgstr[1] "Инсталирани: %s и %s"
+
+#. 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 "Ужасна"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Вижте изпращаните данни в <a href='https://odrs.gnome.org/"
+"privacy'>политиката ни за поверителност</a>. Цялото име, което е свързано с "
+"регистрацията ви, е видимо публично."
+
+#: 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:93
+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: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 "Потвърдено е кой 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: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 "„%s“ потенциално не е безопасна"
+
+#. 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“ не е безопасна"
+
+#. 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 "За разработчици"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Снимката е неправилна"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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] "Още %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 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 "Обновленията на фърмуера не може да бъдат изтеглени от %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 "Обновленията не може да бъдат изтеглени от %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 "Обновленията не може да бъдат изтеглени"
+
+#. 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 ""
+"Обновленията не може да бъдат изтеглени от %s: няма достатъчно свободно "
+"място на диска"
+
+#. 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 ""
+"„%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 "„%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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "„%s“ не може да се инсталира, защото не се поддържа"
+
+#. 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 "„%s“ не може да се инсталира: няма достатъчно свободно място на диска"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "„%s“ не може да се инсталира: зарядът на батерията е твърде нисък"
+
+#. 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 "„%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 "„%s“ не може да се обнови от „%s“: неуспешно изтегляне"
+
+#. 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 "„%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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Обновленията не може да се инсталират от „%s“: неуспешно изтегляне"
+
+#. 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 "„%s“ не може да се обнови: няма достатъчно свободно място на диска"
+
+#. 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 "„%s“ не може да се обнови: изисква се удостоверяване"
+
+#. 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 "„%s“ не може да се обнови: неправилно удостоверяване"
+
+#. 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 "„%s“ не може да се обнови: нямате правомощия за обновяване на софтуер"
+
+#. 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 ""
+"„%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: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 "„%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: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 "„%s“ не може да се обнови"
+
+#. 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 "Надграждането до „%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 "Надграждането до „%s“ е невъзможно: неуспешно изтегляне"
+
+#. 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 "Надграждането до „%s“ е невъзможно: няма връзка с мрежата"
+
+#. 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 ""
+"Надграждането до „%s“ е невъзможно: няма достатъчно свободно място на диска"
+
+#. 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 "Надграждането до „%s“ е невъзможно: изисква се удостоверяване"
+
+#. 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 "Надграждането до „%s“ е невъзможно: неправилно удостоверяване"
+
+#. 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 "Надграждането до „%s“ е невъзможно: нямате правомощия за надграждане"
+
+#. 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 ""
+"Надграждането до „%s“ е невъзможно: изисква се захранване от електрическата "
+"мрежа"
+
+#. 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 "Надграждането до „%s“ е невъзможно: твърде нисък заряд на батерията"
+
+#. 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 "Надграждането до „%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 "„%s“ не може да се премахне: изисква се удостоверяване"
+
+#. 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 "„%s“ не може да се премахне: неправилно удостоверяване"
+
+#. 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 ""
+"„%s“ не може да се премахне: нямате правомощия за премахване на софтуер"
+
+#. 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 ""
+"„%s“ не може да се премахне: изисква се захранване от електрическата мрежа"
+
+#. 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 "„%s“ не може да се премахне: нисък заряд на батерията"
+
+#. 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 "„%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 "Стартирането на „%s“ е невъзможно: липсва „%s“"
+
+#. 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 "Свързването с „%s“ е невъзможно"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Кешираните данни може да се изчистят от <a href='dummy'>настройките на "
+"програмата</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Инсталирано)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Инсталира се)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Премахва се)"
+
+#. 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 "Инсталирани на %s"
+
+#: 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] "%u програма е обновена, необходимо е рестартиране"
+msgstr[1] "%u програми са обновени, необходимо е рестартиране"
+
+#. 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 програма е обновена"
+msgstr[1] "%u програми са обновени"
+
+#. 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 "„%s“ и „%s“ са обновени."
+
+#. 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 програма."
+msgstr[1] "Трябва да рестартирате %u програми."
+
+#. 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 "Има нова версия на „%s“, която е налична за инсталиране"
+
+#. 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 "Добре дошли в „%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 "Преглед"
+
+#. 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 "Последна проверка: %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 вече не се поддържа."
+
+#: 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 "%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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s е налична"
+
+#: 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 "изтеглени %s от общо %s"
+
+#. 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 %%"
+
+#: 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 ""
+"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: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 "Обновление на %s с нови функционалности и корекции."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr ""
+"Услугата за обновяване на Endless OS не може да изтегли и приложи "
+"обновлението."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "Уеб на GNOME"
+
+#: 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:404
+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 "„Flatpak“ е система за пакетиране на програми за Линукс"
+
+#. 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 "Системна папка: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Подпапка в домашната: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Системни папки с настройки"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Настройки на системата от „/etc“"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Папка за работен плот"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Подпапка в работния плот: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Папка с документи"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Подпапка с документи: „%s“:"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Папка с музика"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Подпапка с музика: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Папка с изображения"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Подпапка с изображения: „%s“"
+
+#: 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 "Подпапка за публично споделяне: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Папка за видео"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Подпапка за видео: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Папка с шаблони"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Подпапка с шаблони: „%s“"
+
+#: 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 "Подпапка с временно складирани данни на потребителя: „%s“"
+
+#: 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 "Подпапка за настройки на потребителя:„%s“"
+
+#: 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 "Подпапка за данни на потребителя: „%s“"
+
+#: 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 "Подпапка за изпълнение на потребителя: „%s“"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Достъп до файловата система: %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Получаване на метаданни на „flatpak“ за „%s“…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Неуспешно добавяне на инсталирането на добавката „%s“: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1051
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Неуспешно добавяне на деинсталирането на добавката „%s“: %s"
+
+#: 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 ""
+"Отдалеченото хранилище „%s“ не позволява инсталирането на „%s“, най-вероятно "
+"заради приложен филтър. Изчистете филтъра и пробвайте отново. Подробна "
+"информация за грешката: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Обновление на модул за управление (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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Обновление на настройки за %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Обновление на камера за %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Обновление на доверен модул (TPM) за %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Обновление на сензорен панел за %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Обновление на мишка за %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Обновление на клавиатура за %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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Обновление на контролера за управление (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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Обновление на приемник по USB „%s“"
+
+#: 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 "Операционна система (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"
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 <aditi.kabir@gmail.com>, 2016
+# Roddy Shuler <roddy@endlessm.com>, 2016-2017
+# Shimon Sharmin <oparthib@gmail.com>, 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 <roddy@endlessm.com>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by "
+"“%s”."
+msgstr "%s <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">মুক্ত ও উন্মুক্ত উৎস সফটওয়্যার</a> নয়, এবং “%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 <EMAIL@ADDRESS>, 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ć <sglavic1@etf.unsa.ba>\n"
+"Language-Team: Bosnian <bs@li.org>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">free "
+"and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nije<a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">slobodan "
+"softver otvorenog koda</a>, 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..a53afea
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,5458 @@
+# 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 <jmas@softcatala.org>, 2013-2022
+# Gil Forcada <gilforcada@guifi.net>, 2014-2020.
+#
+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-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-09-17 16:50+0100\n"
+"Last-Translator: Jordi Mas i Hernandez <jmas@softcatala.org>\n"
+"Language-Team: Catalan <tradgnome@softcatala.org>\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-Generator: Poedit 3.0.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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 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ó"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "El projecte GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"L'última marca de temps en què el sistema va estar en línia i va obtenir "
+"actualitzacions"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "La puntuació de karma mínima per a les ressenyes"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Ofereix actualitzacions per a versions preliminars"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "«https://ca.wikipedia.org/wiki/Programari_de_propietat»"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "L'instal·lador d'AppStream del Programari del GNOME"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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 realista"
+
+#: 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 fort"
+
+#: 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: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 "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 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 é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:1027
+#, 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:1031
+#, 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 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 é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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Valoració per edat"
+
+#: 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 "Com afegir-hi la informació que falta"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Paquet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pendent"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instal·lació pendent"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Eliminació pendent"
+
+#: 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 "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:115 src/gs-app-row.c:205 src/gs-details-page.c:362
+msgid "Installing"
+msgstr "S'està instal·lant"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "S'està suprimint"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstal·la"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Xarxa"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Es pot comunicar per la xarxa"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Serveis del sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Serveis de sessió"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositius"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Pot accedir a fitxers de dispositiu del sistema"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Carpeta d'usuari"
+
+#: 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 "Pot veure, editar i crear fitxers"
+
+#: 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 "Pot veure fitxers"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Carpeta de baixada"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Paràmetres"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Pot veure i canviar qualsevol paràmetre"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema de visualització antic"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa un sistema antic i insegur de visualització"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Escapa de l'espai aïllat"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Pot escapar-se de l'espai aïllat i eludir qualsevol altra restricció"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detalls de l'actualització"
+
+#. 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 "No hi ha cap descripció sobre l'actualització disponible."
+
+#: 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 "Ves enrere"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Requereix permisos addicionals"
+
+#. 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 "Ressenyes"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "No s'han trobat ressenyes per a aquesta aplicació."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Cap ressenya"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Historial de versions"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novetats de la versió %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versió %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Mostra un fitxer local de metainfo o appdata"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Mostra informació de depuració detallada"
+
+#: 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 update preferences"
+msgstr "Mostra les preferències d'actualització"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016-2022 Contribuïdors de Programari del GNOME"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"equip de traducció:\n"
+"Jordi Mas i Hernàndez <jmas@softcatala.org>, 2013-2021\n"
+"Miquel-Àngel Burgos i Fradeja <miquel.angel.burgos@gmail.com>, 2020"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Quant al Programari"
+
+#. 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 "Una forma engrescadora de gestionar el programari del sistema."
+
+#. 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 "No hi ha detalls per a aquesta aplicació."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Pot accedir a dispositius de maquinari"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Pot accedir a fitxers arbitraris"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Pot adquirir permisos de forma arbitrària"
+
+#. 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 "Revisat per la vostra distribució"
+
+#. 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 "Proporcionada per un tercer"
+
+#. 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 "Codi propietari"
+
+#. 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 "Codi auditable"
+
+#. 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 "El desenvolupador de l'aplicació està verificat"
+
+#. 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 "El vostre sistema operatiu no és compatible"
+
+#. 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 "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:474
+msgid "Potentially Unsafe"
+msgstr "Potencialment 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:481
+msgid "Unsafe"
+msgstr "Insegur"
+
+#: 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 "Només mòbil"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Només funciona en una pantalla petita"
+
+#: 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 "Només en escriptori"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Només funciona en una pantalla gran"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "La mida de la pantalla no coincideix"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+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:593 src/gs-hardware-support-context-dialog.c:674
+#: src/gs-hardware-support-context-dialog.c:680
+msgid "Requires a touchscreen"
+msgstr "Requereix una pantalla tàctil"
+
+#: 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 "Requereix un teclat"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requereix un ratolí"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Cal un comandament de joc"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptativa"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funciona amb telèfons, tauletes i escriptoris"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probablement requereix un teclat o un ratolí"
+
+#: src/gs-app-context-bar.c:662
+msgid "Works on desktops and laptops"
+msgstr "Funciona amb 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:705
+msgid "Contains no age-inappropriate content"
+msgstr "No conté cap contingut inapropiat per a menors"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+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:159
+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:167 src/gs-updates-section.ui:62
+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:175 src/gs-common.c:286 src/gs-page.c:374
+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:183
+msgid "Update"
+msgstr "Actualitza"
+
+#. 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 "Desinstal·la"
+
+#. 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 "Desinstal·lació"
+
+#. 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 "El dispositiu no pot utilitzar-se durant l'actualització."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "S'ha canviat el nom de %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ajudeu a traduir %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 està dissenyat, desenvolupat i traduït per una comunitat internacional de voluntaris.\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:5
+msgid "Translations"
+msgstr "Traduccions"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Lloc web de la traducció"
+
+#. 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 "Cal autenticació pel remot %s (regne %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Cal autenticació"
+
+#: 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 "_Cancel·la"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Entra"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Usuari"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Contrasen_ya"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nou i actualitzat"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Altre programari"
+
+#. 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 "Introduïu un nombre de l'1 al %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Escolliu una aplicació:"
+
+#: 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 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'ha instal·lat %s"
+
+#. 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 "És necessari un reinici perquè els canvis tinguin efecte."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Les actualitzacions del sistema ja estan instal·lades"
+
+#. 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 ""
+"Les actualitzacions instal·lades recentment estan disponibles per a ser "
+"revisades"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reinicia"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Executa"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Voleu instal·lar programari de tercers?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Voleu habilitar els repositoris de programari de tercers?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by "
+"“%s”."
+msgstr ""
+"%s no és <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">programari lliure o de codi obert</a>, i es proporciona "
+"amb «%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 es proporciona amb «%s»."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "No tornis a avisar-me"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Els errors detallats del gestor de paquets es mostren a continuació:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalls"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "Acce_pta"
+
+#. 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] "S'ha instal·lat una actualització"
+msgstr[1] "S'han instal·lat actualitzacions"
+
+#. 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] "S'ha eliminat una aplicació"
+msgstr[1] "S'han eliminat les aplicacions"
+
+#. 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] "És necessari un reinici perquè el canvi tingui efecte."
+msgstr[1] "És necessari un reinici perquè els canvis tinguin efecte."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Ara no"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Ara mateix"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "Fa %d hora"
+msgstr[1] "Fa %d hores"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "Fa %d any"
+msgstr[1] "Fa %d anys"
+
+#. 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Cerca al programari"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostra'n més"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostra'n més"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "S'està suprimint…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Requereix reiniciar per a acabar la instal·lació"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Pendent de les actualitzacions…"
+
+#. Translators: This string is shown when preparing to download and install an
+#. app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "S'està preparant…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "S'està desinstal·lant…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instal·la"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Reinicia"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Instal·la…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Altres aplicacions de %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+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:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "No s'ha trobat «%s»"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Pàgina de detalls"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "S'estan carregant els detalls de l'aplicació…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Aquest programari no està disponible en la vostra llengua i apareixerà en "
+"anglès americà."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "_Ajudeu a traduir-lo"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Obre"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Actualitza"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "S'està baixant"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Complements"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr ""
+"S'instal·laran els complements seleccionats juntament amb l'aplicació."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "S'inclou repositori de programari"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "No s'inclouen repositoris de programari"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been
+#. discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "S'ha identificat un repositori de programari"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Utilitzeu només fonts de programari de confiança."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Sense metadades"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Lloc _web del projecte"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Feu un donatiu"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Col·laboreu a la traducció"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Informeu d'un problema"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Ajuda"
+
+#. 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 "_Escriviu una ressenya"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Totes les ressenyes"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "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: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:242
+msgid "Requested software not found"
+msgstr "No s'ha trobat el programari sol·licitat"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "No s'ha trobat %s"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+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:354
+#, 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: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 ""
+"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 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 ""
+"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:376
+#, 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: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 ""
+"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 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 ""
+"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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, 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:874
+#, c-format
+msgid "%s file format"
+msgstr "Format de fitxer %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "No s'ha pogut trobar el programari demanat"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Pàgina de còdecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Compatibilitat amb escriptori"
+
+#: 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 "Es pot utilitzar en una pantalla gran"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Compatibilitat amb escriptori desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requereix una pantalla gran"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "No és compatible amb escriptori"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "No pot ser usat en una pantalla gran"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Compatibilitat amb mòbil"
+
+#: 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 "Es pot utilitzar en una pantalla petita"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Compatibilitat amb mòbil desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requereix una pantalla petita"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "No és compatible amb mòbil"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "No es pot utilitzar amb una pantalla petita"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Compatibilitat de teclat"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Compatibilitat de teclat desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Requereix teclat"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Compatible amb teclats"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "No és compatible amb teclat"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "No es pot usar amb un teclat"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Compatibilitat amb ratolí"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requereix un ratolí o un dispositiu assenyalador"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Compatibilitat amb ratolí desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Requereix un ratolí"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "És compatible amb ratolins i dispositius assenyaladors"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "No és compatible amb ratolí"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Compatibilitat amb pantalla tàctil"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Compatibilitat amb pantalla tàctil desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Requereix pantalla tàctil"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Compatible amb pantalla tàctil"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "No és compatible amb pantalla tàctil"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "No pot ser usat en una pantalla tàctil"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Requereix un comandament de joc"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Requereix un comandament de joc"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Compatibilitat amb comandament de joc"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Compatibilitat amb maquinari"
+
+#. 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 "Instal·lat"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Pàgina d'instal·lació"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicacions"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicacions Web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicacions del sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Creat per la comunitat"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Aquest programari es desenvolupa en obert per una comunitat de voluntaris, i es publica sota la <a href=\"%s\">llicència %s</a>.\n"
+"\n"
+"Podeu contribuir i ajudar a millorar-lo encara més."
+
+#. 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 ""
+"Aquest programari es desenvolupa en obert per una comunitat de voluntaris, i es publica sota la llicència %s.\n"
+"\n"
+"Podeu contribuir i ajudar a millorar-lo encara més."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Propietària"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Més informació"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "S'està baixant el catàleg de programari"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "S'està carregant la pàgina"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "S'està iniciant…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Actualitzacions automàtiques en pausa"
+
+#: 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 ""
+"La xarxa actual està limitada. Les connexions limitades tenen límits de dades o càrrecs associats amb ells. Per a estalviar dades, les actualitzacions automàtiques s'han posat en pausa.\n"
+"\n"
+"Les actualitzacions automàtiques es reprendran quan una xarxa no limitada estigui disponible. Fins llavors, podeu instal·lar actualitzacions manualment.\n"
+"\n"
+"Alternativament, si la xarxa actual ha estat identificada incorrectament com a limitada, es pot canviar aquesta configuració."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Obre els _paràmetres de xarxa"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Pàgina de moderació"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "No hi ha ressenyes per a moderar"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Usuari"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Afegits"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Suprimits"
+
+#. 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 "Actualitzacions"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Desactualitzacions"
+
+#. 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 "fonts externes seleccionades"
+
+#. 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 ""
+"Proporciona accés a programari addicional de %s. S'inclou algun programari "
+"propietari."
+
+#. 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 "Habilita"
+
+#. 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 "Explora"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Pàgina de resum"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Voleu habilitar la font de programari de tercers?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Altres categories"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "No s'ha trobat cap descripció detallada de l'aplicació"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Desconeguda"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "L'usuari ha refusat la instal·lació"
+
+#. 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 "Prepara %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 "Esteu segur de voler suprimir el repositori %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Esteu segur que voleu desinstal·lar %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 es desinstal·larà i l'haureu d'instal·lar per a tornar-la a utilitzar."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferències d'actualització"
+
+#: 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 ""
+"Per a evitar costos no desitjats, les actualitzacions automàtiques estan "
+"inhabilitades quan s'està amb una connexió mòbil o limitada."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Actualitzacions automàtiques"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Baixa i instal·la les actualitzacions pendents en segon pla, quan sigui "
+"possible."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificacions de les actualitzacions automàtiques"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostra notificacions quan les actualitzacions s'han instal·lat "
+"automàticament."
+
+#. 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 ""
+"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:4
+msgid "Incompatible Software"
+msgstr "Programari incompatible"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continua"
+
+#. 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 ""
+"El programari que s'ha instal·lat des de «%s» deixarà de rebre "
+"actualitzacions."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Voleu inhabilitar el repositori?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Suprimeix"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Habilita els dipòsits nous"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Aquests repositoris complementen el programari per defecte proveït per %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repositoris de programari"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Cap repositori"
+
+#. 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] "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 repository.
+#: src/gs-repo-row.c:167
+#, 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 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 aplicació"
+msgstr[1] "%u aplicacions"
+
+#. 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 connector"
+msgstr[1] "%u connectors"
+
+#. 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'ha instal·lat %s i %s"
+msgstr[1] "S'han instal·lat %s i %s"
+
+#. 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 "L'odio"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "No m'agrada"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Està bé"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "M'agrada"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "N'estic enamorat"
+
+#. 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 "Preneu-vos més temps per a escriure la ressenya"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Seleccioneu la valoració en estrelles"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "El resum és massa curt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "El resum és massa llarg"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La descripció és massa curta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publica una ressenya"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Publica"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Valoració"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resum"
+
+#: src/gs-review-dialog.ui:97
+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:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Ressenya"
+
+#: src/gs-review-dialog.ui:128
+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ó."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a "
+"href=\"https://odrs.gnome.org/privacy\">privacy policy</a>. The full name "
+"attached to your account will be shown publicly."
+msgstr ""
+"Conegueu quines dades s'envien en la nostra <a "
+"href=\"https://odrs.gnome.org/privacy\">política de privadesa</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Voleu informar d'una ressenya?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Informeu"
+
+#. 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 "Li ha estat útil aquesta ressenya?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sí"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "No"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Pse"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Informeu…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Suprimeix…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Comproveu que confieu en el proveïdor, ja que l'aplicació no està en un "
+"espai aïllat"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Cap permís"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Accés a xarxa"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Sense accés a xarxa"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa serveis del sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa serveis de sessió"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Accés a dispositius"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Sense accés a dispositius"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Accés complet de lectura/escriptura al sistema de fitxers"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Accés de lectura/escriptura a la carpeta de l'usuari"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Accés complet de lectura del sistema de fitxers"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Pot llegir la carpeta de l'usuari"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Accés de lectura/escriptura al directori de baixades"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Accés de lectura al directori de baixades"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Sense accés al sistema de fitxers"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "No pot accedir de cap manera 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:341
+msgid "Proprietary Code"
+msgstr "Codi propietari"
+
+#: 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 ""
+"El codi font no és públic, per això no es pot auditar de manera independent "
+"i podria ser insegur"
+
+#. 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 "Codi auditable"
+
+#: 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 ""
+"El codi font és públic i es pot auditar de forma independent, cosa que fa "
+"que l'aplicació sigui més segura"
+
+#. 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 "El desenvolupador de l'aplicació està verificat"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependències insegures"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 és segur"
+
+#. 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 é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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s és insegur"
+
+#. 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 "Seguretat"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Font"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versió obsoleta de l'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 "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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "No s'ha proporcionat cap captura de pantalla"
+
+#. 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:622
+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:438
+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:650
+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:732
+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:746
+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:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Pàgina de cerca"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Cerca aplicacions"
+
+#: src/gs-search-page.ui:46
+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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+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:1291
+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:1299
+#, 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:1304
+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:1310
+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:1314
+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:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "No s'ha pogut obtenir 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:1371
+#, 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:1377
+#, 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:1389
+#, 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:1395
+#, 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:1401
+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:1406
+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:1410
+#, 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:1416
+#, 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:1422
+#, 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:1428
+#, 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,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, 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. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "No s'ha pogut instal·lar %s: el nivell de la bateria és massa baix"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, 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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "No s'ha pogut actualitzar %s des de %s, ja que ha fallat la baixada"
+
+#. 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 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,
+#. * where the %s is the origin, e.g. "Fedora" or
+#. * "Fedora Project [fedoraproject.org]"
+#: src/gs-shell.c:1509
+#, c-format
+msgid "Unable to install updates from %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
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions, ja que ha fallat la baixada"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions: no hi ha 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:1541
+#, 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
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "No s'han pogut instal·lar les actualitzacions: 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:1554
+#, 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
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions: 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:1567
+#, 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
+#: src/gs-shell.c:1573
+#, c-format
+msgid ""
+"Unable to install updates: you do not have permission to update software"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions: 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:1582
+#, 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. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions: cal estar connectat al "
+"corrent"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "No s'ha pogut actualitzar %s: el nivell de la bateria és massa baix"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr ""
+"No s'han pogut instal·lar les actualitzacions: el nivell de la bateria és "
+"massa baix"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "No s'han pogut instal·lar les actualitzacions"
+
+#. 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:1658
+#, 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:1663
+#, 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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+msgstr ""
+"No s'ha pogut actualitzar a %s: 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:1679
+#, 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:1686
+#, 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:1692
+#, 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:1698
+#, 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:1704
+#, 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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "No s'ha pogut actualitzar %s: el nivell de la bateria és massa baix"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, 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:1756
+#, 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:1761
+#, 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:1766
+#, 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:1772
+#, 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:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "No s'ha pogut suprimir %s: el nivell de la bateria és massa baix"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, 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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "S'ha produït un error"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "No s'ha pogut instal·lar el fitxer: no és compatible"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+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
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "No s'ha pogut instal·lar: no és compatible"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "S'ha produït un error en instal·lar: 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:1961
+#, 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 application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Cal reiniciar el programa per a utilitzar els nous connectors."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Cal estar connectat al corrent"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "El nivell de la bateria és massa baix"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Repositoris de programari"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Preferències d'actualització"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examina el disc"
+
+#. 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 "Paràmetres de xarxa"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reinicia ara"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Més informació"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Cerca"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menú principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "_Descobriu-ne més"
+
+#. 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 "Actualitzacions"
+
+#. 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 "Application Data"
+msgstr "Dades de l'aplicació"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Components de sistema compartits necessaris per aquesta aplicació"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Desconeguda"
+
+#. 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 "Emmagatzematge"
+
+#. 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 <a href=\"dummy\">_application "
+"settings</a>."
+msgstr ""
+"Les dades emmagatzemades en memòria cau es poden netejar des dels <a "
+"href=\"dummy\">_paràmetres de l'aplicació</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (instal·lat)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (s'està instal·lant)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (s'està suprimint)"
+
+#. 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 "Actualitzacions instal·lades"
+
+#. 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 "Instal·lat al %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "No s'han instal·lat actualitzacions"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Les actualitzacions de programari estan obsoletes"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Comprova si hi ha actualitzacions."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Actualització de programari crítica a punt per a instal·lar"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr ""
+"Hi ha una actualització de programari important a punt per a ser "
+"instal·lada."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Actualitzacions de programari crítiques disponibles per a descarregar"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr ""
+"Important: les actualitzacions de programari crítiques estan esperant."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Actualitzacions de programari a punt per a instal·lar"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr ""
+"Les actualitzacions de programari estan esperant i a punt per a ser "
+"instal·lades."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Actualitzacions de programari disponibles per a descarregar"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Baixa les actualitzacions de programari en espera."
+
+#. 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 aplicació actualitzada. Cal reiniciar"
+msgstr[1] "%u aplicacions actualitzades. Cal reiniciar"
+
+#. 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 aplicació actualitzada"
+msgstr[1] "%u aplicacions actualitzades"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s s'ha actualitzat."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Reinicieu l'aplicació."
+
+#. 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 s'han actualitzat."
+
+#. 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 aplicació requereix un reinici."
+msgstr[1] "%u aplicacions requereixen un reinici."
+
+#. 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 "Inclou %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 "Hi ha actualitzacions del sistema operatiu disponibles"
+
+#. 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 "Actualitzeu-vos per a 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:728
+#, 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:732
+msgid "Software Upgrade Available"
+msgstr "Hi ha actualitzacions disponibles"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+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:1139
+msgid "An important operating system update failed to be installed."
+msgstr ""
+"No s'ha pogut realitzar una actualització important del sistema operatiu."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostra els detalls"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Revisa"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Darrera comprovació: %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 ja no és compatible."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "El vostre sistema operatiu ja no és compatible."
+
+#. 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 "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:572
+msgid "It is recommended that you upgrade to a more recent version."
+msgstr "Us 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:849
+msgid "Charges May Apply"
+msgstr "Es poden aplicar càrrecs"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Comprova-ho de totes maneres"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Sense xarxa"
+
+#. 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 ""
+"Es requereix accés a Internet per a comprovar si hi ha actualitzacions."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Comprova si hi ha actualitzacions"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Actualitzacions"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Pàgina d'actualitzacions"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "S'estan carregant les actualitzacions…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Està al dia"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Utilitza dades mòbils?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Comprova de totes formes"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Sense connexió"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Connecteu-vos per a comprovar si hi ha actualitzacions."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Paràmetres de la _xarxa"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Error"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Les actualitzacions es gestionen automàticament."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reinicia i actualitza"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Actualitza-ho tot"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Actualitzacions d'aplicacions"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Microprogramari del dispositiu"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponible"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Apreneu sobre la versió nova"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "S'està baixant…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% baixat"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reinicia i actualitza"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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;Repositoris;Preferències;Instal·lació;Desinstal·lació;Aplicació;Programa;Apli;Botiga;"
+
+#. 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 "Actualitzacions del sistema"
+
+#. 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 ""
+"Actualitzacions del sistema generals, com ara correccions de seguretat o "
+"errors, i millores de rendiment."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "S'estan baixant les imatges destacades…"
+
+#. 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 "Actualització %s amb noves característiques i correccions."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+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:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Carpeta del sistema %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subcarpeta d'usuari %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Carpetes del sistema d'amfitrió"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuració del sistema d'amfitrió des de /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Carpeta d'escriptori"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subcarpeta d'escriptori %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Carpeta de documents"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subcarpeta de documents %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Carpeta de música"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subcarpeta de música %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Carpeta d'usuari"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subcarpeta d'imatges %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Carpeta de compartició pública"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subcarpeta de compartició pública %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Carpeta de vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subcarpeta de vídeo %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Carpeta de plantilles"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Subcarpeta de plantilles %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Carpeta de la memòria cau de l'usuari"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subcarpeta de memòria cau d'usuari %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Carpeta de configuració de l'usuari"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subcarpeta de configuració de l'usuari %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Carpeta de dades d'usuari"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subcarpeta de dades d'usuari %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Carpeta d'execució de l'usuari"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subcarpeta d'execució d'usuari %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "S'estan obtenint les metadades del flatpak per a %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Actualització TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Actualització del receptor USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "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:148
+msgid "Install Unsigned Software?"
+msgstr "Voleu instal·lar programari de tercers?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Voleu baixar el programari sense signar?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Voleu actualitzar el programari no signat?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paquets"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
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 <jmas@softcatala.org>, 2013, 2015, 2016, 2017
+# Gil Forcada <gilforcada@guifi.net>, 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 <xavi.ivars@gmail.com>\n"
+"Language-Team: Catalan <tradgnome@softcatala.org>\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 <jmas@softcatala.org>, 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s no és <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">programari lliure o de codi obert</a>, 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 <jwtiyar@gmail.com>, 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 <kurdish-ckb@zkurd.org>\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 <jwtiyar@gmail.com>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+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..8238ea5
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,5328 @@
+# 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 <pknbe@volny.cz>, 2015.
+# Marek Černocký <marek@manet.cz>, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
+# Vojtěch Perník <translations@pervoj.cz>, 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: 2022-10-21 17:04+0000\n"
+"PO-Revision-Date: 2022-08-28 11:45+0200\n"
+"Last-Translator: Vojtěch Perník <translations@pervoj.cz>\n"
+"Language-Team: Czech <gnome-cs-list@gnome.org>\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.1.1\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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"Čí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:81
+msgid "The server to use for application reviews"
+msgstr "Server, který se má používat pro recenze aktualizací"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Minimální karma pro recenze"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Nabízet povýšení na předběžná vydání"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+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:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "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 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 "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:1027
+#, 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:1031
+#, 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 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 "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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Vhodné od věku"
+
+#: 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 "Jak přidat chybějící informace"
+
+#: lib/gs-app.c:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+msgid "Package"
+msgstr "Balíček"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Čeká na zpracování"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Čeká na instalaci"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Čeká na odebrání"
+
+#: 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 "Nainstalováno"
+
+#. 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 "Instaluje se"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Odebírá se"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Odinstalovat"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Síť"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Může komunikovat přes síť"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Služby systému"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Služby sezení"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Zařízení"
+
+#: src/gs-app-details-page.c:71
+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:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Domovská složka"
+
+#: 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 "Může zobrazovat, upravovat a vytvářet soubory"
+
+#: 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 "Může zobrazovat soubory"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Složka se staženými soubory"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Nastavení"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Může zobrazovat a měnit libovolná nastavení"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Zastaralý zobrazovací systém"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Používá starý, ne zcela bezpečný, zobrazovací systém"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Opuštění izolovaného prostředí"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Může opustit izolované prostředí a obejít další omezení"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Podrobnosti o aktualizaci"
+
+#. 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 "Není k dispozici žádný popis aktualizace."
+
+#: 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 "Přejít zpět"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Vyžaduje dodatečná oprávnění"
+
+#. 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 "Recenze"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Pro tuto aplikaci nebyly nalezeny žádné recenze."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Bez recenzí"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Historie verzí"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novinky ve verzi %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Verze %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Zobrazit místní soubor metainfo nebo appdata"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Zobrazovat podrobné ladicí informace"
+
+#: 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 update preferences"
+msgstr "Zobrazit předvolby aktualizací"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016 – 2022 přispěvatelé Softwaru GNOME"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Marek Černocký <marek@manet.cz>\n"
+"Vojtěch Perník <translations@pervoj.cz>"
+
+#. 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 aplikaci Software"
+
+#. 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 "Elegantní způsob správy softwaru ve vašem počítači."
+
+#. 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 "Omlouváme se, ale pro tuto aplikaci nejsou k dispozici detaily."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Může přistupovat k hardwarový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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Může přistupovat k libovolný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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Může získat libovolná oprávnění"
+
+#. 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 "Zkontrolováno vaší distribucí"
+
+#. 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 "Poskytováno třetí stranou"
+
+#. 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 "Uzavřený 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 "Otevřený kód"
+
+#. 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 "Vývojář softwaru je ověřený"
+
+#. 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 "Software není nadále podporován"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Nebezpečné"
+
+#: 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 "Jen pro mobilní zařízení"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Funguje pouze na malé obrazovce"
+
+#: 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 "Pouze pro PC"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Funguje pouze na velké obrazovce"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Nesoulad velikosti obrazovky"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Nepodporuje vaši současnou velikost obrazovky"
+
+#: 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 "Vyžaduje dotykovou obrazovku"
+
+#: 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 "Vyžaduje klávesnici"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Vyžaduje myš"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Vyžaduje herní ovladač"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptivní"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funguje na telefonech, tabletech a PC"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Pravděpodobně vyžaduje klávesnici nebo myš"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Neobsahuje žádný věkově nevhodný obsah"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Navštívit webové stránky"
+
+#. 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 "Instalovat…"
+
+#. 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 "Zrušit"
+
+#. 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 "Instalovat"
+
+#. 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 "Aktualizovat"
+
+#. 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 "Odinstalovat"
+
+#. 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 "Odinstalovává se"
+
+#. 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 "Zařízení nelze během aktualizace používat."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Přejmenováno z %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Pomozte přeložit %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 ""
+"Aplikace %s je navržena, vyvinuta a přeložena mezinárodní komunitou "
+"dobrovolníků.\n"
+"\n"
+"To znamená, že i když ještě není k dispozici ve vašem jazyce, můžete se "
+"zapojit a pomoci s jeho překladem."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "Překlady"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Stránka překladu"
+
+#. 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 "Vyžadováno přihlášení vzdáleným %s (sféra %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Vyžadováno přihlášení"
+
+#: 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 "_Zrušit"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "Přih_lásit"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Uživatel"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Heslo"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nové a aktualizované"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Ostatní"
+
+#. 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 "Zadejte prosím číslo 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 "Vyberte aplikaci:"
+
+#: 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 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 "Aplikace %s je nyní nainstalována"
+
+#. 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 "Aby se změny projevily, je zapotřebí provést restart."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Systémové aktualizace jsou nyní nainstalované"
+
+#. 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 "Nedávno nainstalované aktualizace jsou k dispozici pro recenze"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Restartovat"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Spustit"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalovat software třetí strany?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Povolit repozitář softwaru třetí strany?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s není <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">svobodný a otevřený software</a> a poskytuje jej „%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 poskytuje „%s“."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Příště nevarovat"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+msgid "Enable and Install"
+msgstr "Povolit a nainstalovat"
+
+#. 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 "Dále jsou uvedeny podrobnosti o chybě získané od správy balíčků:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Podrobnosti"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Přijmout"
+
+#. 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] "Aktualizace byla nainstalována"
+msgstr[1] "Aktualizace byly nainstalovány"
+msgstr[2] "Aktualizace byly nainstalovány"
+
+#. 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] "Aplikace byla odebrána"
+msgstr[1] "Aplikace byly odebrány"
+msgstr[2] "Aplikace byly odebrány"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Nyní ne"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "právě teď"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Zobrazit _více"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Zobrazit _méně"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Odebírá se…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Vyžaduje restart k dokončení instalace"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Probíhá aktualizace…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Připravuje se…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Odinstalovává se…"
+
+#. 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 "_Instalovat"
+
+#: src/gs-details-page.c:886
+msgid "_Restart"
+msgstr "_Restartovat"
+
+#. 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 "_Instalovat…"
+
+#. 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 "Co dalšího nabízí %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+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:1734 src/gs-details-page.c:1750
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nelze najít „%s“"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Stránka s podrobnostmi"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Načítají se podrobnosti o aplikaci…"
+
+#: src/gs-details-page.ui:77
+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ě."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "_Pomoci přeložit"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Otevřít"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Aktualizovat"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Stahuje se"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Doplňky"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Vybrané doplňky budou nainstalovány spolu s aplikací."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Součástí je repozitář softwaru"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Součástí není žádný repozitář softwaru"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Rozpoznán repozitář softwaru"
+
+#: src/gs-details-page.ui:642
+msgid ""
+"Adding this software repository will give you access to additional software "
+"and upgrades."
+msgstr ""
+"Přídáním tohoto repozitáře softwaru získáte přístup k dalšímu softwaru a "
+"aktualizacím."
+
+#: src/gs-details-page.ui:643
+msgid "Only use software repositories that you trust."
+msgstr "Používejte pouze repozitáře softwaru, kterým věříte."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Žádná metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "_Webové stránky projektu"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "Věnovat _dar"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Přispět k překladu"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Nahlásit chybu"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Nápověda"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:907
+msgid "_Write Review"
+msgstr "Nap_sat recenzi"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+msgid "All Reviews"
+msgstr "Všechny recenze"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:272
+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: 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] "Dostupné fonty pro písmo %s"
+msgstr[1] "Dostupné fonty pro písma %s"
+msgstr[2] "Dostupné fonty pro písma %s"
+
+#. 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] "Dostupný software pro kodek %s"
+msgstr[1] "Dostupný software pro kodeky %s"
+msgstr[2] "Dostupný software pro kodeky %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Požadovaný software nebyl nalezen"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s nebyl nalezen"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "na webových stránkách"
+
+#. 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 "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: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 ""
+"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 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 "Pro podporu %s nejsou k dispozici žádné aplikace."
+
+#. 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 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: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 ""
+"Informace o formátu %s, včetně toho, jak získat aplikaci, který umí tento "
+"tento formát podporovat, najdete %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, 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:874
+#, c-format
+msgid "%s file format"
+msgstr "formát souboru %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Nelze najít požadovaný software"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Stránka kodeků"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Podpora pro PC"
+
+#: 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 "Podporuje použití na velké obrazovce"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Neznámá podpora pro PC"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Vyžaduje velkou obrazovku"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Nepodporuje stolní počítače"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Nelze použít na velké obrazovce"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Podpora pro mobilní zařízení"
+
+#: 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 "Podporuje použití na malé obrazovce"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Neznámá podpora pro mobilní zařízení"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Vyžaduje malou obrazovku"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Nepodporuje mobily"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Nelze použít na malé obrazovce"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Podpora klávesnice"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Neznámá podpora klávesnice"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Vyžaduje klávesnici"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Podporuje klávesnice"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Nepodporuje klávesnici"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Nelze použít s klávesnicí"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Podpora myši"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Vyžaduje myš nebo ukazovátko"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Neznámá podpora myši"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Vyžaduje myš"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Podporuje myši a ukazovátka"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Nepodporuje myš"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Podpora dotykové obrazovky"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Neznámá podpora dotykové obrazovky"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Vyžaduje dotykovou obrazovku"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Podporuje dotykové obrazovky"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Nepodporuje dotykovou obrazovku"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Nelze použít s dotykovou obrazovkou"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Vyžadován herní ovladač"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Vyžaduje herní ovladač"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Podpora herního ovladače"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "Aplikace %s na tomto zařízení 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Podpora hardwaru"
+
+#. 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 "Nainstalováno"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Stránka s nainstalovanými"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplikace"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Webové aplikace"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Systémové aplikace"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Vybudováno komunitou"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Tento software je vyvíjen otevřeně komunitou dobrovolníků a je uvolněn pod "
+"<a href=\"%s\">licencí %s</a>.\n"
+"\n"
+"Můžete přispět a pomoci jej ještě vylepšit."
+
+#. 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 ""
+"Tento software je vyvíjen otevřeně komunitou dobrovolníků a je uvolněn pod "
+"licencí %s.\n"
+"\n"
+"Můžete přispět a pomoci jej ještě vylepšit."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Uzavřený software"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "Zjistit _více"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Stahuje se katalog softwaru"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Načítá se stránka"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Spouští se…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatické aktualizace jsou pozastaveny"
+
+#: 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 ""
+"Současná síť používá měřené připojení. Ta mívají 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"
+"Jakmile bude dostupné neměřené připojení, budou automatické aktualizace "
+"pokračovat. Do té doby je stále možné instalovat aktualizace ručně.\n"
+"\n"
+"Případně, pokud bylo současné připojení určeno nesprávně jako měřené, lze to "
+"změnit nastavením."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Otevřít nastavení _sítě"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Stránka pro moderování"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Nejsou k dispozici žádné recenze k moderování"
+
+#: 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: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 "Uživatel"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+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:254
+msgid "Removals"
+msgstr "Odstraňování"
+
+#. 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 "Aktualizace"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Ponižování"
+
+#. 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 "vybraných externích zdrojů"
+
+#. 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 ""
+"Poskytuje přístup k dalšímu softwaru z %s. Součástí je i některý uzavřený "
+"software."
+
+#. 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 "Povolit"
+
+#. 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 "Procházet"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Stránka s přehledem"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Povolit repozitáře softwaru třetích stran?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Ostatní kategorie"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "O aplikaci nebyly nalezeny žádné informace"
+
+#: lib/gs-plugin-loader.c:2829
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "neznámá"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Uživatel odmítl instalaci"
+
+#. 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 "Příprava aplikace %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 "Opravdu chcete odebrat repozitář %s?"
+
+#. 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 ""
+"Všechny aplikace pocházející ze 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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Opravdu chcete odinstalovat %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 ""
+"Odinstaluje se %s a když jej budete chtít v budoucnu znovu použít, budete "
+"muset provést novou instalaci."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Předvolby aktualizací"
+
+#: 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 ""
+"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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatické aktualizace"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Stahuje a instaluje aktualizace softwaru na pozadí, pokud je to možné."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Oznamovat automatické aktualizace"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Zobrazovat oznámení, když jsou automaticky nainstalovány aplikace."
+
+#. 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 ""
+"Některý z právě instalovaného softwaru není kompatibilní s distribucí %s. "
+"Pokud budete pokračovat, následujíc se během povýšení odstraní:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Nekompatibilní software"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Pokračovat"
+
+#. 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 ""
+"Software, který byl nainstalován z „%s“, přestane dostávat aktualizace."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Zakázat repozitář?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Odebrat"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Povolit nové repozitáře"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Softwarové repozitáře"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Žádné repozitáře"
+
+#. 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] "Nainstalována %u aplikace"
+msgstr[1] "Nainstalovány %u aplikace"
+msgstr[2] "Nainstalováno %u aplikací"
+
+#. 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] "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 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 aplikace"
+msgstr[1] "%u aplikace"
+msgstr[2] "%u aplikací"
+
+#. 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 doplněk"
+msgstr[1] "%u doplňky"
+msgstr[2] "%u doplňků"
+
+#. 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 a %s"
+msgstr[1] "%s a %s"
+msgstr[2] "%s a %s"
+
+#. 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 "Nenávidím ji"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Nemám ji rád"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Běžná aplikace"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Mám ji rád"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Zbožňuji ji"
+
+#. 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 "Věnujte prosím trochu času napsaní recenze"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+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:130
+msgid "The summary is too long"
+msgstr "Celkové hodnocení je příliš dlouhé"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Recenze je příliš krátká"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Příspěvek do recenzí"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Odeslat"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Hodnocení"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Celkový dojem"
+
+#: src/gs-review-dialog.ui:97
+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“."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Recenze"
+
+#: src/gs-review-dialog.ui:128
+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í."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Najděte si v našich <a href=\"https://odrs.gnome.org/privacy\">zásadách "
+"soukromí</a>, 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Nahlásit recenzi?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Nahlásit"
+
+#. 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 "Byla pro vás tato recenze přínosná?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ano"
+
+#: 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 "Nezájem"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Nahlásit…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Odebrat…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Zkontrolujte si, že důvěřujete dodavateli, protože aplikace není v "
+"izolovaném prostředí."
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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."
+
+#. 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 "Žádná oprávnění"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Přístup k síti"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Žádný přístup k síti"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Využívá služby systému"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Využívá služby sezení"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Přístup k zařízení"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Žádný přístup k zařízení"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Přístup k domovské složce pro čtení/zápis"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Plný přístup k souborovému systému pro čtení"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Přístup k domovské složce pro čtení"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+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:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Přístup ke složce se staženými soubory pro čtení"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Žádný přístup k souborovému systému"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Vůbec nemůže přistupovat k souborovému systému"
+
+#. 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 "uzavřená"
+
+#: 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 ""
+"Zdrojový kód není veřejný, takže jej nelze nezávisle zkontrolovat a může být "
+"nebezpečný."
+
+#. 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 "otevřený kód"
+
+#: 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 ""
+"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: 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 "Vývojář aplikace je ověřený"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Bezpečnostní rizika v závislostech"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 "Aplikace %s je 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:383
+#, 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "Aplikace %s je nebezpečná"
+
+#. 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 "Bezpečnost"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Zdroj"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Zastaralá verze 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 "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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Nemá snímek obrazovky"
+
+#. 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 "Snímek nebyl nalezen"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+msgid "Screenshot not valid"
+msgstr "Snímek není platný"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:797
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Stránka hledání"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Hledat aplikace"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Nelze stáhnout aktualizace"
+
+#. 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 ""
+"Nelze stáhout aktualizace: přístup k internetu je nezbytný, ale není k "
+"dispozici"
+
+#. 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 "Nelze stáhnout aktualizace z %s: není dostatek místa na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nelze stáhnout aktualizace: není dostatek místa na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Nelze stáhnout aktualizace: je vyžadováno ověření"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nelze stáhnout aktualizace: ověření nebylo platné"
+
+#. 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 "Nelze stáhnout aktualizace: nemáte oprávnění instalovat software"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Nelze získat seznam aktualizací"
+
+#. 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 "Nelze nainstalovat balíček %s, protože selhalo jeho stažení z %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 "Nelze nainstalovat balíček %s, protože selhalo stažení"
+
+#. 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 ""
+"Nelze nainstalovat balíček %s, protože není k dispozici běhové prostředí %s"
+
+#. 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 "Nelze nainstalovat balíček %s, protože není podporovaný"
+
+#. 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 ""
+"Nelze nainstalovat: přístup k internetu je nezbytný, ale není k dispozici"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nelze nainstalovat: aplikace má neplatný formát"
+
+#. 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 "Nelze nainstalovat balíček %s: není dostatek místa na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Nelze nainstalovat balíček %s: je vyžadováno ověření"
+
+#. 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 "Nelze nainstalovat balíček %s: ověření nebylo platné"
+
+#. 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 "Nelze nainstalovat balíček %s: nemáte oprávnění k instalaci softwaru"
+
+#. 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 "Nelze nainstalovat balíček %s: je vyžadováno připojené napájení"
+
+#. 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 "Nelze nainstalovat balíček %s: úroveň nabití baterie je příliš nízká"
+
+#. 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 "Nelze nainstalovat balíček %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 "Nelze aktualizovat balíček %s z %s, protože selhalo stažení"
+
+#. 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 "Nelze aktualizovat balíček %s, protože 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Nelze nainstalovat aktualizace z %s, protože selhalo stažení"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nelze nainstalovat aktualizace, protože selhalo stažení"
+
+#. 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 ""
+"Nelze aktualizovat: přístup k internetu je nezbytný, ale není k dispozici"
+
+#. 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 "Nelze aktualizovat balíček %s: nedostatek místa na disku"
+
+#. 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 "Nelze nainstalovat aktualizace: nedostatek místa na disku"
+
+#. 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 "Nelze aktualizovat balíček %s: je vyžadováno ověření"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nelze nainstalovat aktualizace: je vyžadováno ověření"
+
+#. 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 "Nelze aktualizovat balíček %s: ověření bylo neplatné"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Nelze nainstalovat aktualizace: ověření bylo neplatné"
+
+#. 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 "Nelze aktualizovat balíček %s: nemáte oprávnění k aktualizaci softwaru"
+
+#. 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 ""
+"Nelze nainstalovat aktualizace: nemáte oprávnění k aktualizaci softwaru"
+
+#. 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 ""
+"Nelze aktualizovat balíček %s: je vyžadováno napájení z elektrické sítě"
+
+#. 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 ""
+"Nelze nainstalovat aktualizace: je vyžadováno napájení z elektrické sítě"
+
+#. 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 "Nelze aktualizovat balíček %s: úroveň nabití baterie je příliš nízká"
+
+#. 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 "Nelze nainstalovat aktualizace: úroveň nabití baterie je příliš nízká"
+
+#. 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 "Nelze aktualizovat balíček %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nelze nainstalovat aktualizace"
+
+#. 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 "Nelze povýšit na %s z %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 "Nelze povýšit na %s, protože selhalo stažení"
+
+#. 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 ""
+"Nelze povýšit na %s: přístup k Internetu je nezbytný a přitom není k "
+"dispozici"
+
+#. 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 "Nelze povýšit na %s: 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nelze povýšit na %s: 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Nelze povýšit na %s: ověření nebylo platné"
+
+#. 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 "Nelze povýšit na %s: nemáte oprávnění k povyšování"
+
+#. 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 "Nelze povýšit na %s: je vyžadováno připojené napájení"
+
+#. 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 "Nelze povýšit na %s: úroveň nabití baterie je příliš nízká"
+
+#. 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 "Nelze povýšit 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 "Nelze odstranit balíček %s: je vyžadováno ověření"
+
+#. 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 "Nelze odstranit balíček %s: ověření nebylo platné"
+
+#. 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 "Nelze odstranit balíček %s: nemáte oprávnění k odstranění softwaru"
+
+#. 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 "Nelze odstranit balíček %s: je vyžadováno připojené napájení"
+
+#. 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 "Nelze odstranit balíček %s: úroveň nabití baterie je příliš nízká"
+
+#. 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 "Nelze odstranit balíček %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 "Nelze spustit aplikaci %s: balíček %s není nainstalovaný"
+
+#. 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 "Litujeme, ale něco se stalo špatně"
+
+#. 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 ""
+"Nebyl dostatek místa na disku – uvolněte nějaké místo a pak to zkuste znovu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Selhala instalace souboru: není podporován"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1891
+msgid "Failed to install file: authentication failed"
+msgstr "Selhala instalace souboru: selhalo ověření"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1926
+msgid "Failed to install: not supported"
+msgstr "Selhala instalace: není podporováno"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1929
+msgid "Failed to install: authentication failed"
+msgstr "Selhala instalace: selhalo ověření"
+
+#. 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 "Nelze kontaktovat %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 ""
+"Aplikace Software musí být restartována, aby mohla používat nový zásuvný "
+"modul."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1984
+msgid "AC power is required"
+msgstr "Je vyžadováno připojené napájení"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "Úroveň nabití baterie je příliš nízká"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Softwarové repozitáře"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Předvolby akt_ualizací"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Prozkoumat 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 "Nastavení sítě"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Restartovat hned"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Další informace"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Hledat"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Hlavní nabídky"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Dozvědět se _více…"
+
+#. 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 "Aktualizace"
+
+#. 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 "Žádná"
+
+#: src/gs-storage-context-dialog.c:139
+msgid "Application Data"
+msgstr "Data aplikace"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Úložiště"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Data uložená v mezipaměti lze vymazat v <a href=\"dummy\">_nastavení "
+"aplikace</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (nainstalováno)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (instaluje se)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (odebírá se)"
+
+#. 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 "Instalované aktualizace"
+
+#. 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 "Nainstalováno %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Nejsou nainstalovány žádné aktualizace"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Údaje o aktualizacích softwaru jsou zastaralé"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Zkontrolujte prosím stav aktualizací softwaru."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "K instalaci je připravena kritická aktualizace softwaru."
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "K instalaci je připravena důležitá aktualizace softwaru."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Ke stažení jsou k dispozici kritické aktualizace softwaru"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Důležité: čekají kritické aktualizace softwaru."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Aktualizace softwaru jsou připravené k instalaci."
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Aktualizace softwaru čekají a jsou připravené k instalaci."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Ke stažení jsou k dispozici aktualizace softwaru."
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Stáhněte prosím čekající aktualizace softwaru."
+
+#. 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] "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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications 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 application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "Aplikace %s byla aktualizována."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Restartujte ji prosím."
+
+#. 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 "Aplikace %s a %s byly aktualizovány."
+
+#. 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 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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:401
+#, 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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Aktualizace operačního systému nejsou dostupné"
+
+#. 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 "Povýšit, aby byly nadále přijímány bezpečnostní aktualizace."
+
+#. 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 "K instalaci je dostupná nová verze distribuce %s"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Dostupné povýšení softwaru"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Aktualizace softwaru selhaly"
+
+#. 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 "Selhala instalace důležité aktualizace operačního systému."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Zobrazit podrobnosti"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Přehled"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Aktualizace selhala"
+
+#. 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 "Systém již byl aktuální."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Poslední kontrola: %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 "Systém %s %s již není podporován."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Váš operační systém není nadále podporován."
+
+#. 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 ""
+"Znamená to, že pro něj již nadále nejsou poskytovány bezpečnostní opravy."
+
+#. 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 "Doporučuje se povýšit na nejnovější verzi."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Možné zpoplatnění"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Přesto zkontrolovat"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Žádné připojení k síti"
+
+#. 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 "Přístup k internetu je nezbytný pro kontrolu aktualizací."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Zkontrolovat aktualizace"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Aktualizace"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Stránka s aktualizacemi"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Načítají se aktualizace…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Aktuální"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Použít mobilní data?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Přesto zkontrolovat"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Žádné připojení"
+
+#: src/gs-updates-page.ui:263
+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:266
+msgid "_Network Settings"
+msgstr "_Nastavení sítě"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Chyba"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Aktualizace jsou spravovány automaticky."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Restartovat a aktualizovat"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Aktualizovat vše"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Aktualizace aplikací"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware zařízení"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "Je k dispozici %s"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Přečíst si o nové verzi"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Stahuje se…"
+
+#. 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 "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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Staženo %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Restartovat a aktualizovat"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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 ""
+"aktualizace;povýšení;zdroje;repozitáře;předvolby;nastavení;instalace;"
+"odinstalace;odebrání;program;software;aplikace;obchod;"
+
+#. 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 "Aktualizace systému"
+
+#. 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 ""
+"Obecné aktualizace systému, jako jsou bezpečnostní opravy, opravy chyb a "
+"vylepšení výkonu."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Stahují se obrázky k významným aplikacím…"
+
+#. 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 "Aktualizace %s s novými funkcemi a opravami."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "Web GNOME"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Stahují se informace o povýšení…"
+
+#. 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 ""
+"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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Systémová složka %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Podsložka %s v domovské složce"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Složky hostitelského systému"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Konfigurace hostitelského systému z /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Složka plochy"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Podsložka %s ve složce plochy"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Složka dokumentů"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Podsložka %s ve složce dokumentů"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Složka hudby"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Podsložka %s ve složce hudby"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Složka obrázků"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Podsložka %s ve složce obrázků"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Složka veřejně sdílených"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Podsložka %s ve složce veřejně sdílených"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Složka videí"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Podsložka %s ve složce videí"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Složka šablon"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Podsložka %s ve složce šablon"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Složka uživatelské mezipaměti"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Podsložka %s ve složce uživatelské mezipaměti"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Složka uživatelské konfigurace"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Podsložka %s ve složce uživatelské konfigurace"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Složka uživatelských dat"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Podsložka %s ve složce uživatelských dat"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Uživatelská složka pro běh aplikací"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, 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:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Získávají se metadata Flatpak pro %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Selhalo přídání doplňku „%s“ k nainstalování: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, 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: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 ""
+"Vzdálený server „%s“ nedovoluje instalaci „%s“, pravděpodobně kvůli svému "
+"filtru. Odstraňte filtr a instalaci zopakujte. Podrobnosti chyby: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Aktualizace přijímače USB pro %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Nainstalovat nepodepsaný software?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Stáhnout nepodepsaný software?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Aktualizovat nepodepsaný software?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Balíčky"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..b7c40b0
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,5962 @@
+# 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 <joedalton2@yahoo.dk>, 2013.
+# Kris Thomsen <mail@kristhomsen.dk>, 2013-2017.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2014.
+# Alan Mortensen <alanmortensen.am@gmail.com>, 2018-22.
+# scootergrisen, 2019-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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-08-27 15:31+0200\n"
+"Last-Translator: Alan Mortensen <alanmortensen.am@gmail.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\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 2.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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME-projektet"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr "Tidsstemplet da systemet senest var online og modtog opdateringer"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Serveren, som bruges til programanmeldelser"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Mindste karmascore for anmeldelser"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Tillad adgang til dialogen Softwarearkiver"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Tilbyd opgraderinger ved før-udgivelser"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://da.wikipedia.org/wiki/Propriet%C3%A6r_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Software AppStream-installeringsprogram på systemniveau"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Aldersvurdering"
+
+#: 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 "Bidrag med manglende information"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pakke"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Venter"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Afventer installering"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Afventer fjernelse"
+
+#: 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 "Installeret"
+
+#. 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 "Installerer"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Fjerner"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "A_finstallér"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Netværk"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Kan kommunikere over netværket"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Systemtjenester"
+
+#: src/gs-app-details-page.c:69
+msgid "Can access D-Bus services on the system bus"
+msgstr "Kan tilgå D-Bustjenester på systembussen"
+
+#: src/gs-app-details-page.c:70
+msgid "Session Services"
+msgstr "Sessionstjenester"
+
+#: src/gs-app-details-page.c:70
+msgid "Can access D-Bus services on the session bus"
+msgstr "Kan tilgå D-Bustjenester på sessionsbussen"
+
+#: src/gs-app-details-page.c:71
+msgid "Devices"
+msgstr "Enheder"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Kan tilgå filer på systemenheden"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Hjemmemappe"
+
+#: 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 "Kan se, redigere og oprette filer"
+
+#: 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 "Kan se filer"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Mappe til hentede filer"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Indstillinger"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Kan se og ændre alle indstillinger"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Forældet system til visning"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Bruger et gammelt, usikkert system til visning"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Sandkasse-undvige"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Kan undvige sandkassen og omgå andre begrænsninger"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Opdateringsdetaljer"
+
+#. 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 "Ingen opdateringsbeskrivelse tilgængelig."
+
+#: 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 "Gå tilbage"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Kræver flere rettigheder"
+
+#. 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 "Anmeldelser"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Der er ingen anmeldelser af dette program."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Ingen anmeldelser"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versionshistorik"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nyt i version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Vis en lokal metainfo- eller appdata-fil"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Vis udvidet fejlsøgningsinformation"
+
+#: 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 update preferences"
+msgstr "Vis opdateringsindstillinger"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Ophavsret © 2016–2022 bidragyderne til GNOME Software"
+
+#: src/gs-application.c:263 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 <dansk@dansk-gruppen.dk>"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Om Software"
+
+#. 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 "En god måde at håndtere softwaren på dit system."
+
+#. 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 "Beklager! Der er ingen detaljer om programmet."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Kan tilgå hardwareenheder"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Kan tilgå vilkårlige 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Kan opnå vilkårlige rettigheder"
+
+#. 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 "Gennemset af din distribution"
+
+#. 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 "Leveret af tredjepart"
+
+#. 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 "Proprietær kode"
+
+#. 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 "Kode kan auditeres"
+
+#. 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 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 "Programmet understøttes ikke længere"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Usikker"
+
+#: 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 "Kun mobil"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Virker kun på en lille skærm"
+
+#: 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 "Kun stationær"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Virker kun på en stor skærm"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Skærmstørrelse passer ikke"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Understøtter ikke den aktuelle skærmstørrelse"
+
+#: 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 "Kræver en berøringsfølsom skærm"
+
+#: 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 "Kræver et tastatur"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Kræver en mus"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Gamepad nødvendig"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Tilpassende"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Virker på mobiler, tablets og stationære"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Kræver sandsynligvis tastatur eller mus"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Indeholder ikke noget aldersupassende indhold"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Besøg websted"
+
+#. 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 "Installér …"
+
+#. 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 "Annullér"
+
+#. 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 "Installér"
+
+#. 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 "Opdatér"
+
+#. 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 "Afinstallér"
+
+#. 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 "Afinstallerer"
+
+#. 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 "Enhed kan ikke bruges under opdatering."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Omdøbt fra %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Hjælp med at oversætte %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 er designet, udviklet og oversat af en international gruppe frivillige.\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:5
+msgid "Translations"
+msgstr "Oversættelser"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Websted til oversættelser"
+
+#. 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 "Login krævet til fjern %s (domæne %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Login kræves"
+
+#: 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 "_Annullér"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Login"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Bruger"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "A_dgangskode"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nye og opdaterede"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Andre programmer"
+
+#. 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 "Vælg venligst et tal mellem 1 og %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Vælg et program:"
+
+#: 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 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 nu installeret"
+
+#. 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 "Der kræves en genstart, før ændringerne træder i kraft."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Systemopdateringer er nu installeret"
+
+#. 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 "Nyligt installerede opdateringer er tilgængelige for gennemsyn"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Genstart"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Kør"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Installér tredjeparts-software?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Aktivér softwarearkiver fra tredjepart?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s er ikke <a href=\"https://da.wikipedia.org/wiki/Free/"
+"Libre_and_Open_Source_Software\">fri og åben kildekode-software</a>, og er "
+"leveret af “%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 er leveret af “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Advar mig ikke igen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Detaljerede fejlbeskeder fra pakkehåndteringen følger:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detaljer"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "Acce_ptér"
+
+#. 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] "En opdatering er blevet installeret"
+msgstr[1] "Opdateringer er blevet installeret"
+
+#. 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] "Et program er blevet fjernet"
+msgstr[1] "Programmer er blevet fjernet"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Ikke nu"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Lige nu"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d time siden"
+msgstr[1] "%d timer siden"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d år siden"
+msgstr[1] "%d år 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Find i Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Vis mere"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Vis mindre"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Fjerner …"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Genstart krævet for at færdiggøre installering"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Afventer opdatering …"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Klargør …"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Afinstallerer …"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Installér"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Genstart"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Installér …"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Andre programmer af %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Du skal have internetadgang for at skrive en anmeldelse"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Kunne ikke finde “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Detaljeside"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Indlæser programdetaljer …"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "H_jælp med at oversætte"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Åbn"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Opdatér"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Henter"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Udvidelser"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Valgte udvidelser vil blive installeret sammen med programmet."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Softwarearkiv inkluderet"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Intet softwarearkiv inkluderet"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Softwarearkiv fundet"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Brug kun softwarearkiver, du stoler på."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Ingen metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Projektets _websted"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donér"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Bidrag med oversættelse"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Rapportér et problem"
+
+#: 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 "_Skriv anmeldelse"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Alle anmeldelser"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Tilgængelige skrifttyper til %s-skriptet"
+msgstr[1] "Tilgængelige skrifttyper til %s-skripterne"
+
+#. 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] "Tilgængelig software til %s"
+msgstr[1] "Tilgængelig software til %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Ønskede software blev ikke fundet"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s blev ikke fundet"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "på webstedet"
+
+#. 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 "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: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 ""
+"Information om %s, såvel som muligheder for at hente manglende programmer "
+"kan muligvis findes %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 "Ingen programmer er tilgængelige for understøttelse af %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:376
+#, 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: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 ""
+"Information om %s, såvel som muligheder for at hente et codec, der kan "
+"understøtte dette format, kan findes %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Kunne ikke finde nogen søgeresultater: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s-filformatet"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Kunne ikke finde den ønskede software"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Codecsside"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Understøttelse af stationær"
+
+#: 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 "Understøtter brug med stor skærm"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Ukendt understøttelse af stationær"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Kræver en stor skærm"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Stationær understøttes ikke"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Kan ikke bruges på en stor skærm"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Understøttelse af mobil"
+
+#: 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 "Understøttelse brugt på en lille skærm"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Ukendt understøttelse af mobil"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Kræver en lille skærm"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobil understøttes ikke"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Kan ikke bruges på en lille skærm"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Understøttelse af tastatur"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Ukendt understøttelse af tastatur"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Kræver tastatur"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Understøtter tastaturer"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tastatur understøttes ikke"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Kan ikke bruges med et tastatur"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Understøttelse af mus"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Kræver mus eller pegeenhed"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Ukendt understøttelse af mus"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Kræver mus"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Understøtter mus og pegeenheder"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mus understøttes ikke"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Understøttelse af berøringsfølsom skærm"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Ukendt understøttelse af berøringsfølsom skærm"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Kræver berøringsfølsom skærm"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Understøtter berøringsfølsomme skærme"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Berøringsfølsom skærm understøttes ikke"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Kan ikke bruges med berøringsfølsom skærm"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Kræver gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Kræver en gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Understøttelse af gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s virker 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Understøttelse af hardware"
+
+#. 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 "Installeret"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Installerede-side"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Programmer"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Webprogrammer"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Systemprogrammer"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Lavet af fællesskabet"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Dette program er udviklet i åbenhed af et fællesskab af frivillige og "
+"frigivet under <a href=\"%s\">%s-licensen</a>.\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: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 ""
+"Dette program er udviklet i åbenhed af et fællesskab af frivillige og "
+"frigivet under %s-licensen.\n"
+"\n"
+"Du kan bidrage og være med til at gøre det endnu bedre."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietær"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Få mere at vide"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Henter programkatalog"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Indlæser side"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Starter …"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatiske opdateringer sat på pause"
+
+#: 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 ""
+"Det nuværende netværk er forbrugsafregnet. Forbrugsafregnede forbindelser "
+"har begrænset mængde data eller koster penge. For at spare på dataforbruget "
+"er automatiske opdateringer sat på pause.\n"
+"\n"
+"Automatiske opdateringer genoptages, når et netværk uden forbrugsafregning "
+"bliver tilgængeligt. Indtil da er det stadig muligt at installere "
+"opdateringer manuelt.\n"
+"\n"
+"Er det nuværende netværk forkert blevet klassificeret som forbrugsafregnet, "
+"kan indstillingen ændres."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "_Åbn netværksindstillinger"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Administrer side"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Der er ingen anmeldelser at administrere"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Bruger"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Tilføjelser"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Fjernelser"
+
+#. 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 "Opdateringer"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Nedgraderinger"
+
+#. 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 "udvalgte eksterne kilder"
+
+#. 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 ""
+"Giver adgang til flere programmer fra %s. Indeholder også proprietære "
+"programmer."
+
+#. 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 "Aktivér"
+
+#. 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 "Udforsk"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Oversigtsside"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Aktivér softwarearkiver fra tredjepart?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Andre kategorier"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Ingen programdata fundet"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Brugeren afslog installering"
+
+#. 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 "Forbered %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 "Er du sikker på, du vil fjerne arkivet %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Er du sikker på, at du vil afinstallere %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 vil blive afinstalleret, og du skal installere det for at bruge det igen."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Opdateringsindstillinger"
+
+#: 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 ""
+"For at undgå udgifter og netværksbegrænsninger hentes programopdateringer "
+"ikke automatisk på en mobil eller forbrugsafregnet forbindelse."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatiske opdateringer"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Om muligt hentes og installeres programopdateringer i baggrunden."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Påmindelser om automatiske opdateringer"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Vis påmindelser når opdateringer er installeret automatisk."
+
+#. 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 ""
+"Noget af det software, som er installeret, er ikke kompatibelt med %s. Hvis "
+"du fortsætter, vil følgende blive fjernet automatisk under opgraderingen:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Inkompatibelt software"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Fortsæt"
+
+#. 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 ""
+"Programmer, som er blevet installeret fra “%s”, vil ikke længere modtage "
+"opdateringer."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Deaktivér arkiv?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Fjern"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Aktivér nye arkiver"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Flere arkiver fra udvalgte tredjeparter — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Disse arkiver supplerer standardsoftwaren leveret af %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Softwarearkiver"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Ingen arkiver"
+
+#. 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 program installeret"
+msgstr[1] "%u programmer installeret"
+
+#. 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 tilføjelse installeret"
+msgstr[1] "%u tilføjelser installeret"
+
+#. 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 program"
+msgstr[1] "%u programmer"
+
+#. 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 tilføjelse"
+msgstr[1] "%u tilføjelser"
+
+#. 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 er nu installeret"
+msgstr[1] "%s og %s er nu installeret"
+
+#. 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 "Hader det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Kan ikke lide det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Det er OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Kan lide det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Elsker det"
+
+#. 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 "Tag venligst tiden til at skrive anmeldelsen"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Vælg venligst en stjernevurdering"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Opsummeringen er for kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Opsummeringen er for lang"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Beskrivelsen er for kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Send anmeldelse"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Send"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Vurdering"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Opsummering"
+
+#: src/gs-review-dialog.ui:97
+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”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Anmeldelse"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Se i vores <a href=\"https://odrs.gnome.org/privacy\">privatlivspolitik</a>, "
+"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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Rapportér anmeldelse?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Rapportér"
+
+#. 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 "Kunne du bruge anmeldelsen?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ja"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nej"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Hmm"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Rapportér …"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Fjern …"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Undersøg, om du har tillid til leverandøren, da programmet ikke kører i "
+"sandkassetilstand"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Ingen rettigheder"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Netværksadgang"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ingen netværksadgang"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Bruger systemtjenester"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Bruger sessionstjenester"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Adgang til enheder"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Ingen adgang til enheder"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Fuld læse-/skriveadgang til filsystemet"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Læse-/skriveadgang til mappen Hjem"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Fuld læseadgang til filsystemet"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Læseadgang til mappen Hjem"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Læse-/skriveadgang til mappen Hentet"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Læseadgang til mappen Hentet"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Ingen adgang til filsystemet"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Kan ikke tilgå nogen filer i filsystemet"
+
+#. 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 "Proprietær kode"
+
+#: 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 ""
+"Koden er ikke offentlig tilgængelig, så den kan ikke auditeres af uafhængige "
+"personer og kan være usikker"
+
+#. 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 "Kode kan auditeres"
+
+#: 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 ""
+"Koden er offentligt tilgængelig og kan auditeres af uafhængige personer, "
+"hvilket gør det mere sandsynligt, at programmet er sikkert"
+
+#. 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 "Programudvikler er bekræftet"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Usikre afhængigheder"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 sikker"
+
+#. 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 muligvis usikker"
+
+#. 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 usikker"
+
+#. 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 "Sikkerhed"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Kilde"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "Udviklingsværktøj (SDK)"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Forældet SDK-version"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Intet skærmbillede angivet"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Skærmbilledet blev ikke fundet"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Skærmbillede ugyldigt"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Søgeside"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Søg efter programmer"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Kunne ikke hente firmware-opdateringer 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Kunne ikke hente opdateringer"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Kunne ikke hente opdateringer: ikke nok diskplads"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Kunne ikke hente opdateringer: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Kunne ikke hente opdateringer: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Kunne ikke hente liste over opdateringer"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Kunne ikke installere %s fordi download mislykkedes fra %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Kunne ikke installere %s fordi download mislykkedes"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Kunne ikke installere %s, fordi %s-runtimen ikke er tilgængelig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Kunne ikke installere %s fordi det ikke understøttes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Kunne ikke installere: netværksadgang var påkrævet, men var ikke tilgængelig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Kunne ikke installere: programmet har et ugyldigt format"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Kunne ikke installere %s: ikke nok diskplads"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Kunne ikke installere %s: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Kunne ikke installere %s: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Kunne ikke installere %s: strømforsyning er påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Kunne ikke installere %s: batteriniveauet er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Kunne ikke installere %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Kunne ikke opdatere %s fra %s, fordi download mislykkedes"
+
+#. 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 update %s as download failed"
+msgstr "Kunne ikke opdatere %s fordi 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Kunne ikke installere opdateringer fra %s, fordi download mislykkedes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Kunne ikke installere opdateringer, fordi download mislykkedes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Kunne ikke opdatere: netværksadgang var påkrævet, men var ikke tilgængelig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Kunne ikke opdatere %s: ikke nok diskplads"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Kunne ikke installere opdateringer: ikke nok diskplads"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Kunne ikke opdatere %s: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Kunne ikke installere opdateringer: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Kunne ikke opdatere %s: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Kunne ikke installere opdateringer: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Kunne ikke opdatere %s: strømforsyning er påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Kunne ikke installere opdateringer: strømforsyning er påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Kunne ikke opdatere %s: batteriniveauet er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Kunne ikke installere opdateringer: batteriniveauet er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Kunne ikke opdatere %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Kunne ikke installere opdateringer"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Kunne ikke opgradere til %s fordi download mislykkedes"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Kunne ikke opgradere til %s: 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Kunne ikke opgradere til %s: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Kunne ikke opgradere til %s: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Kunne ikke opgradere til %s: strømforsyning er påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Kunne ikke opgradere til %s: batteriniveauet er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Kunne ikke opgradere til %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Kunne ikke fjerne %s: godkendelse var påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Kunne ikke fjerne %s: godkendelse var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Kunne ikke fjerne %s: strømforsyning er påkrævet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Kunne ikke fjerne %s: batteriniveauet er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Kunne ikke fjerne %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Ikke nok diskplads — frigør venligst noget plads og forsøg igen"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Beklager, noget gik galt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Kunne ikke installere fil: understøttes ikke"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Kunne ikke installere fil: godkendelse mislykkedes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Kunne ikke installere: understøttes ikke"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Kunne ikke installere: godkendelse mislykkedes"
+
+#. 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 "Kunne ikke kontakte %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Software skal genstartes for at bruge nye udvidelsesmoduler."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Strømforsyning er påkrævet"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Batteriniveauet er for lavt"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Softwarearkiver"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Opdateringsindstillinger"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Undersøg 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 "Netværksindstillinger"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Genstart nu"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Mere information"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Søg"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Hovedmenu"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Få _mere at vide"
+
+#. 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 "Opdateringer"
+
+#. 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 "Application Data"
+msgstr "Programdata"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Delte systemkomponenter dette program kræver"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Ukendt"
+
+#. 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 "Lager"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Cachedata kan ryddes i <a href=\"dummy\">_programmets indstillinger</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Installeret)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Installerer)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Fjerner)"
+
+#. 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 "Installerede opdateringer"
+
+#. 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 "Installeret på %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Ingen opdateringer installeret"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Softwareopdateringer er forældet"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Søg venligst efter softwareopdateringer."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritisk softwareopdatering er klar til at blive installeret"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "En vigtig systemopdatering er klar til at blive installeret."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritiske softwareopdateringer er tilgængelige til at blive hentet"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Vigtigt: kritiske softwareopdateringer venter."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Softwareopdateringer er klar til at blive installeret"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Systemopdateringer venter og er klar til at blive installeret."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Softwareopdateringer er tilgængelige til at blive hentet"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Hent venligst softwareopdateringer der venter."
+
+#. 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 program opdateret — genstart nødvendig"
+msgstr[1] "%u programmer opdateret — genstart nødvendig"
+
+#. 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 program opdateret"
+msgstr[1] "%u programmer opdateret"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s er blevet opdateret."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Genstart venligst programmet."
+
+#. 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 er blevet opdateret."
+
+#. 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 program kræver en genstart."
+msgstr[1] "%u programmer kræver en genstart."
+
+#. 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 "Inkluderer %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 "Systemopdateringer er ikke tilgængelige"
+
+#. 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 "Opgradér for fortsat at modtage sikkerhedsopdateringer."
+
+#. 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 "En ny version af %s er klar til at blive installeret"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Softwareopgradering er tilgængelig"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Softwareopdateringer mislykkedes"
+
+#. 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 "En vigtig opdatering til styresystemet kunne ikke installeres."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Vis detaljer"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Gennemse"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Seneste søgning: %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 understøttes ikke længere."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Dit styresystem understøttes ikke længere."
+
+#. 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 "Dette betyder at det ikke modtager sikkerhedsopdateringer."
+
+#. 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 "Det anbefales at du opgraderer til en nyere version."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Dette kan koste penge"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Søg _alligevel"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Intet netværk"
+
+#. 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 "Der kræves internetadgang for at søge efter opdateringer."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Søg efter opdateringer"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Opdateringer"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Opdateringsside"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Indlæser opdateringer …"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Opdateret"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Brug mobildata?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Søg alligevel"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Ingen forbindelse"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Gå online for at søge efter opdateringer."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Netværksindstillinger"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Fejl"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Opdateringer håndteres automatisk."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Genstart og opdatér"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Opdatér alle"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Programopdateringer"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Enhedsfirmware"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s er tilgængelig"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Lær om den nye version"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Henter …"
+
+#. 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 hentet"
+
+#. 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 %% hentet"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Genstart og opdatér"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Husk at tage en sikkerhedskopi af dine data inden opgraderingen."
+
+#: 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 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 ""
+"Opdateringer;Opgrader;Kilder;Pakkearkiver;Indstillinger;Installer;"
+"Afinstaller;Program;Software;App;Butik;"
+
+#. 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 "Systemopdateringer"
+
+#. 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 ""
+"Generelle systemopdateringer, som f.eks. sikkerheds- eller fejlrettelser, "
+"samt ydelsesforbedringer."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Henter udvalgte billeder …"
+
+#. 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 "Opdatering af %s med nye funktioner og rettelser."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Henter opgraderingsinformation …"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Systemmappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Hjemmeundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Værtssystemmapper"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Værtssystemkonfiguration fra /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Skrivebordsmappe"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Skrivebordsundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumentmappe"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumentundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Musikmappe"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Musikundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Billedmappe"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Billedundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Delingsmappe"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Delingsundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videomappe"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videoundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Skabelonmappe"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Skabelonundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Brugercachemappe"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Brugercacheundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Brugerkonfigurationsmappe"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Brugerkonfigurationsundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Brugerdatamappe"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Brugerdataundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Brugerkørselsmappe"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Brugerkørselsundermappe %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Filsystemadgang til %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Henter flatpak-metadata til %s …"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Fjernenheden “%s” tillader ikke installering af “%s” sandsynligvis på grund "
+"af dens filter. Fjern filteret og gentag installeringen. Detaljeret fejl: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Konfigurationsopdatering til %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Kameraopdatering til %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, 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:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Pegepladeopdatering til %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "USB-modtageropdatering til %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Installér usigneret software?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Hent usigneret software?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Opdatér usigneret software?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pakker"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "system"
+
+#~ 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 "_Installed"
+#~ msgstr "_Installerede"
+
+#~ msgid "_Updates"
+#~ msgstr "_Opdateringer"
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Ukendt softwarelicens"
+
+#~ 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 "_Enable"
+#~ msgstr "A_ktivér"
+
+#~ 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, %R"
+#~ msgstr "I går, %R"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Genstart nu"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s er klar til at blive installeret"
+
+#~ 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 "Reference"
+#~ msgstr "Reference"
+
+#~ 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..d5980df
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,6521 @@
+# 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 <f.alexander.wilms _at_ gmail.com>, 2013.
+# Bernd Homuth <dev@hmt.im>, 2015.
+# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2015, 2017.
+# Wolfgang Stöggl <c72578@yahoo.de>, 2016-2017, 2020.
+# Tim Sabsch <tim@sabsch.com>, 2017-2022.
+# Mario Blättermann <mario.blaettermann@gmail.com>, 2013, 2016-2018, 2020-2021.
+# Philipp Kiemle <philipp.kiemle@gmail.com>, 2020-2022.
+# Jürgen Benvenuti <gastornis@posteo.org>, 2022.
+# Christian Kirbach <christian.kirbach@gmail.com>, 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: 2022-09-22 16:06+0000\n"
+"PO-Revision-Date: 2022-10-08 18:37+0200\n"
+"Last-Translator: Jürgen Benvenuti <gastornis@posteo.org>\n"
+"Language-Team: German - Germany <gnome-de@gnome.org>\n"
+"Language: de_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.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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2043
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Das GNOME-Projekt"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Server zur Verwendung von Anwendungsrezensionen"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Mindest-Karma-Punktestand für Rezensionen"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Zugriff auf den Softwarequellen-Dialog erlauben"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Systemaktualisierungen für Vorab-Veröffentlichungen anbieten"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://de.wikipedia.org/wiki/Proprietäre_Software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME-Software systemweiter AppStream-Installer"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Altersfreigabe"
+
+#: 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 "So fügen Sie fehlende Informationen hinzu"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Ausstehend"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Ausstehende Installation"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Ausstehendes Entfernen"
+
+#: 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 "Installiert"
+
+#. 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 "Installieren"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Entfernen"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Deinstallieren"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Netzwerk"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Darf über das Netzwerk kommunizieren"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Systemdienste"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Sitzungsdienste"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Geräte"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Darf auf Systemdateien zugreifen"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Persönlicher Ordner"
+
+#: 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 "Darf Dateien lesen, bearbeiten und erstellen"
+
+#: 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 "Darf Dateien lesen"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Download-Ordner"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Darf alle Einstellungen sehen und verändern"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Veraltetes Anzeigesystem"
+
+#: src/gs-app-details-page.c:80
+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:81
+msgid "Sandbox escape"
+msgstr "Sandbox-Ausbruch"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Kann aus der Sandbox ausbrechen und andere Beschränkungen umgehen"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Details aktualisieren"
+
+#. 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 "Es stehen keine Details zur Aktualisierung bereit."
+
+#: 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 "Zurück gehen"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Benötigt zusätzliche Berechtigungen"
+
+#. 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 "Rezensionen"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Für diese Anwendung gibt es keine Rezensionen."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Keine Rezensionen"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versionshistorie"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Neu in Version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Eine lokale metainfo- oder appdata-Datei anzeigen"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Ausführliche Informationen zur Fehlerdiagnose anzeigen"
+
+#: 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 update preferences"
+msgstr "Einstellungen zu Aktualisierungen 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 GNOME Software-Mitwirkende"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Eduard Gotwig <gotwig@ubuntu.com>\n"
+"Christian Kirbach <christian.kirbach@gmail.com>\n"
+"Benjamin Steinwender <b@stbe.at>\n"
+"Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>\n"
+"Bernd Homuth <dev@hmt.im>\n"
+"Christian Kirbach <christian.kirbach@gmail.com>\n"
+"J.M. Ruetter <jm@jublo.net>\n"
+"Mario Blättermann <mario.blaettermann@gmail.com>\n"
+"Tim Sabsch <tim@sabsch.com>\n"
+"Philipp Kiemle <philipp.kiemle@gmail.com>\n"
+"Jürgen Benvenuti <gastornis@posteo.org>"
+
+#. 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 "Info zu Software"
+
+#. 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 "Ein einfacher Weg, um Software auf Ihrem System zu verwalten."
+
+#. 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 "Tut uns leid! Für diese Anwendung gibt es keine Details."
+
+#. 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 "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 Cache"
+
+#: 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 Cache"
+
+#: src/gs-app-context-bar.c:174
+msgid "Cache and data usage unknown"
+msgstr "Cache- und Datennutzung unbekannt"
+
+#. 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Darf auf Hardware-Gerä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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Darf auf beliebige 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Darf beliebige Berechtigungen erhalten"
+
+#. 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 "Von Ihrer Distribution überprüft"
+
+#. 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 "Durch Dritte bereitgestellt"
+
+#. 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 "Proprietärer Quellcode"
+
+#. 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 "Überprüfbarer Quellcode"
+
+#. 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 "Der Software-Entwickler ist verifiziert"
+
+#. 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 "Diese Software wird nicht mehr unterstützt"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Unsicher"
+
+#: 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 "Nur Mobilgeräte"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Funktioniert nur mit einem kleinen Bildschirm"
+
+#: 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 "Nur Desktop"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Funktioniert nur auf einem großen Bildschirm"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Die Bildschirmgrößen stimmen nicht überein"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Ihre aktuelle Bildschirmgröße wird nicht unterstützt"
+
+#: 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 "Erfordert einen Touchscreen"
+
+#: 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 "Erfordert eine Tastatur"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Erfordert eine Maus"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Gamepad erforderlich"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptiv"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funktioniert auf Mobiltelefonen, Tablets und Desktop-PCs"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Erfordert vermutlich eine Tastatur oder Maus"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Enthält keine altersbeschränkten Inhalte"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Internetseite besuchen"
+
+#. 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 "Installieren …"
+
+#. 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 "Abbrechen"
+
+#. 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 "Installieren"
+
+#. 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 "Aktualisieren"
+
+#. 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 "Deinstallieren"
+
+#. 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 "Deinstallieren"
+
+#. 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 "Gerät kann während der Aktualisierung nicht verwendet werden."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Umbenannt von %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Helfen Sie, %s zu übersetzen"
+
+#. 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 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:5
+msgid "Translations"
+msgstr "Übersetzungen"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Übersetzungs-Webseite"
+
+#. 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 "Anmeldung auf %s erforderlich (Realm %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Anmeldung erforderlich"
+
+#: 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 "_Abbrechen"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "Anmel_den"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Ben_utzer"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Passwort"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Neu & Aktualisiert"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Andere Software"
+
+#. 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 "Bitte geben Sie eine Zahl von 1 bis %u ein: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Wählen Sie eine Anwendung:"
+
+#: 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 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 ist jetzt installiert"
+
+#. 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 "Ein Neustart ist erforderlich, damit die Änderungen wirksam werden."
+
+#. 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 "Anwendung steht zur Nutzung bereit."
+
+#. 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 "Systemaktualisierungen sind jetzt installiert"
+
+#. 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 ""
+"Kürzlich installierte Aktualisierungen stehen für Bewertungen zur Verfügung"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Neustart"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Starten"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Soll die Software von Drittanbietern installiert werden?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Soll die Softwarequelle von Drittanbietern aktiviert werden?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ist nicht <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">freie und quelloffene Software</a> und wird durch »%s« "
+"bereitgestellt."
+
+#. 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 wird durch »%s« zur Verfügung gestellt."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Nicht erneut warnen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr ""
+"Siehe nachfolgend die detaillierten Fehlermeldungen von der Paketverwaltung:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Details"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Akzeptieren"
+
+#. 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] "Eine Aktualisierung wurde installiert"
+msgstr[1] "Aktualisierungen wurden installiert"
+
+# Das "Mehrere" im Plural-String ist zwar keine 1:1-Übersetzung, macht aber mMn durchaus Sinn. Meinungen? - pk
+#. 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] "Eine Anwendung wurde entfernt"
+msgstr[1] "Anwendungen wurden entfernt"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Jetzt nicht"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Gerade eben"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "Vor %d Stunde"
+msgstr[1] "Vor %d Stunden"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "Vor %d Jahr"
+msgstr[1] "Vor %d Jahren"
+
+#. 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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mehr anzeigen"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Weniger anzeigen"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Wird entfernt …"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Neustart erforderlich, um die Installation fertigzustellen"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Ausstehende Aktualisierung …"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Wird vorbereitet …"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Deinstallieren …"
+
+#. 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 "_Installieren"
+
+#: src/gs-details-page.c:886
+msgid "_Restart"
+msgstr "_Neu starten"
+
+#. 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 "_Installieren …"
+
+#. 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 "Andere Anwendungen von %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+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:1732 src/gs-details-page.c:1748
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "»%s« konnte nicht gefunden werden"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Seite mit Details"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Anwendungsdetails werden geladen …"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Bei der Ü_bersetzung helfen"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "Ö_ffnen"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "Akt_ualisieren"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Wird heruntergeladen"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Erweiterungen"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Die gewählten Erweiterungen werden mit der Anwendung installiert."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Softwarequelle eingeschlossen"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Keine Softwarequelle eingeschlossen"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Softwarequelle identifiziert"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Verwenden Sie nur Softwarequellen, denen Sie vertrauen."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Keine Metadaten"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Projekt-_Webseite"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "Spen_den"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Ü_bersetzungen beitragen"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "Ein _Problem melden"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Hilfe"
+
+#. 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 "_Rezension schreiben"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Alle Rezensionen"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:244
+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: 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] "Verfügbare Schriften für das %s-Schriftsystem"
+msgstr[1] "Verfügbare Schriften für die %s-Schriftsysteme"
+
+#. 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] "Verfügbare Software für %s"
+msgstr[1] "Verfügbare Software für %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Angeforderte Software nicht gefunden"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s wurde nicht gefunden"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "auf der Internetseite"
+
+#. 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 ""
+"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: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 ""
+"Informationen über %s sowie Möglichkeiten, fehlende Anwendungen zu erhalten, "
+"finden Sie %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 "Es sind keine Anwendungen für %s-Unterstützung verfügbar."
+
+#. 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 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: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 ""
+"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 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 ""
+"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:402
+#, 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 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 "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: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 ""
+"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 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 ""
+"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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"%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: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] "%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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Keine Suchergebnisse: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s-Dateiformat"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Die angeforderte Software kann nicht gefunden werden"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Seite mit Codecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Desktop-Unterstützung"
+
+#: 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 "Kann auf einem großen Bildschirm verwendet werden"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Desktop-Unterstützung unbekannt"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Erfordert einen großen Bildschirm"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Desktop nicht unterstützt"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobilgeräte-Unterstützung"
+
+#: 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 "Kann auf einem kleinen Bildschirm verwendet werden"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobilgeräte-Unterstützung unbekannt"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Erfordert einen kleinen Bildschirm"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobilgeräte nicht unterstützt"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Kann auf einem kleinen Bildschirm nicht verwendet werden"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Tastatur-Unterstützung"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Tastatur-Unterstützung unbekannt"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Tastatur erforderlich"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Unterstützt Tastaturen"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tastatur nicht unterstützt"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Kann nicht mit Tastatur verwendet werden"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Maus-Unterstützung"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Erfordert eine Maus oder ein Zeigegerät"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Maus-Unterstützung unbekannt"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Maus erforderlich"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Unterstützt Mäuse und Zeigegeräte"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Maus nicht unterstützt"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Touchscreen-Unterstützung"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Touchscreen-Unterstützung unbekannt"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Touchscreen erforderlich"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Unterstützt Touchscreens"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Touchscreen nicht unterstützt"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Kann auf einem Touchscreen nicht verwendet werden"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad erforderlich"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Erfordert ein Gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Gamepad-Unterstützung"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s funktioniert 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hardware-Unterstützung"
+
+#. 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 "Installiert"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Installierte Seite"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Anwendungen"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Web-Anwendungen"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Systemanwendungen"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Von der Gemeinschaft entwickelt"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Diese Software wurde offen von einer Gemeinschaft von Freiwilligen "
+"entwickelt und unter der <a href=\"%s\">%s-Lizenz</a> 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: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 ""
+"Diese Software wurde offen von einer Gemeinschaft von Freiwilligen "
+"entwickelt und unter der »%s«-Lizenz veröffentlicht.\n"
+"\n"
+"Sie können daran mitwirken und die Software noch weiter verbessern."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietär"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "Mehr er_fahren"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Software-Katalog wird heruntergeladen"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Seite wird geladen"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Starten …"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatische Aktualisierungen pausiert"
+
+#: 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 ""
+"Die aktuelle Netzwerkverbindung ist getaktet. Getaktete Verbindungen "
+"besitzen ein beschränktes Datenvolumen oder damit verbundene Kosten. Um das "
+"Datenvolumen zu reduzieren, wurden automatische Aktualisierungen daher "
+"pausiert.\n"
+"\n"
+"Automatische Aktualisierungen werden fortgesetzt, sobald eine ungetaktete "
+"Verbindung vorhanden ist. Bis dahin können Sie Aktualisierungen weiterhin "
+"manuell installieren.\n"
+"\n"
+"Sollte die aktuelle Netzwerkverbindung fälschlicherweise als getaktet "
+"identifiziert worden sein, können Sie diese Einstellung ändern."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "_Netzwerkeinstellungen öffnen"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderationsseite"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Es stehen keine Rezensionen zur Moderation zur Verfügung"
+
+#: 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: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 "Benutzer"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Hinzufügungen"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Entfernungen"
+
+#. 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 "Aktualisierungen"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Herunterstufungen"
+
+#. 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 "ausgewählten externen Softwarequellen"
+
+#. 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 ""
+"Bietet Zugriff auf zusätzliche Software von %s. Beinhaltet einige "
+"proprietäre Anwendungen."
+
+#. 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 "Aktivieren"
+
+#. 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 "Erkunden"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Übersichtsseite"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Sollen Softwarequellen von Drittanbietern aktiviert werden?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Andere Kategorien"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Keine Anwendungsdaten gefunden"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Benutzer hat die Installation abgelehnt"
+
+#. 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 vorbereiten"
+
+#. 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 "Soll die Quelle %s wirklich entfernt werden?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Sind Sie sicher, dass Sie %s deinstallieren möchten?"
+
+#. 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 wird deinstalliert und muss erneut installiert werden, um genutzt werden "
+"zu können."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Aktualisierungs-Einstellungen"
+
+#: 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 ""
+"Um Kosten und Drosselungen zu vermeiden, werden Softwareaktualisierungen bei "
+"mobilen oder getakteten Verbindungen nicht automatisch heruntergeladen."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatische Aktualisierungen"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Wenn möglich, werden ausstehende Aktualisierungen im Hintergrund "
+"heruntergeladen und installiert."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Benachrichtigungen bei automatischen Aktualisierungen"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Benachrichtigungen anzeigen, wenn Aktualisierungen automatisch installiert "
+"wurden."
+
+#. 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 ""
+"Einige der aktuell installierten Software ist nicht mit %s kompatibel. Wenn "
+"Sie fortfahren, wird die folgende automatisch während der "
+"Systemaktualisierung entfernt:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Nicht kompatible Software"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Fortfahren"
+
+#. 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 ""
+"Software, die aus »%s« installiert wurde, wird nicht länger Aktualisierungen "
+"erhalten."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Softwarequelle deaktivieren?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Entfernen"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Neue Softwarequellen aktivieren"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Zusätzliche Softwarequellen von ausgewählten Drittanbietern — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Diese Softwarequelle ergänzt die von %s gelieferte, voreingestellte Software."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Softwarequellen"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Keine Softwarequellen"
+
+#. 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 Anwendung installiert"
+msgstr[1] "%u Anwendungen installiert"
+
+#. 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 Erweiterung installiert"
+msgstr[1] "%u Erweiterungen installiert"
+
+#. 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 Anwendung"
+msgstr[1] "%u Anwendungen"
+
+#. 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 Erweiterung"
+msgstr[1] "%u Erweiterungen"
+
+#. 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 und %s wurde installiert"
+msgstr[1] "%s und %s wurden installiert"
+
+#. 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 "Finde ich furchtbar"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+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 application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Ziemlich gut"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Mag ich"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Finde ich perfekt"
+
+#. 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 "Nehmen Sie sich bitte etwas mehr Zeit zum Schreiben der Rezension"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Bitte wählen Sie eine Sternchenbewertung"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Die Zusammenfassung ist zu kurz"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Die Zusammenfassung ist zu lang"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Die Beschreibung ist zu kurz"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Rezension abschicken"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Veröffentlichen"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Bewertung"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: src/gs-review-dialog.ui:97
+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«."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Rezension"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Informationen zum Umgang mit Ihren Daten finden Sie in unseren <a "
+"href=\"https://odrs.gnome.org/privacy\">Datenschutzbestimmungen</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Rezension melden?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Melden"
+
+#. 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 "War diese Rezension hilfreich für Sie?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ja"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nein"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Hm"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Melden …"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Entfernen …"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Überprüfen Sie, ob Sie dem Anbieter vertrauen – die Anwendung läuft nicht in "
+"einer isolierten Sandbox"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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 "
+"Schädlichkeit überprüft"
+
+#. 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 "Keine Berechtigungen"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Netwerkzugriff"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Kein Netwerkzugriff"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Verwendet Systemdienste"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Verwendet Sitzungsdienste"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Gerätezugriff"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Kein Gerätezugriff"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Lese-/Schreibzugriff auf das gesamte Dateisystem"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Lese-/Schreibzugriff auf den persönlichen Ordner"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Lesezugriff auf das gesamte Dateisystem"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Lesezugriff auf den persönlichen Ordner"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Lese-/Schreibzugriff auf den Download-Ordner"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Lesezugriff auf den Download-Ordner"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Darf alle Daten im Download-Ordner lesen"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Kein Dateisystemzugriff"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Darf überhaupt nicht auf das Dateisystem zugreifen"
+
+#. 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 "Proprietärer Quellcode"
+
+#: 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 ""
+"Der Quellcode ist nicht öffentlich und kann deshalb nicht von unabhängigen "
+"Stellen überprüft werden. Er ist potentiell unsicher"
+
+#. 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 "Überprüfbarer Quellcode"
+
+#: 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 ""
+"Der Quellcode ist öffentlich und kann deshalb von unabhängigen Stellen "
+"überprüft werden. Dadurch ist die Anwendung mit höherer Wahrscheinlichkeit "
+"sicher"
+
+#. 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 "Entwickler ist verifiziert"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Unsichere Abhängigkeiten"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 ist sicher"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s ist unsicher"
+
+#. 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 "Sicherheit"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Quelle"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Veraltete SDK-Version"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Kein Bildschirmfoto verfügbar"
+
+#. 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 "Bildschirmfoto nicht gefunden"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+msgid "Screenshot not valid"
+msgstr "Bildschirmfoto nicht gültig"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:797
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Suchseite"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Nach Anwendungen suchen"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "Fehler beim Herunterladen von Firmware-Aktualisierungen von %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 "Herunterladen von Aktualisierungen von %s nicht möglich"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Herunterladen von Aktualisierungen nicht möglich"
+
+#. 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 ""
+"Herunterladen von Aktualisierungen nicht möglich: Internet-Zugriff war "
+"erforderlich, jedoch nicht verfügbar"
+
+#. 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 ""
+"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:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+"Herunterladen von Aktualisierungen nicht möglich: Es war nicht genug freier "
+"Speicherplatz vorhanden"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr ""
+"Herunterladen von Aktualisierungen nicht möglich: Anmeldedaten werden zur "
+"Legitimierung benötigt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr ""
+"Herunterladen von Aktualisierungen nicht möglich: Legitimierung war nicht "
+"erfolgreich"
+
+#. 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 ""
+"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:1331
+msgid "Unable to get list of updates"
+msgstr "Aktualisierungsliste konnte nicht aktualisiert werden"
+
+#. 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 ""
+"Installation von %s nicht möglich, weil das Herunterladen von %s fehlschlug"
+
+#. 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 "Installation von %s nicht möglich, weil das Herunterladen fehlschlug"
+
+#. 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 ""
+"Installation von %s nicht möglich, weil die Laufzeit %s nicht verfügbar ist"
+
+#. 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 "Installation von %s nicht möglich, weil es nicht unterstützt wird"
+
+#. 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 ""
+"Installation fehlgeschlagen: Internet-Zugriff war erforderlich, jedoch nicht "
+"verfügbar"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Installation nicht möglich: Die Anwendung hat ein ungültiges 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 ""
+"Installation von %s fehlgeschlagen: Es war nicht genug freier Speicherplatz "
+"vorhanden"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Installation von %s nicht möglich: Legitimierung notwendig"
+
+#. 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 "Installation von %s nicht möglich: Legitimierung fehlgeschlagen"
+
+#. 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 ""
+"Installation von %s nicht möglich: Keine ausreichenden Benutzerrechte, um "
+"Anwendungen zu installieren"
+
+#. 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 "Installation von %s nicht möglich: Netzanschluss notwendig"
+
+#. 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 "Installation von %s nicht möglich: Akkustand zu niedrig"
+
+#. 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 "Installation von %s nicht möglich"
+
+#. 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 ""
+"Aktualisierung von %s aus %s nicht möglich, weil das Herunterladen fehlschlug"
+
+#. 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 "Aktualisierung von %s nicht möglich, weil das Herunterladen fehlschlug"
+
+#. 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 ""
+"Installation der Aktualisierungen von %s nicht möglich, weil das "
+"Herunterladen fehlschlug"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Installation von Aktualisierungen nicht möglich, weil das Herunterladen "
+"fehlschlug"
+
+#. 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 ""
+"Aktualisierung fehlgeschlagen: Internet-Zugriff war erforderlich, jedoch "
+"nicht verfügbar"
+
+#. 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 ""
+"Aktualisierung von %s fehlgeschlagen: Es ist nicht genug freier "
+"Speicherplatz vorhanden"
+
+#. 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 ""
+"Installation von Aktualisierungen fehlgeschlagen: Es ist nicht genug freier "
+"Speicherplatz vorhanden"
+
+#. 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 "Aktualisierung von %s nicht möglich: Legitimierung notwendig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr ""
+"Installation von Aktualisierungen nicht möglich: Legitimierung notwendig"
+
+#. 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 "Aktualisierung von %s nicht möglich: Legitimierung fehlgeschlagen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Installation von Aktualisierungen nicht möglich: Legitimierung fehlgeschlagen"
+
+#. 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 ""
+"Aktualisierung von %s nicht möglich: Keine ausreichenden Benutzerrechte, um "
+"Aktualisierungen zu installieren"
+
+#. 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 ""
+"Installation von Aktualisierungen nicht möglich: Keine ausreichenden "
+"Benutzerrechte, um Aktualisierungen zu installieren"
+
+#. 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 "Aktualisierung von %s nicht möglich: Netzanschluss notwendig"
+
+#. 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 ""
+"Installation von Aktualisierungen nicht möglich: Netzanschluss notwendig"
+
+#. 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 "Aktualisierung von %s nicht möglich: Akkustand zu niedrig"
+
+#. 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 "Installation von Aktualisierungen nicht möglich: Akkustand zu niedrig"
+
+#. 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 "Aktualisierung von %s fehlgeschlagen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Installation von Aktualisierungen 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:1660
+#, 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,
+#. * 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 ""
+"Systemaktualisierung auf %s nicht möglich, weil das Herunterladen fehlschlug"
+
+#. 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 ""
+"Systemaktualisierung auf %s fehlgeschlagen: Internet-Zugriff war "
+"erforderlich, jedoch nicht verfügbar"
+
+#. 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 ""
+"Systemaktualisierung auf %s fehlgeschlagen: Es war nicht genug freier "
+"Speicherplatz vorhanden"
+
+#. 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 "Systemaktualisierung auf %s 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr ""
+"Systemaktualisierung auf %s 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:1700
+#, c-format
+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"
+
+#. 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 "Systemaktualisierung auf %s nicht möglich: Netzanschluss notwendig"
+
+#. 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 "Systemaktualisierung auf %s nicht möglich: Akkustand zu niedrig"
+
+#. 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 "Systemaktualisierung auf %s nicht möglich"
+
+#. 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 "Entfernen von %s nicht möglich: Legitimierung notwendig"
+
+#. 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 "Entfernen von %s nicht möglich: Legitimierung fehlgeschlagen"
+
+#. 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 ""
+"Entfernen von %s nicht möglich: Keine ausreichenden Benutzerrechte, um "
+"Anwendungen zu entfernen"
+
+#. 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 "Entfernen von %s nicht möglich: Netzanschluss notwendig"
+
+#. 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 "Entfernen von %s nicht möglich: Akkustand zu niedrig"
+
+#. 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 "Entfernen von %s nicht möglich"
+
+#. 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 "Starten von %s fehlgeschlagen: %s ist nicht installiert"
+
+#. 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 ""
+"Es ist nicht genug freier Speicher vorhanden. Bitte schaffen Sie ein "
+"bisschen Platz und versuchen Sie es anschließend erneut"
+
+#. 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 "Hoppla! Etwas ist schief gegangen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Installation der Datei schlug fehl: nicht unterstützt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Installation der Datei schlug fehl: Legitimierung fehlgeschlagen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Installation schlug fehl: nicht unterstützt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Installation schlug fehl: Legitimierung fehlgeschlagen"
+
+#. 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 "%s kann nicht kontaktiert werden"
+
+#. 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 ""
+"GNOME Software muss neu gestartet werden, um die neuen Erweiterungen "
+"einzubinden."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Netzanschluss benötigt"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "Der Akkustand ist zu niedrig"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Softwarequellen"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "A_ktualisierungs-Einstellungen"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Datenträger untersuchen"
+
+#. 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 "Netzwerkeinstellungen"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Jetzt neustarten"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Weitere Informationen"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Suchen"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Primäres Menü"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Mehr _herausfinden"
+
+#. 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 "Aktualisierungen"
+
+#. 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 "Application Data"
+msgstr "Anwendungsdaten"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+msgstr "Von Ihnen in der Anwendung generierte Daten"
+
+#: src/gs-storage-context-dialog.c:153
+msgid "Cache Data"
+msgstr "Cache-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 application 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 application"
+msgstr "Von dieser Anwendung benötigte gemeinsame Systemkomponenten"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#. 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 "Speicher"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Cache-Daten können über die <a href=\"dummy\">_Anwendungseinstellungen</a> "
+"gelöscht werden."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (installiert)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (wird installiert)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (wird entfernt)"
+
+#. 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 "Installierte Aktualisierungen"
+
+#. 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 "Installiert am %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Keine Aktualisierungen installiert"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Software-Aktualisierungen sind veraltet"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Bitte suchen Sie nach Aktualisierungen."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritische Software-Aktualisierung bereit zur Installation"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Eine wichtige Software-Aktualisierung ist bereit zur Installation."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritische Software-Aktualisierungen zum Herunterladen verfügbar"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Wichtig: Kritische Software-Aktualisierungen warten."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Software-Aktualisierungen bereit zur Installation"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Software-Aktualisierungen ausstehend und bereit zur Installation."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Software-Aktualisierungen zum Herunterladen verfügbar"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Bitte laden Sie ausstehende Software-Aktualisierungen herunter."
+
+#. 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 Anwendung aktualisiert – Neustart erforderlich"
+msgstr[1] "%u Anwendungen aktualisiert – Neustart erforderlich"
+
+#. 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 Anwendung aktualisiert"
+msgstr[1] "%u Anwendungen aktualisiert"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s wurde aktualisiert."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Bitte starten Sie die Anwendung neu."
+
+#. 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 und %s wurden aktualisiert."
+
+#. 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 Anwendung erfordert einen Neustart."
+msgstr[1] "%u Anwendungen erfordern einen Neustart."
+
+#. 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 "Beinhaltet %s, %s und %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 "Betriebssystemaktualisierungen sind nicht verfügbar"
+
+#. 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 ""
+"Aktualisieren Sie Ihr System, um weiterhin Sicherheitsaktualisierungen zu "
+"erhalten."
+
+#. 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 "Eine neue Version von %s steht zur Installation bereit"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Software-Systemaktualisierung verfügbar"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Software-Aktualisierungen fehlgeschlagen"
+
+#. 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 ""
+"Eine wichtige Betriebssystemaktualisierung konnte nicht installiert werden."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Details anzeigen"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Ansehen"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Aktualisierung fehlgeschlagen"
+
+#. 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 "Das System ist bereits auf dem neusten Stand."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Zuletzt überprüft: %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 wird nicht mehr unterstützt."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Ihr Betriebssystem wird nicht mehr unterstützt."
+
+#. 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 "Das bedeutet, dass es keine Sicherheitsaktualisierungen mehr erhält."
+
+#. 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 "Es wird empfohlen, dass Sie auf eine neuere Version aktualisieren."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Kosten könnten anfallen"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Trotzdem prüfen"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Kein Netzwerk"
+
+#. 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 ""
+"Für die Suche nach Aktualisierungen ist Zugriff auf das Internet notwendig."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Nach Aktualisierungen suchen"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Aktualisierungen"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Seite mit Aktualisierungen"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Aktualisierungen werden geladen …"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Auf dem neuesten Stand"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Mobiles Breitband nutzen?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "Trotzdem _prüfen"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Keine Verbindung"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Gehen Sie online, um nach Aktualisierungen zu suchen."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Netzwerkeinstellungen"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Fehler"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Aktualisierungen werden automatisch verwaltet."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Neu starten und Aktualisierungen installieren"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Alle Aktualisieren"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Aktualisierungen"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Geräte-Firmware"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s verfügbar"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Mehr über die neue Version erfahren"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Herunterladen …"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% heruntergeladen"
+
+# CHECK
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Neu starten & aktualisieren"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Denken Sie daran, Dateien zu sichern, bevor Sie aktualisieren."
+
+#: 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 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 ""
+"Aktualisierungen;Systemaktualisierung;Quellen;Einstellungen;Installieren;"
+"Entfernen;Programm;Software;App;Store;Anwendung;Update;"
+
+#. 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 "Systemaktualisierungen"
+
+#. 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 ""
+"Allgemeine Systemaktualisierungen wie die Behebung von Sicherheitslücken "
+"oder Fehlern, und Leistungsverbesserungen."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Vorgestellte Bilder werden heruntergeladen …"
+
+#. 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 "Eine Aktualisierung von %s mit neuen Funktionen und Fehlerbehebungen."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Systemaktualisierungsinformationen werden heruntergeladen …"
+
+#. 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 ""
+"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.
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7
+msgid "Flatpak is a framework for desktop applications on Linux"
+msgstr ""
+"Flatpak ist eine Laufzeitumgebung für Linux-Desktop-Anwendungen, deren "
+"Pakete distributionsunabhängig laufen"
+
+#. 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 "Systemordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Persönlicher Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Wirtssystem-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Wirtssystem-Konfiguration aus /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Schreibtisch-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Schreibtisch-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumente-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumente-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Musik-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Musik-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Bilder-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Bilder-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Öffentlich-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Öffentlich-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videos-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videos-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Vorlagen-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Vorlagen-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Benutzer-Zwischenspeicher-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Benutzer-Zwischenspeicher-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Benutzerkonfiguration-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Benutzerkonfiguration-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Benutzerdaten-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Benutzerdaten-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Benutzer-Laufzeit-Ordner"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Benutzer-Laufzeit-Unterordner %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Dateisystemzugriff auf %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Flatpak-Metadaten für %s werden geholt …"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Aktualisierung %s für USB-Empfänger"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Unsignierte Software installieren?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Unsignierte Software herunterladen?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Unsignierte Software aktualisieren?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pakete"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
+
+#, c-format
+#~ msgctxt "format-size"
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Anwendungsverwaltung für GNOME"
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Software catalog is being downloaded"
+#~ msgstr "Software-Katalog wird heruntergeladen"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "system"
+#~ msgstr "System"
+
+#~ 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 "Remove"
+#~ msgstr "Entfernen"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Keine zusätzlichen Softwarequellen"
+
+#~ msgid "_Enable"
+#~ msgstr "_Aktivieren"
+
+#~ 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 "_Restart Now"
+#~ msgstr "Jetzt _neustarten"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s ist bereit zur Installation"
+
+#~ 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 "Reference"
+#~ msgstr "Referenz"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Unbekannte Softwarelizenz"
+
+#~ 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 "Navigation sidebar"
+#~ msgstr "Navigations-Seitenleiste"
+
+#~ 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 "_Installed"
+#~ msgstr "_Installiert"
+
+#~ msgid "_Updates"
+#~ msgstr "A_ktualisierungen"
+
+#~ 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, %R"
+#~ msgstr "Gestern, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Datei konnte nicht gespeichert werden"
+
+#~ 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 "App ID"
+#~ msgstr "App-Kennung"
+
+#~ 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 "Delete Design"
+#~ msgstr "Design löschen"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Betriebssystemaktualisierung"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Kaufen von %s fehlgeschlagen"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Ich habe mein Passwort vergessen"
+
+#~ 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..f5d4f8e
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,7392 @@
+# 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 <dmtrs32@gmail.com>, 2013.
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2013, 2014, 2015.
+# Efstathios Iosifidis <iosifidis@opensuse.org>, 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: 2022-10-21 17:04+0000\n"
+"PO-Revision-Date: 2022-10-22 23:30+0300\n"
+"Last-Translator: Kosmas Martakidis <kosmmartak@gmail.com>\n"
+"Language-Team: Greek, Modern (1453-) <gnome-el-list@gnome.org>\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.1.1\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 "Λογισμικό"
+
+#: 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:2076
+#: src/gs-application.c:256
+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 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 ""
+"Η ηλικία σε δευτερόλεπτα για την επαλήθευση του upstream στιγμιοτύπου "
+"εξακολουθεί να είναι έγκυρη"
+
+#: 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 ""
+"Η επιλογή μεγαλύτερης τιμής θα σημαίνει λιγότερη επικοινωνία με τον "
+"απομακρυσμένο διακομιστή, αλλά οι ενημερώσεις των στιγμιότυπων ενδέχεται να "
+"χρειαστούν περισσότερο χρόνο για να εμφανιστούν στο χρήστη. Μια τιμή 0 "
+"σημαίνει να μην ελέγχεται ποτέ ο διακομιστής εαν η εικόνα υπάρχει ήδη στην "
+"λανθάνουσα μνήμη."
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "Το URI που επεξηγεί μη ελεύθερο και ιδιοταγές λογισμικό"
+
+#: 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 ""
+"Μια λίστα με URL που καταδεικνύουν σε αρχεία appstream τα οποία θα ληφθούν "
+"σε ένα φάκελο swcatalog"
+
+#: 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 ""
+"Εγκατάσταση αρχείων AppStream σε τοποθεσία για όλο το σύστημα και για όλους "
+"τους χρήστες. Αν είναι λάθος, τα αρχεία εγκαθιστώνται στο μη τυποποιημένο "
+"φάκελο $XDG_DATA_HOME/swcatalog/xml"
+
+#: 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 ""
+"Σειρά προτεραιότητας προτιμότερων μορφών πακεταρίσματος, με τις πιο "
+"σημαντικές μορφές να αναφέρονται πρώτες. Ένας κενός πίνακας υποδηλώνει την "
+"προεπιλεγμένη σειρά. Οι μορφές που παραλείπονται θεωρούνται ότι αναφέρονται "
+"τελευταίες. Παραδείγματα μορφών πακεταρίσματος είναι: deb, flatpak, rpm, "
+"snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "Το %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:1027
+#, 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:1031
+#, 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 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 είναι κατάλληλο για εφήβους"
+
+#. 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 είναι κατάλληλο για ενηλίκους"
+
+#. 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 είναι κατάλληλο για %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 "Βαθμολόγηση ηλικίας"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "Δυνατότητα πρόσβασης στις υπηρεσίες D-Bus στο δίαυλο συστήματος"
+
+#: 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 "Δυνατότητα πρόσβασης στις υπηρεσίες D-Bus στο δίαυλο συνεδρίας"
+
+#: 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 "Νέο στην έκδοση %s"
+
+#: 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 ""
+"Λειτουργία εκκίνησης : είτε ‘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: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 "Προτιμήστε τοπικές πηγές αρχείων σε AppStream"
+
+#: 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 ""
+"Ελληνική μεταφραστική ομάδα GNOME\n"
+" Δημήτρης Σπίγγος <dmtrs32@gmail.com>\n"
+" Μαρία Θουκυδίδου <marablack3@gmail.com>\n"
+" Μαρία Μαυρίδου <mavridou@gmail.com>\n"
+" Ευστάθιος Ιωσηφίδης <iosifidis@opensuse.org>\n"
+" Θάνος Τρυφωνίδης <tomtryf@gnome.org>\n"
+" Κοσμάς Μαρτακίδης <kosmmartak@gmx.com>\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:277 src/gs-shell.c:2156
+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 "Χρειάζεται επιπλέον λήψεις συστήματος μεγέθους %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: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 "Πηγή: %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 "Μετονομάστηκε από %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Βοήθεια στη μετάφραση του %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 σχεδιάστηκε, αναπτύχθηκε και μεταφράστηκε από μια διεθνή κοινότητα "
+"εθελοντών.\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: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 "Παρακαλούμε εισάγετε έναν αριθμό από το 1 έως το %u: "
+
+#. 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 "Γραφικά 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 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 είναι τώρα εγκατεστημένο"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"Το %s δεν είναι <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">ελεύθερου και ανοικτού κώδικα λογισμικό</a>, και παρέχεται "
+"από το «%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 παρέχεται από το «%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 ""
+"Μπορεί να είναι παράνομη η εγκατάσταση ή χρήση του %s σε κάποιες χώρες."
+
+#. 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] "%d λεπτό πριν"
+msgstr[1] "%d λεπτά πριν"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d ώρα πριν"
+msgstr[1] "%d ώρες πριν"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d ημέρα πριν"
+msgstr[1] "%d ημέρες πριν"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d εβδομάδα πριν"
+msgstr[1] "%d εβδομάδες πριν"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d μήνα πριν"
+msgstr[1] "%d μήνες πριν"
+
+#: src/gs-common.c:891
+#, 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: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 "Μια εφαρμογή"
+
+#. 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: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 "Άλλες εφαρμογές από %s"
+
+#. 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:1734 src/gs-details-page.c:1750
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Αδύνατη η εύρεση του «%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 "Βοήθεια στη _μετάφραση"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_Γράψτε κριτική"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] "Διαθέσιμες γραμματοσειρές για το σενάριο %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: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: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 "Δεν βρέθηκε το %s"
+
+#. 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 "Δεν υπάρχουν διαθέσιμες εφαρμογές που παρέχουν το αρχείο %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 ""
+"Πληροφορίες για το %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Πληροφορίες για το %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Πληροφορίες για το %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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"Πληροφορίες για το %s, καθώς και επιλογές για το πώς θα πάρετε έναν οδηγό "
+"που υποστηρίζει αυτόν τον εκτυπωτή μπορούν να βρεθούν στο %s."
+
+#. 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] ""
+"Αδυναμία εύρεσης του %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: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] ""
+"Αδυναμία εύρεσης του %s που αναζητούσατε. Παρακαλούμε δείτε το %s για "
+"περισσότερες πληροφορίες."
+msgstr[1] ""
+"Αδυναμία εύρεσης των %s που αναζητούσατε. Παρακαλούμε δείτε το %s για "
+"περισσότερες πληροφορίες."
+
+#: 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 "Αποτυχία εύρεσης αποτελεσμάτων αναζήτησης: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Μορφή αρχείου %s"
+
+#: 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 "Το %s πιθανώς λειτουργεί σε αυτή τη συσκευή"
+
+#. 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 λειτουργεί σε αυτή τη συσκευή"
+
+#. 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 υπολειτουργεί σε αυτή τη συσκευή"
+
+#. 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 δε λειτουργεί σε αυτή τη συσκευή"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Το λογισμικό αυτό αναπτύσσεται ανοικτά από μια κοινότητα εθελοντών, και "
+"κυκλοφορεί με την <a href=\"%s\">άδεια %s</a>.\n"
+"\n"
+"Μπορείτε να συνεισφέρετε και να βοηθήσετε για να γίνει ακόμα καλύτερο."
+
+#. 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 ""
+"Το λογισμικό αυτό αναπτύσσεται ανοικτά από μια κοινότητα εθελοντών, και "
+"κυκλοφορεί με την άδεια %s.\n"
+"\n"
+"Μπορείτε να συνεισφέρετε και να βοηθήσετε για να γίνει ακόμα καλύτερο."
+
+#: 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 ""
+"Το λογισμικό αυτό δεν αναπτύσσεται ανοικτά, συνεπώς μόνο οι προγραμματιστές "
+"του γνωρίζουν πώς λειτουργεί. Μπορεί να είναι ανασφαλές με τρόπο που είναι "
+"δύσκολο να ανιχνευτεί, ενώ μπορεί να αλλάξει χωρίς επίβλεψη.\n"
+"\n"
+"Μπορεί να μην είναι εφικτό να συνεισφέρετε στο λογισμικό αυτό."
+
+#. 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 ""
+"Το τρέχον δίκτυο μετράται. Οι μετρήσιμες συνδέσεις έχουν όρια δεδομένων ή "
+"χρεώσεις που σχετίζονται με αυτές. Για να γλιτώσετε δεδομένα, οι αυτόματες "
+"ενημερώσεις έχουν διακοπεί.\n"
+"\n"
+"Οι αυτόματες ενημερώσεις θα συνεχιστούν όταν γίνει διαθέσιμο ένα μη "
+"μετρήσιμο δίκτυο. Μέχρι τότε, εξακολουθεί να είναι δυνατή η χειροκίνητη "
+"εγκατάσταση ενημερώσεων.\n"
+"\n"
+"Εναλλακτικά, αν το τρέχον δίκτυο έχει αναγνωριστεί εσφαλμένα ως μετρήσιμο, η "
+"ρύθμιση αυτή μπορεί να αλλάξει."
+
+#: 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 "Beta"
+
+#. 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 ""
+"Παρέχει πρόσβαση σε επιπρόσθετο λογισμικό από %s. Περιλαμβάνεται ιδιοταγές "
+"λογισμικό."
+
+#. 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:2829
+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 "Είστε σίγουροι ότι θέλετε να αφαιρέσετε το αποθετήριο %s;"
+
+#. 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 ""
+"Όλες οι εφαρμογές από το %s θα απεγκατασταθούν, και θα χρειαστεί να "
+"επανεγκαταστήσετε το αποθετήριο για να τις χρησιμοποιήσετε ξανά."
+
+#. 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 "Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε το %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 θα απεγκατασταθεί και θα πρέπει να το εγκαταστήσετε ξανά για να το "
+"χρησιμοποιήσετε."
+
+#: 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 ""
+"Μερικές από τις εγκατεστημένες εφαρμογές δεν είναι συμβατές με το %s. Αν "
+"συνεχίσετε, τα ακόλουθα θα αφαιρεθούν αυτόματα από την αναβάθμιση:"
+
+#: 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 ""
+"Το λογισμικό που έχει εγκατασταθεί από το αποθετήριο \"%s\" θα σταματήσει να "
+"λαμβάνει ενημερώσεις."
+
+#: 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 "Πρόσθετα αποθετήρια από επιλεγμένους τρίτους — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 ""
+"Αυτά τα αποθετήρια συμπληρώνουν το προεπιλεγμένο λογισμικό που παρέχεται από "
+"το %s."
+
+#. 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] "%u εφαρμογή εγκαταστάθηκε"
+msgstr[1] "%u εφαρμογές εγκαταστάθηκαν"
+
+#. 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 πρόσθετο εγκαταστάθηκε"
+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-repo-row.c:175
+#, 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 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 πρόσθετο"
+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-repo-row.c:188
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "Τα %s και %s εγκαταστάθηκαν"
+msgstr[1] "Τα %s και %s εγκαταστάθηκαν"
+
+#. 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 "Το μισώ"
+
+#. 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Βρείτε τα δεδομένα που αποστέλλονται στην <a href=\"https://odrs.gnome.org/"
+"privacy\">πολιτική απορρήτου</a>. Το πλήρες όνομα που αντιστοιχεί στο "
+"λογαριασμό σας θα προβάλλεται δημοσίως."
+
+#: 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:93
+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: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 "Το %s είναι πιθανώς επισφαλές"
+
+#. 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 είναι επισφαλές"
+
+#. 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 "Παρωχημένη έκδοση 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 "Επόμενο στιγμιότυπο οθόνης"
+
+#: 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] "%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 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 "Αδύνατη η λήψη ενημερώσεων υλικολογισμικού από το %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 "Αδύνατη η λήψη ενημερώσεων από το %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 "Αδύνατη η λήψη ενημερώσεων"
+
+#. 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 ""
+"Αδύνατη η λήψη ενημερώσεων από %s: δεν υπάρχει επαρκής χώρος στον δίσκο"
+
+#. 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 "Αδύνατη η εγκατάσταση του %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 "Αδύνατη η εγκατάσταση του %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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Αδύνατη η εγκατάσταση του %s καθώς δεν υποστηρίζεται"
+
+#. 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 "Αδύνατη η εγκατάσταση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr ""
+"Αδύνατη η εγκατάσταση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό"
+
+#. 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 "Αδύνατη η εγκατάσταση του %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 "Αδύνατη η ενημέρωση του %s από %s καθώς απέτυχε η λήψη"
+
+#. 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 "Αδύνατη η ενημέρωση του %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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Αδύνατη η εγκατάσταση ενημερώσεων από %s καθώς απέτυχε η λήψη"
+
+#. 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 "Αδύνατη η ενημέρωση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο"
+
+#. 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 "Αδύνατη η ενημέρωση του %s: απαιτείται πιστοποίηση"
+
+#. 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 "Αδύνατη η ενημέρωση του %s: ήταν άκυρη η πιστοποίηση"
+
+#. 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 ""
+"Αδύνατη η ενημέρωση του %s: δεν έχετε άδεια για να ενημερώσετε λογισμικό"
+
+#. 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 "Αδύνατη η ενημέρωση του %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: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 "Αδύνατη η ενημέρωση του %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: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 "Αδύνατη η ενημέρωση του %s"
+
+#. 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 "Αδύνατη η αναβάθμιση του %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 "Αδύνατη η αναβάθμιση του %s καθώς απέτυχε η λήψη"
+
+#. 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 ""
+"Αδύνατη η αναβάθμιση σε %s: ήταν απαραίτητη η πρόσβαση στο διαδίκτυο αλλά "
+"δεν ήταν διαθέσιμη"
+
+#. 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 "Αδύνατη η αναβάθμιση του %s: δεν υπάρχει επαρκής χώρος στον δίσκο"
+
+#. 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 "Αδύνατη η αναβάμιση του %s: απαιτείται πιστοποίηση"
+
+#. 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 "Αδύνατη η αναβάθμιση του %s: ήταν άκυρη η πιστοποίηση"
+
+#. 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 "Αδύνατη η αναβάθμιση του %s: δεν έχετε άδεια για να αναβαθμίσετε"
+
+#. 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 "Αδύνατη η αναβάμιση του %s: απαιτείται συνεχόμενη παροχή ρεύματος"
+
+#. 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 ""
+"Αδύνατη η αναβάθμιση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό"
+
+#. 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 "Αδύνατη η αναβάθμιση του %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 "Αδύνατη η αφαίρεση του %s: απαιτείται πιστοποίηση"
+
+#. 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 "Αδύνατη η αφαίρεση του %s: ήταν άκυρη η πιστοποίηση"
+
+#. 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 "Αδύνατη η αφαίρεση του %s: δεν έχετε άδεια για να αφαιρέσετε λογισμικό"
+
+#. 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 "Αδύνατη η αφαίρεση του %s: απαιτείται συνεχόμενη παροχή ρεύματος"
+
+#. 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 "Αδύνατη η αφαίρεση του %s: Το επίπεδο της μπαταρίας είναι πολύ χαμηλό"
+
+#. 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 "Αδύνατη η αφαίρεση του %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 "Αδύνατη η εκκίνηση του %s: δεν είναι εγκατεστημένο το %s"
+
+#. 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 "Συγνώμη, κάτι πήγε λάθος"
+
+#. 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 ""
+"Δεν υπάρχει αρκετός χώρος στον δίσκο — ελευθερώστε κάποιο χώρο και "
+"προσπαθήστε ξανά"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Αδύνατη η εγκατάσταση του αρχείου: δεν υποστηρίζεται"
+
+#. 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 "Απέτυχε η εγκατάσταση: αποτυχία πιστοποίησης"
+
+#. 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 "Αδύνατη η επικοινωνία με το %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 "Το επίπεδο της μπαταρίας είναι πολύ χαμηλό"
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Τα αποθηκευμένα δεδομένα μπορούν να εκκαθαριστούν από τις <a "
+"href=\"dummy\">ρυθμίσεις _εφαρμογής</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (εγκαταστάθηκε)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (εγκαθίσταται)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (αφαιρείται)"
+
+#. 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 "Εγκατεστημένο στο %s"
+
+#: 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] "%u Εφαρμογή ενημερώθηκε — Απαιτείται επανεκκίνηση"
+msgstr[1] "%u Εφαρμογές ενημερώθηκαν — Απαιτείται επανεκκίνηση"
+
+#. 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 Ενημέρωση εφαρμογής"
+msgstr[1] "%u Ενημερώσεις εφαρμογών"
+
+#. 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 "οι εφαρμογές %s και %s έχουν ενημερωθεί."
+
+#. 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 εφαρμογή απαιτεί επανεκκίνηση."
+msgstr[1] "%u εφαρμογές απαιτούν επανεκκίνηση."
+
+#. 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 "Η νέα έκδοση του %s είναι διαθέσιμη προς εγκατάσταση"
+
+#. 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 "Καλώς ήλθατε στο %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 "Επισκόπηση"
+
+#. 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 "Ελέγχθηκε τελευταία φορά: %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 δεν υποστηρίζεται πλέον."
+
+#: 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 "Το %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:95
+#, c-format
+msgid "%s Available"
+msgstr "Το %s είναι διαθέσιμο"
+
+#: 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 "Λήφθηκαν %s από %s"
+
+#. 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%%"
+
+#: 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 ""
+"Ενημερώσεις;Αναβαθμίσεις;Πηγές;Αποθετήρια;Προτιμήσεις;Εγκατάσταση;"
+"Απεγκατάσταση;Πρόγραμμα;Λογισμικό;Εφαρμογή;Αποθήκευση;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: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 "Μια ενημέρωση του %s με νέες δυνατότητες και επιδιορθώσεις."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr ""
+"Η υπηρεσία ενημέρωσης του EOS δεν μπορεί να κάνει λήψη και εφαρμογή της "
+"ενημέρωσης."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "Ιστός GNOME"
+
+#: 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 "Το Flatpak είναι ένα framework για εφαρμογές στο Linux"
+
+#. 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 "Φάκελος συστήματος %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Προσωπικός υποφάκελος %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Φάκελοι κεντρικού συστήματος"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Παραμετροποίηση κεντρικού συστήματος από τον /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Φάκελος επιφάνειας εργασίας"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Υποφάκελος επιφάνειας εργασίας %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Φάκελος εγγράφων"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Υποφάκελος εγγράφων %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Φάκελος μουσικής"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Υποφάκελος μουσικής %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Φάκελος εικόνων"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Υποφάκελος εικόνων %s"
+
+#: 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 "Υποφάκελος δημόσιας κοινής χρήσης %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Φάκελος βίντεο"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Υποφάκελος βίντεο %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Φάκελος προτύπων"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Υποφάκελος προτύπων %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Φάκελος cache χρήστη"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Υποφάκελος cache χρήστη %s"
+
+#: 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 "Υποφάκελος παραμετροποίησης χρήστη %s"
+
+#: 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 "Υποφάκελος δεδομένων χρήστη %s"
+
+#: 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 "Υποφάκελος εκτέλεσης χρήστη %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Πρόσβαση συστήματος αρχείων σε %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Λήψη μεταδεδομένων flatpak για %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Αποτυχία προσθήκης για εγκατάσταση του προσθέτου «%s»: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Αποτυχία προσθήκης για απεγκατάσταση του προσθέτου «%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 ""
+"Το απομακρυσμένο \"%s\" δεν επιτρέπει την εγκατάσταση του \"%s\", πιθανώς "
+"λόγω του φίλτρου του. Αφαιρέστε το φίλτρο και επαναλάβετε την εγκατάσταση. "
+"Αναλυτικό σφάλμα: %s"
+
+#. 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 Ενημέρωση συσκευής"
+
+#. 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 Ενημέρωση συστήματος"
+
+#. 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 Ενημέρωση ελεγκτή 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s Ενημέρωση ρύθμισης"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s Ενημέρωση κάμερας"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s Ενημέρωση TPM"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s Ενημέρωση επιφάνειας αφής"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s Ενημέρωση ποντικιού"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 Ενημέρωση ελεγκτή αποθηκευτικού χώρου"
+
+#. 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 Ενημέρωση διεπαφής δικτύου"
+
+#. 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 Ενημέρωση οθόνης"
+
+#. 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"
+
+#. 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 "%s Ενημέρωση δέκτη USB"
+
+#: 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 "Λειτουργικό σύστημα (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 "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 "_Installed"
+#~ msgstr "Ε_γκατεστημένο"
+
+#~ msgid "_Updates"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Remove"
+#~ msgstr "Αφαίρεση"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Κανένα επιπρόσθετο αποθετήριο"
+
+#~ msgid "_Enable"
+#~ 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 "_Restart Now"
+#~ 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 "App ID"
+#~ msgstr "ID εφαρμογής"
+
+#~ 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 "Delete Design"
+#~ msgstr "Διαγραφή σχεδίου"
+
+#~ msgid "OS Upgrade"
+#~ 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 "Unable to purchase %s"
+#~ 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 "U_pdate All"
+#~ 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'"
+
+#~ msgid "_Install All"
+#~ 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 "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 "web app"
+#~ 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 "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 "No sources found."
+#~ msgstr "Δεν βρέθηκαν πηγές."
+
+#~ msgid "OK"
+#~ 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 ""
+#~ "<li>View installed applications</li> <li>Remove installed applications</"
+#~ "li> <li>View available application updates</li> <li>Install available "
+#~ "updates</li> <li>Find new applications</li> <li>Install new applications</"
+#~ "li> <li>Find an application to handle a specific type of file</li> "
+#~ "<li>Installed apps and updates should be available when offline</li>"
+#~ msgstr ""
+#~ "<li>Προβολή εγκατεστημένων εφαρμογών</li> <li>Αφαίρεση εγκατεστημένων "
+#~ "εφαρμογών</li> <li>Προβολή διαθέσιμων ενημερώσεων εφαρμογών</li> "
+#~ "<li>Εγκατάσταση διαθέσιμων ενημερώσεων</li> <li>Εύρεση νέων εφαρμογών</"
+#~ "li> <li>Εγκατάσταση νέων εφαρμογών</li> <li>Εύρεση μιας εφαρμογής για να "
+#~ "χειριστεί έναν ειδικό τύπο αρχείου</li> <li>Οι εγκατεστημένες εφαρμογές "
+#~ "και ενημερώσεις πρέπει να είναι διαθέσιμες χωρίς σύνδεση</li>"
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..fa586f7
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,6776 @@
+# 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 <richard@hughsie.com>, 2012.
+# Philip Withnall <philip@tecnocode.co.uk>, 2013.
+# Zander Brown <zbrown@gnome.org>, 2019-2021.
+# Bruce Cowan <bruce@bcowan.me.uk>, 2017-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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-09-05 10:45+0100\n"
+"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
+"Language-Team: English - United Kingdom <en@li.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 42.0\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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Software allows you to find and install new applications and system "
+"extensions and remove existing installed applications."
+
+#: 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 ""
+"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."
+
+#: 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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: 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 "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 last timestamp when the system was online and got any updates"
+msgstr "The last timestamp when the system was online and got any updates"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "The server to use for application reviews"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "The minimum karma score for reviews"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+msgid ""
+"The licence URL to use when an application should be considered free software"
+msgstr ""
+"The license URL to use when an application should be considered free software"
+
+#: data/org.gnome.software.gschema.xml:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Allow access to the Software Repositories dialogue"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Offer upgrades for pre-releases"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "The URI that explains nonfree and proprietary software"
+
+#: 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 ""
+"A list of URLs pointing to appstream files that will be downloaded into an "
+"swcatalog folder"
+
+#: 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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Software AppStream system-wide installer"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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 e-mail "
+"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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Age Rating"
+
+#: 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 "How to contribute missing information"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Package"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pending"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Pending install"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Pending remove"
+
+#: 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 "Installed"
+
+#. 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 "Installing"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Removing"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Uninstall"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Network"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Can communicate over the network"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "System Services"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Session Services"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Devices"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Can access system device files"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Home folder"
+
+#: 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 "Can view, edit and create files"
+
+#: 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 "Can view files"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Downloads folder"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Settings"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Can view and change any settings"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Legacy display system"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Uses an old, insecure display system"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Sandbox escape"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Can escape the sandbox and circumvent any other restrictions"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Update Details"
+
+#. 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 "No update description available."
+
+#: 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 "Go back"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Requires additional 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:855
+msgid "Reviews"
+msgstr "Reviews"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "No reviews were found for this application."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "No Reviews"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Version History"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "New in Version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 "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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Show a local metainfo or appdata file"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Show verbose debugging information"
+
+#: 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 update preferences"
+msgstr "Show update 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 GNOME Software contributors"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Philip Withnall <philip@tecnocode.co.uk>\n"
+"David King <amigadave@amigadave.com>\n"
+"Bruce Cowan <bruce@bcowan.me.uk>\n"
+"Waldo Luís Ribeiro <waldoribeiro@sapo.pt>\n"
+"Zander Brown <zbrown@gnome.org>"
+
+#. 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:2147
+msgid "About Software"
+msgstr "About Software"
+
+#. 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 "A nice way to manage the software on your system."
+
+#. 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 "Sorry! There are no details for that application."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Can access hardware 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Can access arbitrary 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Can acquire arbitrary permissions"
+
+#. 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 "Reviewed by your distribution"
+
+#. 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 "Provided by a third party"
+
+#. 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 "Proprietary code"
+
+#. 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 "Auditable code"
+
+#. 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 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 "Software no longer supported"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Unsafe"
+
+#: 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 "Mobile Only"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Only works on a small screen"
+
+#: 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 "Desktop Only"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Only works on a large screen"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Screen Size Mismatch"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Doesn’t support your current screen size"
+
+#: 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 "Requires a touchscreen"
+
+#: 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 "Requires a keyboard"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requires a mouse"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Gamepad Needed"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptive"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Works on phones, tablets and desktops"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probably requires a keyboard or mouse"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Contains no age-inappropriate content"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visit Website"
+
+#. 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 "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:167 src/gs-updates-section.ui:62
+msgid "Cancel"
+msgstr "Cancel"
+
+#. 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 "Install"
+
+#. 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 "Update"
+
+#. 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 "Uninstall"
+
+#. 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 "Uninstalling"
+
+#. 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 "Device cannot be used during update."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renamed from %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Help Translate %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 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."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "Translations"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Translation Website"
+
+#. 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 "Login required remote %s (realm %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Login Required"
+
+#: 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 "_Cancel"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Login"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_User"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Password"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "New & Updated"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Other Software"
+
+#. 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 "Please enter a number from 1 to %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Choose an application:"
+
+#: 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 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 is now installed"
+
+#. 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 "A restart is required for the changes to take effect."
+
+#. 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 "Application is ready to be used."
+
+#. 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 "System updates are now installed"
+
+#. 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 "Recently installed updates are available to review"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Restart"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Launch"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Install Third-Party Software?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Enable Third-Party Software Repository?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%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 is provided by “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Don’t Warn Again"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Detailed errors from the package manager follow:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Details"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Accept"
+
+#. 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] "An update has been installed"
+msgstr[1] "Updates have been installed"
+
+#. 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] "An application has been removed"
+msgstr[1] "Applications have been removed"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Not Now"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Just now"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d hour ago"
+msgstr[1] "%d hours ago"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d year ago"
+msgstr[1] "%d years 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:1246
+#, 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 "An 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 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:332
+msgid "Find in Software"
+msgstr "Find in Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Show More"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Show Less"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Removing…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Requires restart to finish install"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Pending update…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparing…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Uninstalling…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Install"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Restart"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Install…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Other Apps by %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "You need internet access to write a review"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Unable to find “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Details page"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Loading application details…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Help _Translate"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Open"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Update"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Downloading"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Add-ons"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Selected add-ons will be installed with the application."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"This application can only be used when there is an active internet "
+"connection."
+
+#: src/gs-details-page.ui:587
+msgid "Software Repository Included"
+msgstr "Software Repository Included"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+
+#: src/gs-details-page.ui:605
+msgid "No Software Repository Included"
+msgstr "No Software Repository Included"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Software Repository Identified"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Only use software repositories that you trust."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "No Metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Project _Website"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donate"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribute _Translations"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Report an Issue"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Help"
+
+#. 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 "_Write Review"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "All Reviews"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Available fonts for the %s script"
+msgstr[1] "Available fonts for the %s scripts"
+
+#. 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] "Available software for %s"
+msgstr[1] "Available software for %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Requested software not found"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s not found"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "on the website"
+
+#. 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 "No applications 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: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 ""
+"Information about %s, as well as options for how to get missing applications "
+"might be found %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 "No applications are available for %s support."
+
+#. 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 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: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 ""
+"Information about %s, as well as options for how to get an application that "
+"can support this format might be found %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Failed to find any search results: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s file format"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Unable to Find Requested Software"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Codecs page"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Desktop Support"
+
+#: 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 "Supports being used on a large screen"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Desktop Support Unknown"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requires a large screen"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Desktop Not Supported"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Cannot be used on a large screen"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobile Support"
+
+#: 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 "Supports being used on a small screen"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobile Support Unknown"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requires a small screen"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobile Not Supported"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Cannot be used on a small screen"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Keyboard Support"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Keyboard Support Unknown"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Keyboard Required"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Supports keyboards"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Keyboard Not Supported"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Cannot be used with a keyboard"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Mouse Support"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requires a mouse or pointing device"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Mouse Support Unknown"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Mouse Required"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Supports mice and pointing devices"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mouse Not Supported"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Touchscreen Support"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Touchscreen Support Unknown"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Touchscreen Required"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Supports touchscreens"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Touchscreen Not Supported"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Cannot be used with a touchscreen"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad Required"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Requires a gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Gamepad Support"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hardware Support"
+
+#. 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 "Installed"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Installed page"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Applications"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Web Applications"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "System Applications"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Community Built"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s licence</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+
+#. 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 ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the %s licence.\n"
+"\n"
+"You can contribute and help make it even better."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietary"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Learn More"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Downloading software catalogue"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Loading page"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Starting up…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatic Updates Paused"
+
+#: 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 ""
+"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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Open Network _Settings"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderate page"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "There are no reviews to moderate"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "User"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Additions"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Removals"
+
+#. 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 "Updates"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Downgrades"
+
+#. 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 "selected external sources"
+
+#. 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 ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+
+#. 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 "Enable"
+
+#. 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 "Explore"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Overview page"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Enable Third Party Software Repositories?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Other Categories"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "No Application Data Found"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Unknown"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "User declined installation"
+
+#. 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 "Prepare %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 "Are you sure you want to remove the %s repository?"
+
+#. 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 ""
+"All applications 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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Are you sure you want to uninstall %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 will be uninstalled, and you will have to install it to use it again."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Update Preferences"
+
+#: 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 ""
+"To avoid charges and network caps, software updates are not automatically "
+"downloaded on mobile or metered connections."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatic Updates"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Downloads and installs software updates in the background, when possible."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Automatic Update Notifications"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Show notifications when updates have been automatically installed."
+
+#. 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 ""
+"Some of the currently installed software is not compatible with %s. If you "
+"continue, the following will be automatically removed during the upgrade:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Incompatible Software"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continue"
+
+#. 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 ""
+"Software that has been installed from “%s” will cease to receive updates."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Disable Repository?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Remove"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Enable New Repositories"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Additional repositories from selected third parties — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "These repositories supplement the default software provided by %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Software Repositories"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "No Repositories"
+
+#. 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 application installed"
+msgstr[1] "%u applications installed"
+
+#. 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 add-on installed"
+msgstr[1] "%u add-ons installed"
+
+#. 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 application"
+msgstr[1] "%u applications"
+
+#. 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 add-on"
+msgstr[1] "%u add-ons"
+
+#. 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 and %s installed"
+msgstr[1] "%s and %s installed"
+
+#. 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 "Hate it"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Don’t like it"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "It’s OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Like it"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Love it"
+
+#. 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 "Please take more time writing the review"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Please choose a star rating"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "The summary is too short"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "The summary is too long"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "The description is too short"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Post Review"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Post"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Rating"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Summary"
+
+#: src/gs-review-dialog.ui:97
+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”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Review"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Report Review?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Report"
+
+#. 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 "Was this review useful to you?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Yes"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "No"
+
+#. 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 "Report…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Remove…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Check that you trust the vendor, as the application isn’t sandboxed"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+
+#. 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 "No Permissions"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Network Access"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "No Network Access"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Uses System Services"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Uses Session Services"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Device Access"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "No Device Access"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Full File System Read/Write Access"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Home Folder Read/Write Access"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Full File System Read Access"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Home Folder Read Access"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Download Folder Read/Write Access"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Download Folder Read Access"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Can read all data in your downloads directory"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "No File System Access"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Cannot access the file system at all"
+
+#. 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 "Proprietary Code"
+
+#: 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 ""
+"The source code is not public, so it cannot be independently audited and "
+"might be unsafe"
+
+#. 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 "Auditable Code"
+
+#: 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 ""
+"The source code is public and can be independently audited, which makes the "
+"app more likely to be 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.
+#: src/gs-safety-context-dialog.c:354
+msgid "App developer is verified"
+msgstr "App developer is verified"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Insecure Dependencies"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 is safe"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s is unsafe"
+
+#. 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 "Safety"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Source"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Outdated SDK version"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "No screenshot provided"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Screenshot not found"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Screenshot not valid"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Search page"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Search for Apps"
+
+#: src/gs-search-page.ui:46
+msgid "No Application Found"
+msgstr "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Unable to download updates"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Unable to download updates: not enough disk space"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Unable to download updates: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Unable to download updates: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Unable to get list of updates"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Unable to install %s as download failed from %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Unable to install %s as download failed"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Unable to install %s as runtime %s not available"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Unable to install %s as not supported"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr "Unable to install: internet access was required but wasn’t available"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Unable to install: the application has an invalid format"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Unable to install %s: not enough disk space"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Unable to install %s: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Unable to install %s: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Unable to install %s: AC power is required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Unable to install %s: The battery level is too low"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Unable to install %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Unable to update %s from %s as download failed"
+
+#. 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 update %s as download failed"
+msgstr "Unable to update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Unable to install updates from %s as download failed"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Unable to install updates as download failed"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr "Unable to update: internet access was required but wasn’t available"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Unable to install updates: not enough disk space"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Unable to update %s: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Unable to install updates: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Unable to update %s: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Unable to install updates: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Unable to update %s: AC power is required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Unable to install updates: AC power is required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Unable to update %s: The battery level is too low"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Unable to install updates: The battery level is too low"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Unable to update %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Unable to install updates"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Unable to upgrade to %s as download failed"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Unable to upgrade to %s: 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Unable to upgrade to %s: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Unable to upgrade to %s: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Unable to upgrade to %s: AC power is required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Unable to upgrade to %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Unable to remove %s: authentication was required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Unable to remove %s: authentication was invalid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Unable to remove %s: AC power is required"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Unable to remove %s: The battery level is too low"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Unable to remove %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Not enough disk space — free up some space and try again"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Sorry, something went wrong"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Failed to install file: not supported"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Failed to install file: authentication failed"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Failed to install: not supported"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Failed to install: authentication failed"
+
+#. 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 "Unable to contact %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Software needs to be restarted to use new plug-ins."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "AC power is required"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "The battery level is too low"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Software Repositories"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Update Preferences"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examine 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 "Network Settings"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Restart Now"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "More Information"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Search"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Primary Menu"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Find Out _More"
+
+#. 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 "Updates"
+
+#. 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 "Application Data"
+msgstr "Application Data"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application to run"
+msgstr "Data needed for the application 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 application"
+msgstr "Data created by you in the application"
+
+#: 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 application itself"
+msgstr "The application 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 application"
+msgstr "Shared system components required by this application"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Unknown"
+
+#. 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 "Storage"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Installed)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Installing)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Removing)"
+
+#. 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 "Installed Updates"
+
+#. 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 "Installed on %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "No Updates Installed"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Software Updates Are Out of Date"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Please check for software updates."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Critical Software Update Ready to Install"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "An important software update is ready to be installed."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Critical Software Updates Available to Download"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Important: Critical software updates are waiting."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Software Updates Ready to Install"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Software updates are waiting and ready to be installed."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Software Updates Available to Download"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Please download waiting software updates."
+
+#. 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 Application Updated — Restart Required"
+msgstr[1] "%u Applications Updated — Restart Required"
+
+#. 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 Application Updated"
+msgstr[1] "%u Applications Updated"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s has been updated."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Please restart the application."
+
+#. 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 and %s have been updated."
+
+#. 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 application requires a restart."
+msgstr[1] "%u applications require a restart."
+
+#. 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 "Includes %s, %s and %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 "Operating System Updates Unavailable"
+
+#. 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 "Upgrade to continue receiving security updates."
+
+#. 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 "A new version of %s is available to install"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Software Upgrade Available"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Software Updates Failed"
+
+#. 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 "An important operating system update failed to be installed."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Show Details"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Review"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Last checked: %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 is no longer supported."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Your operating system is no longer supported."
+
+#. 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 "This means that it does not receive security updates."
+
+#. 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 "It is recommended that you upgrade to a more recent version."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Charges May Apply"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Check _Anyway"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "No Network"
+
+#. 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 "Internet access is required to check for updates."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Check for updates"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Updates"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Updates page"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Loading Updates…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Up to Date"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Use Mobile Data?"
+
+#: src/gs-updates-page.ui:243
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr "Checking for updates when using mobile broadband could incur charges."
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "_Check Anyway"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "No Connection"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Go online to check for updates."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Network Settings"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Error"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Updates are automatically managed."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Restart & Update"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+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:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Application Updates"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Device Firmware"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s Available"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Learn about the new version"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Downloading…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% downloaded"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Restart & Upgrade"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Remember to back up data and files before upgrading."
+
+#: 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 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;"
+
+#. 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 "System Updates"
+
+#. 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 ""
+"General system updates, such as security or bug fixes, and performance "
+"improvements."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Downloading featured images…"
+
+#. 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 update with new features and fixes."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Downloading upgrade information…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications on Linux"
+msgstr "Flatpak is a framework for desktop applications on Linux"
+
+#. 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 "System folder %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Home subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Host system folders"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Host system configuration from /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Desktop folder"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Desktop subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Documents folder"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Documents subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Music folder"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Music subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Pictures folder"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Pictures subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Public Share folder"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Public Share subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videos folder"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videos subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Templates folder"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Templates subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "User cache folder"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "User cache subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "User configuration folder"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "User configuration subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "User data folder"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "User data subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "User runtime folder"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "User runtime subfolder %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Filesystem access to %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Getting flatpak metadata for %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Remote “%s” doesn't allow install of “%s”, possibly due to its filter. "
+"Remove the filter and repeat the install. Detailed error: %s"
+
+#. 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s Configuration Update"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s Camera Update"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM Update"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s Touchpad Update"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB Receiver Update"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Install Unsigned Software?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Download Unsigned Software?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Update Unsigned Software?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Packages"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "system"
+
+#~ 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 "Remove"
+#~ msgstr "Remove"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "No Additional Repositories"
+
+#~ msgid "_Enable"
+#~ msgstr "_Enable"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Remove…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Disable…"
+
+#~ msgid "Disabling"
+#~ msgstr "Disabling"
+
+#~ msgid "Enabled"
+#~ msgstr "Enabled"
+
+#~ msgid "Disabled"
+#~ msgstr "Disabled"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Navigation sidebar"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Restart Now"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s Ready to be Installed"
+
+#~ msgid "Select All"
+#~ msgstr "Select All"
+
+#~ msgid "Select None"
+#~ msgstr "Select None"
+
+#~ msgid "_Installed"
+#~ msgstr "_Installed"
+
+#~ msgid "_Updates"
+#~ msgstr "_Updates"
+
+#~ 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 "Reference"
+#~ msgstr "Reference"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Unknown Software Licence"
+
+#~ 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, %R"
+#~ msgstr "Yesterday, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Failed to save file"
+
+#~ 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 "App ID"
+#~ msgstr "App ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Delete Design"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "OS Upgrade"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Unable to purchase %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "I have forgotten my password"
+
+#~ 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 "U_pdate All"
+#~ msgstr "U_pdate All"
+
+#~ 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 "_Install All"
+#~ msgstr "_Install All"
+
+#~ 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..04fe084
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,5401 @@
+# 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 <blatberk@openmailbox.org>, 2015.
+# Axel ROUSSEAU <axel.rousseau@esperanto-france.org>, 2016.
+# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018.
+# Tirifto <tirifto@posteo.cz>, 2019.
+# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2014-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: 2020-01-08 13:27+0000\n"
+"PO-Revision-Date: 2020-01-07 19:35+0100\n"
+"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
+"Language-Team: Esperanto <gnome-eo-list@gnome.org>\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 2.2.4\n"
+"X-DamnedLies-Scope: partial\n"
+"X-Project-Style: gnome\n"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:7
+msgid "GNOME Software"
+msgstr "GNOME Programaro"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Aplikaĵo-administrilo por 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 ""
+"Programaro lasas al vi trovi kaj instali novajn aplikaĵojn kaj sistemajn "
+"etendaĵojn, kaj forigi instalitajn aplikaĵojn."
+
+#: 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 Programaro eksponas popularajn aplikaĵojn kun utilaj priskriboj kaj "
+"pluraj ekrankopioj por ĉiu aplikaĵo. Oni povas trovi aplikaĵojn aŭ per "
+"foliumi la liston de kategorioj aŭ per serĉi. Ĝi lasas al vi ĝisdatigi vian "
+"sistemon uzante senretan ĝisdatigon."
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "Superrigarda panelo"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+msgid "Details panel"
+msgstr "Panelo de detaloj"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Installed panel"
+msgstr "Panelo de instalitaj aplikaĵoj"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Updates panel"
+msgstr "Panelo de ĝisdatigoj"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+msgid "The update details"
+msgstr "La detaloj de la ĝisdatigo"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1449
+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 "Install 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 projektojn, kiujn ni montru, kiel ekzemple "
+"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 ""
+"Kiam malŝaltita, GNOME Programaro kaŝos la panelon de ĝisdatigoj, kaj faros "
+"neniujn aŭtomatajn ĝisdatigojn nek petos altgradigojn."
+
+#: 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: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 "A list of popular applications"
+msgstr "Listo de popularaj aplikaĵoj"
+
+#: data/org.gnome.software.gschema.xml:48
+msgid "A list of applications to use, overriding the system defined ones."
+msgstr "Listo de uzotaj aplikaĵoj, transpasantaj tiujn difinitajn sisteme."
+
+#: data/org.gnome.software.gschema.xml:52
+msgid "The last update check timestamp"
+msgstr "La lasta ĝisdatig-kontrola tempindiko"
+
+#: data/org.gnome.software.gschema.xml:56
+msgid "The last upgrade notification timestamp"
+msgstr "La lasta ĝisdatiga sciiga tempindiko"
+
+#: data/org.gnome.software.gschema.xml:64
+msgid "The last update timestamp"
+msgstr "La lasta ĝisdatiga tempindiko"
+
+#: data/org.gnome.software.gschema.xml:72
+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:82
+msgid "The server to use for application reviews"
+msgstr "Servilo uzota por recenzoj de aplikaĵoj"
+
+#: data/org.gnome.software.gschema.xml:91
+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:95
+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:99
+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:103
+#, 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:107
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Permesi aliron al la programaraj deponejoj dialogo"
+
+#: data/org.gnome.software.gschema.xml:111
+msgid "Offer upgrades for pre-releases"
+msgstr "Prezenti altgradigojn al antaŭeldonoj"
+
+#: data/org.gnome.software.gschema.xml:115
+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"
+
+#. 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://eo.wikipedia.org/wiki/Mallibera_programaro'"
+
+#: data/org.gnome.software.gschema.xml:128
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "La URI, kiu komprenigas malliberan programaron"
+
+#: 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 ""
+"Listo de URL-oj, montrantaj al appstream-dosieroj, kiuj elŝutiĝos al "
+"dosierujo de app-info"
+
+#: data/org.gnome.software.gschema.xml:136
+msgid "Install the AppStream files to a system-wide location for all users"
+msgstr "Install appstream-dosieron en sisteman lokon por ĉiuj uzantoj"
+
+#: data/org.gnome.software.gschema.xml:140
+msgid "Enable GNOME Shell extensions repository"
+msgstr "Ŝalti GNOME-ŝelan etendaĵan deponejon"
+
+#: data/org.gnome.software.gschema.xml:147
+msgid "A string storing the gnome-online-account id used to login"
+msgstr ""
+"Ĉeno konservanta la identigilon de gnome-online-account, uzatan por saluto"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Instalado de programaro"
+
+#: src/gnome-software-local-file.desktop.in:4
+msgid "Install selected software on the system"
+msgstr "Instali elektitan programaron en la sistemon"
+
+#: src/gnome-software.ui:10
+msgid "Select All"
+msgstr "Elekti ĉiujn"
+
+#: src/gnome-software.ui:16
+msgid "Select None"
+msgstr "Elekti neniun"
+
+#: src/gnome-software.ui:38
+msgid "_Software Repositories"
+msgstr "_Programaraj deponejoj"
+
+#: src/gnome-software.ui:43
+msgid "_Update Preferences"
+msgstr "Ĝ_isdatigaj agordoj"
+
+#: src/gnome-software.ui:52 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "Programaro"
+
+#: src/gnome-software.ui:68 src/gs-update-dialog.ui:20
+msgid "Go back"
+msgstr "Reen"
+
+#. Translators: A label for a button to show all available software.
+#: src/gnome-software.ui:100
+msgid "_Explore"
+msgstr "_Esplori"
+
+#. Translators: A label for a button to show only software which is already installed.
+#: src/gnome-software.ui:123
+msgid "_Installed"
+msgstr "_Instalitaj"
+
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gnome-software.ui:163
+msgid "_Updates"
+msgstr "Ĝ_isdatigoj"
+
+#: src/gnome-software.ui:232
+msgid "Search"
+msgstr "Serĉi"
+
+#. 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 "Fonto"
+
+#. 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 "Programaraj depenejoj"
+
+#. button in the info bar
+#: src/gnome-software.ui:391
+msgid "Examine Disk"
+msgstr "Ekzameni diskon"
+
+#. 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 "Retagordoj"
+
+#. button in the info bar
+#: src/gnome-software.ui:407
+msgid "Restart Now"
+msgstr "Restartigi nun"
+
+#. button in the info bar
+#: src/gnome-software.ui:415
+msgid "More Information"
+msgstr "Pli da informoj"
+
+#. TRANSLATORS: this is a locally downloaded package
+#: lib/gs-app.c:4504
+msgid "Local file"
+msgstr "Loka dosiero"
+
+#: lib/gs-app.c:4556
+msgid "Package"
+msgstr "Pako"
+
+#: src/gs-app-addon-row.c:82 src/gs-app-row.c:412
+msgid "Pending"
+msgstr "Atendante"
+
+#: 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 "Instalita"
+
+#. 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 "Instalante"
+
+#. 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 "Forigante"
+
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:109
+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:109
+msgid "MODE"
+msgstr "REĜIMO"
+
+#: src/gs-application.c:111
+msgid "Search for applications"
+msgstr "Serĉi aplikaĵojn"
+
+#: src/gs-application.c:111
+msgid "SEARCH"
+msgstr "SERĈI"
+
+#: src/gs-application.c:113
+msgid "Show application details (using application ID)"
+msgstr "Montri detalojn de aplikaĵo (uzante aplikaĵan ID-on)"
+
+#: 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 "Montri detalojn de aplikaĵo (uzante paknomon)"
+
+#: src/gs-application.c:115
+msgid "PKGNAME"
+msgstr "PAKNOMO"
+
+#: src/gs-application.c:117
+msgid "Install the application (using application ID)"
+msgstr "Instali la aplikaĵon (uzante aplikaĵan ID-on)"
+
+#: src/gs-application.c:119
+msgid "Open a local package file"
+msgstr "Malfermi lokan pakodosieron"
+
+#: src/gs-application.c:119
+msgid "FILENAME"
+msgstr "DOSIERNOMO"
+
+#: src/gs-application.c:121
+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:124
+msgid "Show verbose debugging information"
+msgstr "Montri babilemajn sencimigajn informojn"
+
+#: src/gs-application.c:126
+msgid "Installs any pending updates in the background"
+msgstr "Instalas iun ajn okazontan ĝisdatigon fone"
+
+#: src/gs-application.c:128
+msgid "Show update preferences"
+msgstr "Montri ĝisdatigajn agordojn"
+
+#: src/gs-application.c:130
+msgid "Quit the running instance"
+msgstr "Ĉesigi la rulantan ekzemplon"
+
+#: src/gs-application.c:132
+msgid "Prefer local file sources to AppStream"
+msgstr "Preferi lokajn dosierajn fontojn ol AppStream"
+
+#: src/gs-application.c:134
+msgid "Show version number"
+msgstr "Montri versionumeron"
+
+#: src/gs-application.c:328
+msgid "translator-credits"
+msgstr ""
+"Kristjan SCHMIDT\n"
+"Daniel PUENTES\n"
+"Axel ROUSSEAU\n"
+"Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
+"Tirifto <tirifto@posteo.cz>"
+
+#. 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 "Pri %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 "Bona maniero por administri la programaron sur via sistemo."
+
+#. 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 "Pardonon! Estas neniuj detaloj por ĉi tiu aplikaĵo."
+
+#. 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 "Viziti la retpaĝaron"
+
+#. 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 "Instali…"
+
+#. 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 "Nuligi"
+
+#. 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 "Instali"
+
+#. 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 "Ĝisdatigi"
+
+#. 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 "Forigi"
+
+#. 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 "Ne eblas uzi la aparaton dum ĝisdatigo."
+
+#: src/gs-app-row.c:470 src/gs-update-dialog.ui:182
+msgid "Requires additional permissions"
+msgstr "Necesas ekstraj permesoj"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:180
+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:185
+msgid "All"
+msgstr "Ĉiuj"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: lib/gs-category.c:189
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+# Mi ne certas, ĉu ĉi tiu povas esti pluralo. --Carmen
+#. 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 "Rekomenditaj %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 "Takso"
+
+#. 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 "Nomo"
+
+#. 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 "Etendaĵaj agordoj"
+
+#: 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 ""
+"Uzu etendaĵojn laŭ via propra risko. Se vi havas iujn ajn sistemajn "
+"problemojn, ni rekomendas al vi malŝalti ilin."
+
+#. 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 "Montri"
+
+#: src/gs-category-page.ui:173
+msgid "Subcategories filter menu"
+msgstr "Subkategoria filtromenuo"
+
+#. 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 "Ordigi laŭ"
+
+#: src/gs-category-page.ui:220
+msgid "Subcategories sorting menu"
+msgstr "Subkategoria oridiga menuo"
+
+#. 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 "Bonvolu enigi nombron de 1 ĝis %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:253
+msgid "Choose an application:"
+msgstr "Elektu aplikaĵon:"
+
+#. 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 "Operaciumaj ĝisdatigoj nun estas instalitaj"
+
+#. 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 "Freŝdate instalitaj ĝisdatigojn nun ekzameneblas"
+
+#. 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 nun estas instalita"
+
+#. 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 "Restartigo necesas por ke la ŝanĝoj efektiviĝu."
+
+#. 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 "Aplikaĵo nun estas preta por uzo."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:159 src/gs-common.c:638
+msgid "Restart"
+msgstr "Restartigi"
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:163
+msgid "Launch"
+msgstr "Lanĉi"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:221
+msgid "Install Third-Party Software?"
+msgstr "Ĉu instali programaron de ekstera liveranto?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:225 src/gs-repos-dialog.c:235
+msgid "Enable Third-Party Software Repository?"
+msgstr "Ĉu ŝalti deponejon de ekstera liveranto?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ne estas <a href=\"https://eo.wikipedia.org/wiki/Libera_programaro"
+"\">libera programaro</a>, kaj “%s” ĝin provizas."
+
+#. 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 "“%2$s” provizas %1$s."
+
+#: src/gs-common.c:260
+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:270
+#, 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:276
+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:283
+msgid "Don’t Warn Again"
+msgstr "Ne averti denove"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:292
+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:440
+msgid "Detailed errors from the package manager follow:"
+msgstr "Jen detalaj eraroj de la pako-administrilo:"
+
+#: src/gs-common.c:459 src/gs-details-page.ui:447
+msgid "Details"
+msgstr "Detaloj"
+
+#. 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] "Instalis ĝisdatigon"
+msgstr[1] "Instalis ĝisdatigojn"
+
+#. 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] "Restartigo necesas por ke ĝi efektiviĝas."
+msgstr[1] "Restartigo necesas por ke ili efektiviĝas."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:636 src/gs-update-monitor.c:119
+msgid "Not Now"
+msgstr "Ne nun"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:59
+msgid "No cartoon violence"
+msgstr "Neniu kartuna perforto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:61
+msgid "Cartoon characters in unsafe situations"
+msgstr "Kartunaj roluloj en nesekuraj situacioj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:63
+msgid "Cartoon characters in aggressive conflict"
+msgstr "Kartunaj roluloj en agresa konflikto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:65
+msgid "Graphic violence involving cartoon characters"
+msgstr "Serioza perforto koncernante kartunaj roluloj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:70
+msgid "No fantasy violence"
+msgstr "Neniu fantazia perforto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:72
+msgid "Characters in unsafe situations easily distinguishable from reality"
+msgstr "Roluloj en nesekuraj situacioj facile distingeblaj de realeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:74
+msgid "Characters in aggressive conflict easily distinguishable from reality"
+msgstr "Roluloj en agresa konflikto facile distingebla de realeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:76
+msgid "Graphic violence easily distinguishable from reality"
+msgstr "Serioza perforto facile distingebla de realeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:81
+msgid "No realistic violence"
+msgstr "Neniu vivovera perforto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:83
+msgid "Mildly realistic characters in unsafe situations"
+msgstr "Modere vivoveraj roluloj en nesekuraj situacioj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:85
+msgid "Depictions of realistic characters in aggressive conflict"
+msgstr "Figurado de vivoveraj roluloj en agresa konflikto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:87
+msgid "Graphic violence involving realistic characters"
+msgstr "Serioza perforto koncernante vivoveraj roluloj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:92
+msgid "No bloodshed"
+msgstr "Neniu sangoverŝo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:94
+msgid "Unrealistic bloodshed"
+msgstr "Malvivovera sangoverŝo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:96
+msgid "Realistic bloodshed"
+msgstr "Vivovera sangoverŝo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:98
+msgid "Depictions of bloodshed and the mutilation of body parts"
+msgstr "Figurado de sangoverŝo kaj kripligo de korpopartoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:103
+msgid "No sexual violence"
+msgstr "Neniu seksperforto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:105
+msgid "Rape or other violent sexual behavior"
+msgstr "Seksperforto aŭ alia perforta seksa konduto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:112
+msgid "No references to alcohol"
+msgstr "Neniu priparolado de alkoholo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:114
+msgid "References to alcoholic beverages"
+msgstr "Priparolado de alkoholaĵoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:116
+msgid "Use of alcoholic beverages"
+msgstr "Uzado de alkoholaĵoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:122
+msgid "No references to illicit drugs"
+msgstr "Neniu priparolado de malpermesitaj drogoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:124
+msgid "References to illicit drugs"
+msgstr "Priparolado de malpermesitaj drogoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:126
+msgid "Use of illicit drugs"
+msgstr "Uzado de malpermesitaj drogoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:132
+msgid "No references to tobacco products"
+msgstr "Neniu priparolado de tabakaĵoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:134
+msgid "References to tobacco products"
+msgstr "Priparolado de tabakaĵoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:136
+msgid "Use of tobacco products"
+msgstr "Uzado de tabakaĵoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:142
+msgid "No nudity of any sort"
+msgstr "Neniu nudeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:144
+msgid "Brief artistic nudity"
+msgstr "Nedaŭra arta nudeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:146
+msgid "Prolonged nudity"
+msgstr "Daŭra nudeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:152
+msgid "No references to or depictions of sexual nature"
+msgstr "Neniu priparolado aŭ figurado seksa"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:154
+msgid "Provocative references or depictions"
+msgstr "Provoka priparolado aŭ figurado"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:156
+msgid "Sexual references or depictions"
+msgstr "Seka priparolado aŭ figurado"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:158
+msgid "Graphic sexual behavior"
+msgstr "Serioza seksa konduto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:163
+msgid "No profanity of any kind"
+msgstr "Neniu sakro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:165
+msgid "Mild or infrequent use of profanity"
+msgstr "Milda aŭ malofta uzado de sakro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:167
+msgid "Moderate use of profanity"
+msgstr "Modera uzado de sakro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:169
+msgid "Strong or frequent use of profanity"
+msgstr "Forta aŭ ofta uzado de sakro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:174
+msgid "No inappropriate humor"
+msgstr "Neniu nedeca humuro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:176
+msgid "Slapstick humor"
+msgstr "Senvoĉa humuro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:178
+msgid "Vulgar or bathroom humor"
+msgstr "Vulgara aŭ baneja humuro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:180
+msgid "Mature or sexual humor"
+msgstr "Matura aŭ seksuma humuro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:185
+msgid "No discriminatory language of any kind"
+msgstr "Neniu diskriminacia lingvo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:187
+msgid "Negativity towards a specific group of people"
+msgstr "Negativeco kontraŭ specifa grupo de homoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:189
+msgid "Discrimination designed to cause emotional harm"
+msgstr "Diskriminacio kun la intenco kaŭzi emocian malprofiton"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:191
+msgid "Explicit discrimination based on gender, sexuality, race or religion"
+msgstr "Eksplika diskriminacio pro genro, sekseco, etno aŭ religio"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:196
+msgid "No advertising of any kind"
+msgstr "Neniu reklamo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:198
+msgid "Product placement"
+msgstr "Produkt-enmeto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:200
+msgid "Explicit references to specific brands or trademarked products"
+msgstr "Eksplika priparolado de specifaj markoj aŭ produktoj varmarkitaj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:202
+msgid "Users are encouraged to purchase specific real-world items"
+msgstr "Uzantoj kuraĝiĝas aĉeti specifajn realajn aferojn"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:207
+msgid "No gambling of any kind"
+msgstr "Neniu vetludado"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:209
+msgid "Gambling on random events using tokens or credits"
+msgstr "Vetludado je hazardaj okazaĵoj uzante ĵetonojn"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:211
+msgid "Gambling using “play” money"
+msgstr "Vetludado uzante “ludan” monon"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:213
+msgid "Gambling using real money"
+msgstr "Vetludado uzante realan monon"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:218
+msgid "No ability to spend money"
+msgstr "Neniu ebleco elspezi monon"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:220
+msgid "Users are encouraged to donate real money"
+msgstr "Uzantoj kuraĝiĝas donaci realan monon"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:223
+msgid "Ability to spend real money in-app"
+msgstr "Ebleco elspezi realan monon enaplikaĵe"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:228
+msgid "No way to chat with other users"
+msgstr "Neniu maniero por babili kun aliaj uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:230
+msgid "User-to-user interactions without chat functionality"
+msgstr "Uzanto-al-uzanto interago sen babilfunkcio"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:232
+msgid "Moderated chat functionality between users"
+msgstr "Kontrolata babilfunkcio inter uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:234
+msgid "Uncontrolled chat functionality between users"
+msgstr "Nekontrolata babilfunkcio inter uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:239
+msgid "No way to talk with other users"
+msgstr "Neniu maniero paroli kun aliaj uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:241
+msgid "Uncontrolled audio or video chat functionality between users"
+msgstr "Nekontrolata aŭda aŭ videa babilfunkcio inter uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:248
+msgid "No sharing of social network usernames or email addresses"
+msgstr "Neniu kunhavigado de sociaj retejaj uzantonomoj aŭ retpoŝtadresoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:250
+msgid "Sharing social network usernames or email addresses"
+msgstr "Kunhavigado de sociaj retejaj uzantonomoj aŭ retpoŝtadresoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:257
+msgid "No sharing of user information with third parties"
+msgstr "Neniu kunhavigado de uzanto-informoj kun eksteraj liverantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:259
+msgid "Checking for the latest application version"
+msgstr "Kontrolante por la lasta version de la aplikaĵo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:261
+msgid "Sharing diagnostic data that does not let others identify the user"
+msgstr ""
+"Kunhavigado de diagnozaj datumoj kiuj ne lasas al aliuloj identigi la uzanton"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:263
+msgid "Sharing information that lets others identify the user"
+msgstr "Kunhavigado de informoj kiuj lasas al aliuloj identigi la uzanton"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:268
+msgid "No sharing of physical location with other users"
+msgstr "Neniu kunhavigado de fizika loko kun aliaj uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:270
+msgid "Sharing physical location with other users"
+msgstr "Kunhavigado de fizika loko kun aliaj uzantoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:279
+msgid "No references to homosexuality"
+msgstr "Neniu priparolado de samseksemeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:281
+msgid "Indirect references to homosexuality"
+msgstr "Nerekta priparolado de samseksemeco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:283
+msgid "Kissing between people of the same gender"
+msgstr "Kisado inter samseksaj homoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:285
+msgid "Graphic sexual behavior between people of the same gender"
+msgstr "Serioza seksa konduta inter samseksaj homoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:290
+msgid "No references to prostitution"
+msgstr "Neniu priparolado de prostituo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:292
+msgid "Indirect references to prostitution"
+msgstr "Nerekta priparolado de prostituo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:294
+msgid "Direct references to prostitution"
+msgstr "Rekta priparolado de prostituo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:296
+msgid "Graphic depictions of the act of prostitution"
+msgstr "Serioza figurado de prostituo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:301
+msgid "No references to adultery"
+msgstr "Neniu priparolado de adulto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:303
+msgid "Indirect references to adultery"
+msgstr "Nerekta priparolado de adulto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:305
+msgid "Direct references to adultery"
+msgstr "Rekta priparolado de adulto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:307
+msgid "Graphic depictions of the act of adultery"
+msgstr "Serioza figurado de adulto"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:312
+msgid "No sexualized characters"
+msgstr "Neniu seksigita rolulo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:315
+msgid "Scantily clad human characters"
+msgstr "Malabunde vestigitaj homaj roluloj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:317
+msgid "Overtly sexualized human characters"
+msgstr "Nekaŝe seksigitaj homaj roluloj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:322
+msgid "No references to desecration"
+msgstr "Neniu priparolado de malsanktigo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:324
+msgid "Depictions of or references to historical desecration"
+msgstr "Figurado aŭ priparolado de historia malsanktigo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:326
+msgid "Depictions of modern-day human desecration"
+msgstr "Figurado de nunatempa homa malsanktigo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:328
+msgid "Graphic depictions of modern-day desecration"
+msgstr "Serioza figurado de nunatempa malsanktigo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:333
+msgid "No visible dead human remains"
+msgstr "Neniu videbla homa kadavro"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:335
+msgid "Visible dead human remains"
+msgstr "Videblaj homaj kadavroj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:337
+msgid "Dead human remains that are exposed to the elements"
+msgstr "Korpopartoj de mortinto(j) kiuj daŭre estis en la naturo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:339
+msgid "Graphic depictions of desecration of human bodies"
+msgstr "Serioza figurado de malsanktigo de homaj korpoj"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:344
+msgid "No references to slavery"
+msgstr "Neniu priparolado de sklaveco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:346
+msgid "Depictions of or references to historical slavery"
+msgstr "Figurado aŭ priparolado de historia sklaveco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:348
+msgid "Depictions of modern-day slavery"
+msgstr "Figurado de nunatempa sklaveco"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:350
+msgid "Graphic depictions of modern-day slavery"
+msgstr "Serioza figurado de nunatempa sklaveco"
+
+#. 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 "Ĝenerala"
+
+#: src/gs-content-rating.c:549
+msgid "ALL"
+msgstr "ĈIUJ"
+
+#: src/gs-content-rating.c:553
+msgid "Adults Only"
+msgstr "Nur plenkreskuloj"
+
+#: src/gs-content-rating.c:555
+msgid "Mature"
+msgstr "Matura"
+
+#: src/gs-content-rating.c:557
+msgid "Teen"
+msgstr "Adoleska"
+
+#: src/gs-content-rating.c:559
+msgid "Everyone 10+"
+msgstr "Ĉiuj 10+"
+
+#: src/gs-content-rating.c:561
+msgid "Everyone"
+msgstr "Ĉiuj"
+
+#: src/gs-content-rating.c:563
+msgid "Early Childhood"
+msgstr "Junaj infanoj"
+
+#. 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 "Aplikaĵo"
+
+#. 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 petas aldonan subtenon de dosierformo."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:289
+msgid "Additional MIME Types Required"
+msgstr "Necesas aldonaj MIME-provizantoj"
+
+#. 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 petas aldonajn tiparojn."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:295
+msgid "Additional Fonts Required"
+msgstr "Necesas aldonaj tiparoj"
+
+#. 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 petas aldonajn plurmediajn kodekojn."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:301
+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:305
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr "%s petas aldonajn presilajn pelilojn."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:307
+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:311
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "%s petas aldonajn pakojn."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:313
+msgid "Additional Packages Required"
+msgstr "Necesas aldonaj pakoj"
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:322
+msgid "Find in Software"
+msgstr "Serĉi en Programaro"
+
+#: src/gs-details-page.c:324
+msgid "Removing…"
+msgstr "Forigante…"
+
+#. 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 "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:350
+msgid "Pending update…"
+msgstr "Atendante ĝisdatigon…"
+
+#. 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 "Ĉi tiu aplikaĵo nur uzeblas kiam ekzistas aktiva interreta konekto."
+
+#. 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 "_Instali"
+
+#. 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 "_Instali…"
+
+#. TRANSLATORS: A label for a button to execute the selected
+#. application.
+#: src/gs-details-page.c:935
+msgid "_Launch"
+msgstr "_Lanĉi"
+
+#. 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 "Fo_rigi"
+
+#: src/gs-details-page.c:991 src/gs-update-dialog.c:92
+msgid "Network"
+msgstr "Reto"
+
+#: src/gs-details-page.c:991 src/gs-update-dialog.c:92
+msgid "Can communicate over the network"
+msgstr "Povas komuniki perrete"
+
+#: src/gs-details-page.c:992 src/gs-update-dialog.c:93
+msgid "System Services"
+msgstr "Sistemaj servoj"
+
+#: src/gs-details-page.c:992 src/gs-update-dialog.c:93
+msgid "Can access D-Bus services on the system bus"
+msgstr "Povas atingi D-Bus-ajn servojn en la sistema buso"
+
+#: src/gs-details-page.c:993 src/gs-update-dialog.c:94
+msgid "Session Services"
+msgstr "Seancaj servoj"
+
+#: src/gs-details-page.c:993 src/gs-update-dialog.c:94
+msgid "Can access D-Bus services on the session bus"
+msgstr "Povas atingi D-Bus-ajn servojn en la seanca buso"
+
+#: src/gs-details-page.c:994 src/gs-update-dialog.c:95
+msgid "Devices"
+msgstr "Aparatoj"
+
+#: src/gs-details-page.c:994 src/gs-update-dialog.c:95
+msgid "Can access system device files"
+msgstr "Povas atingi sistemajn aparatajn dosierojn"
+
+#: 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 "Hejmdosierujo"
+
+#: 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 "Povas vidi, redakti kaj krei dosierojn"
+
+#: 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 "Povas vidi dosierojn"
+
+#: 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 "Dosiersistemo"
+
+#: 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 "Elŝut-dosierujo"
+
+#: src/gs-details-page.c:1001 src/gs-update-dialog.c:102
+msgid "Settings"
+msgstr "Agordoj"
+
+#: src/gs-details-page.c:1001 src/gs-update-dialog.c:102
+msgid "Can view and change any settings"
+msgstr "Povas vidi kaj ŝanĝi iun ajn agordon"
+
+#: src/gs-details-page.c:1002 src/gs-update-dialog.c:103
+msgid "Legacy display system"
+msgstr "Malnova vidiga sistemo"
+
+#: src/gs-details-page.c:1002 src/gs-update-dialog.c:103
+msgid "Uses an old, insecure display system"
+msgstr "Uzas malnovan, nesekuran vidigan sistemon"
+
+#: src/gs-details-page.c:1003 src/gs-update-dialog.c:104
+#, fuzzy
+#| msgid "Sandboxed"
+msgid "Sandbox escape"
+msgstr "Sablujigita"
+
+#: src/gs-details-page.c:1003 src/gs-update-dialog.c:104
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr ""
+
+#: src/gs-details-page.c:1018
+msgid "This application is fully sandboxed."
+msgstr "Ĉi tiu aplikaĵo estas entute sablujigita."
+
+#: 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 ""
+"Ne eblas precizigi, kiujn partojn de la sistemo ĉi tiu aplikaĵo atingas. Ĉi "
+"tio estas tipa por malnovaj aplikaĵoj."
+
+#. TRANSLATORS: this is where the version is not known
+#: src/gs-details-page.c:1185
+msgctxt "version"
+msgid "Unknown"
+msgstr "Nekonata"
+
+#. TRANSLATORS: this is where the updated date is not known
+#: src/gs-details-page.c:1198
+msgctxt "updated"
+msgid "Never"
+msgstr "Neniam"
+
+#. TRANSLATORS: this is where we don't know the origin of the
+#. * application
+#: src/gs-details-page.c:1251
+msgctxt "origin"
+msgid "Unknown"
+msgstr "Nekonata"
+
+#: src/gs-details-page.c:1304
+msgid "Low"
+msgstr "Malalta"
+
+#: src/gs-details-page.c:1306
+msgid "Medium"
+msgstr "Meza"
+
+#: src/gs-details-page.c:1308
+msgid "High"
+msgstr "Alta"
+
+#. 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 "Nekonata"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1648
+msgid "You need internet access to write a review"
+msgstr "Vi bezonas interretan aliron por skribi recenzon"
+
+#: src/gs-details-page.c:1834 src/gs-details-page.c:1850
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Ne eblas trovi “%s”"
+
+#. TRANSLATORS: see the wikipedia page
+#: src/gs-details-page.c:2428
+msgid "Public domain"
+msgstr "Publika havaĵo"
+
+#. 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://eo.wikipedia.org/wiki/Publika_hava%C4%B5o"
+
+#. 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.eo"
+
+#. TRANSLATORS: see GNU page
+#: src/gs-details-page.c:2448 src/gs-details-page.ui:1250
+msgid "Free Software"
+msgstr "Libera programaro"
+
+#. 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] "Uzantoj devas observi la sekvan permesilon:"
+msgstr[1] "Uzantoj devas observi la sekvajn permesilojn:"
+
+#: src/gs-details-page.c:2532 src/gs-details-page.ui:1322
+msgid "More information"
+msgstr "Pli da informoj"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Paĝo de detaloj"
+
+#: src/gs-details-page.ui:222
+msgid "Downloading"
+msgstr "Elŝutanta"
+
+#: 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 "_Nuligi"
+
+#: src/gs-details-page.ui:262
+msgid "_Update"
+msgstr "Ĝ_isdatigi"
+
+#. Translators: A label for a button to add a shortcut to the selected application.
+#: src/gs-details-page.ui:278
+msgid "_Add shortcut"
+msgstr "_Aldoni klavkombinon"
+
+#. 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 "Forigi klavko_mbinon"
+
+#: src/gs-details-page.ui:366
+msgid "No screenshot provided"
+msgstr "Neniuj ekrankopioj"
+
+#: src/gs-details-page.ui:386
+msgid "Software Repository Included"
+msgstr "Programara deponejo inkluzivita"
+
+#: src/gs-details-page.ui:387
+msgid ""
+"This application 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:394
+msgid "No Software Repository Included"
+msgstr "Neniu programara deponejo inkluzivita"
+
+#: src/gs-details-page.ui:395
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:403
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:410
+msgid "Software Repository Identified"
+msgstr "Programara deponejo identigita"
+
+#: src/gs-details-page.ui:411
+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:412
+msgid "Only use software repositories that you trust."
+msgstr "Nur uzi programarajn deponejojn, kiujn vi fidas."
+
+#: src/gs-details-page.ui:422
+msgid "_Website"
+msgstr "_Retejo"
+
+#: src/gs-details-page.ui:431
+msgid "_Donate"
+msgstr "_Donaci"
+
+#: src/gs-details-page.ui:541
+msgid "Localized in your Language"
+msgstr "Tradukita al via lingvo"
+
+#: src/gs-details-page.ui:552
+msgid "Documentation"
+msgstr "Dokumentado"
+
+#: src/gs-details-page.ui:563
+msgid "Release Activity"
+msgstr "Eldona aktiveco"
+
+#: src/gs-details-page.ui:574
+msgid "System Integration"
+msgstr "Sistema integrigo"
+
+#: src/gs-details-page.ui:585
+msgid "Sandboxed"
+msgstr "Sablujigita"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-details-page.ui:605 src/gs-origin-popover-row.c:102
+msgid "Channel"
+msgstr "Kanalo"
+
+#. Translators: The available version of an app
+#: src/gs-details-page.ui:641 src/gs-origin-popover-row.ui:151
+msgid "Version"
+msgstr "Versio"
+
+#: src/gs-details-page.ui:677
+msgid "Age Rating"
+msgstr "Aĝa takso"
+
+#: src/gs-details-page.ui:715 src/gs-details-page.ui:1408
+msgid "Permissions"
+msgstr "Permesoj"
+
+#: src/gs-details-page.ui:753
+msgid "Updated"
+msgstr "Ĝisdatigita"
+
+#: src/gs-details-page.ui:787
+msgid "Category"
+msgstr "Kategorio"
+
+#: src/gs-details-page.ui:824
+msgid "Installed Size"
+msgstr "Instala grando"
+
+#: src/gs-details-page.ui:855
+msgid "Download Size"
+msgstr "Elŝuta grando"
+
+#: src/gs-details-page.ui:917
+msgid "Developer"
+msgstr "Verkanto"
+
+#: src/gs-details-page.ui:963
+msgid "License"
+msgstr "Permesilo"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:982
+msgid "Free"
+msgstr "Libera"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:994
+msgid "Proprietary"
+msgstr "Mallibera"
+
+#. 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 "Aldonaĵoj"
+
+#: src/gs-details-page.ui:1056
+msgid "Selected add-ons will be installed with the application."
+msgstr "La elektitajn aldonaĵojn oni instalas kune kun la aplikaĵo."
+
+#. Translators: Header of the section with other users' opinions about the app.
+#: src/gs-details-page.ui:1094
+msgid "Reviews"
+msgstr "Recenzoj"
+
+#. 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 "_Skribi recenzon"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-details-page.ui:1133
+msgid "_Show More"
+msgstr "_Montri pli"
+
+#: src/gs-details-page.ui:1261
+msgid ""
+"This means that the software can be freely run, copied, distributed, studied "
+"and modified."
+msgstr ""
+"Ĉi tiu signifas, ke oni povas libere ruli, kopii, distribui, studi kaj "
+"modifi la programaron."
+
+#: src/gs-details-page.ui:1301
+msgid "Proprietary Software"
+msgstr "Mallibera programaro"
+
+#: 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 ""
+"Ĉi tiu signifas ke individuo aŭ firmao posedas la programaron. Ofte ekzistas "
+"limigoj je ĝia uzo kaj ofte oni ne povas aliri la fontkodon."
+
+#: src/gs-details-page.ui:1344
+msgid "Unknown Software License"
+msgstr "Nekonata programara permesilo"
+
+#: src/gs-details-page.ui:1355
+msgid "The license terms of this software are unknown."
+msgstr "Ne konas la permesilon de ĉi tiu programaro."
+
+#: src/gs-details-page.ui:1375
+msgid "The application was rated this way because it features:"
+msgstr "La aplikaĵo tiel taskiĝis ĉar ĝi enhavas:"
+
+#: src/gs-details-page.ui:1389
+msgid "No details were available for this rating."
+msgstr "Neniuj detaloj disponeblis por ĉi tiu takso."
+
+#. TRANSLATORS: separator for a list of items
+#: src/gs-extras-page.c:134
+msgid " and "
+msgstr " kaj "
+
+#. 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] "Disponeblaj tiparoj por la %s skribsistemo"
+msgstr[1] "Disponeblaj tiparoj por la %s skribsistemoj"
+
+#. 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] "Disponeblaj programaroj por %s"
+msgstr[1] "Disponeblaj programaroj por %s"
+
+#: src/gs-extras-page.c:213
+msgid "Unable 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:318
+#, c-format
+msgid "%s not found"
+msgstr "%s ne trovita"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:322
+msgid "on the website"
+msgstr "en la retejo"
+
+#. 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 "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: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 ""
+"Informon pri %s, kaj ankaŭ elektojn por akiri mankantajn aplikaĵojn, oni "
+"povus trovi %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 "Neniu aplikaĵo disponeblas por %s subteno."
+
+#. 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 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: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 ""
+"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 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 "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:377
+#, 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 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 "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: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 ""
+"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 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 "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:399
+#, 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 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 "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: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 ""
+"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:454
+msgid "this website"
+msgstr "tiun ĉi retejon"
+
+#. 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] ""
+"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:526 src/gs-extras-page.c:582 src/gs-extras-page.c:621
+msgid "Failed to find any search results"
+msgstr "Malsukcesis trovi serĉrezultojn"
+
+#: src/gs-extras-page.c:809
+#, c-format
+msgid "%s file format"
+msgstr "%s dosierformo"
+
+#: src/gs-extras-page.ui:7
+msgid "Codecs page"
+msgstr "Paĝo de kodekoj"
+
+#: src/gs-first-run-dialog.ui:6 src/gs-first-run-dialog.ui:15
+msgid "Welcome"
+msgstr "Bonvenon"
+
+#: src/gs-first-run-dialog.ui:43
+msgid "Welcome to Software"
+msgstr "Bonvenon al Programaro"
+
+#: 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 ""
+"Programaro lasas al vi facile instali la programaron kiun vi bezonas. Vidu "
+"niajn rekomendojn, esploru la kategoriojn, aŭ serĉu la aplikaĵojn."
+
+#: src/gs-first-run-dialog.ui:62
+msgid "_Let’s Go Shopping"
+msgstr "_Ek al aĉetado"
+
+#. 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 "Forigita"
+
+#. 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 "Instalita"
+
+#. 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 "Ĝisdatigita"
+
+#. 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 "Nekonata"
+
+#. 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-a de %B %Y"
+
+#: src/gs-history-dialog.ui:5
+msgid "History"
+msgstr "Historio"
+
+#. TRANSLATORS: This is the header dividing the normal
+#. * applications and the system ones
+#: src/gs-installed-page.c:437
+msgid "System Applications"
+msgstr "Sistemaj aplikaĵoj"
+
+#: src/gs-installed-page.ui:7
+msgid "Installed page"
+msgstr "Paĝo de instalitaj programoj"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:61 src/gs-loading-page.c:65
+msgid "Software catalog is being downloaded"
+msgstr "Elŝutante programaran katalogon"
+
+#: src/gs-loading-page.ui:7
+msgid "Loading page"
+msgstr "Paĝo de ŝargado"
+
+#: src/gs-loading-page.ui:47
+msgid "Starting up…"
+msgstr "Startante…"
+
+#: src/gs-moderate-page.ui:7
+msgid "Moderate page"
+msgstr "Paĝo de kontrolado"
+
+#: src/gs-moderate-page.ui:85
+msgid "There are no reviews to moderate"
+msgstr "Neniu kontrolenda recenzo"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:83
+msgid "system"
+msgstr "sistemo"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:86
+msgid "user"
+msgstr "uzanto"
+
+#. 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 "Branĉo"
+
+#: 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 "Formo"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:93
+msgid "Installation"
+msgstr "Instalcelo"
+
+#. add button
+#: src/gs-overview-page.c:313
+msgid "More…"
+msgstr "Pli…"
+
+#. TRANSLATORS: this is a heading for audio applications which
+#. * have been featured ('recommended') by the distribution
+#: src/gs-overview-page.c:566
+msgid "Recommended Audio & Video Applications"
+msgstr "Rekomenditaj aŭdividaj aplikaĵoj"
+
+#. TRANSLATORS: this is a heading for games which have been
+#. * featured ('recommended') by the distribution
+#: src/gs-overview-page.c:571
+msgid "Recommended Games"
+msgstr "Rekomenditaj ludoj"
+
+#. TRANSLATORS: this is a heading for graphics applications
+#. * which have been featured ('recommended') by the distribution
+#: src/gs-overview-page.c:576
+msgid "Recommended Graphics Applications"
+msgstr "Rekomenditaj grafik-aplikaĵoj"
+
+#. TRANSLATORS: this is a heading for office applications which
+#. * have been featured ('recommended') by the distribution
+#: src/gs-overview-page.c:581
+msgid "Recommended Productivity Applications"
+msgstr "Rekomenditaj produktemecaj aplikaĵoj"
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:929 src/gs-repos-dialog.c:828
+msgid "Access additional software from selected third party sources."
+msgstr "Atingi ceteran programaron de elektitaj eksteraj liverantaj fontoj."
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:933 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 ""
+"Ĉi tiu programaro estas mallibera kaj tial havas limigojn por sia uzado, "
+"kunhavigado, kaj atingo al fontkodo."
+
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-overview-page.c:938 src/gs-repos-dialog.c:837
+msgid "Find out more…"
+msgstr "Lerni pli…"
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:946 src/gs-repos-dialog.c:240
+msgid "Enable"
+msgstr "Ŝalti"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Superrigarda paĝo"
+
+#: src/gs-overview-page.ui:39
+msgid "Enable Third Party Software Repositories?"
+msgstr "Ĉu ŝalti deponejon de ekstera liveranto?"
+
+#: src/gs-overview-page.ui:83
+msgid "Featured Applications"
+msgstr "Rekomenditaj aplikaĵoj"
+
+#: src/gs-overview-page.ui:116
+msgid "Previous"
+msgstr "Antaŭa"
+
+#: src/gs-overview-page.ui:141
+msgid "Next"
+msgstr "Sekva"
+
+#: src/gs-overview-page.ui:163
+msgid "Categories"
+msgstr "Kategorioj"
+
+#. Translators: This is a heading for software which has been featured ('picked') by the distribution.
+#: src/gs-overview-page.ui:193
+msgid "Editor’s Picks"
+msgstr "Elektoj de redaktisto"
+
+#. Translators: This is a heading for software which has been recently released upstream.
+#: src/gs-overview-page.ui:219
+msgid "Recent Releases"
+msgstr "Freŝdataj eldonoj"
+
+#: src/gs-overview-page.ui:289
+msgid "No Application Data Found"
+msgstr "Neniu aplikaĵa datumo trovita"
+
+#. 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 "Prepari %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 "Ĉu vi certe volas forigi la deponejon de %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 ""
+"Ĉ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
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:415
+#, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr "Ĉu vi certe volas forigi %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 estos forigita, kaj se vi denove bezonas ĝin vi devos reinstali ĝin."
+
+#. 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 (Instalita)"
+
+#: src/gs-prefs-dialog.ui:5 src/gs-prefs-dialog.ui:17
+msgid "Update Preferences"
+msgstr "Ĝisdatigaj agordoj"
+
+#: src/gs-prefs-dialog.ui:43
+msgid "Automatic Updates"
+msgstr "Aŭtomataj ĝisdatigoj"
+
+#: src/gs-prefs-dialog.ui:70
+msgid "Automatic updates are disabled when on mobile or metered connections."
+msgstr ""
+"Aŭtomataj ĝisdatigoj malŝaltiĝas se uzante porteblan aŭ limigan konekton."
+
+#: src/gs-prefs-dialog.ui:88
+msgid "Automatic Update Notifications"
+msgstr "Aŭtomataj ĝisdatigaj sciigoj"
+
+#: src/gs-prefs-dialog.ui:102
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Montri sciigojn kiam ĝisdatigoj aŭtomate instaliĝis."
+
+#. 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 ""
+"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:26
+msgid "Incompatible Software"
+msgstr "Malkongrua programaro"
+
+#: src/gs-removal-dialog.ui:39
+msgid "_Continue"
+msgstr "_Daŭrigi"
+
+#. 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 aplikaĵo instalita"
+msgstr[1] "%u aplikaĵoj instalitaj"
+
+#. 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 aldonaĵo instalita"
+msgstr[1] "%u aldonaĵoj instalitaj"
+
+#. 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 aplikaĵo"
+msgstr[1] "%u aplikaĵoj"
+
+#. 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 aldonaĵo"
+msgstr[1] "%u aldonaĵoj"
+
+#. 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 kaj %s estas instalitaj"
+msgstr[1] "%s kaj %s estas instalitaj"
+
+#. 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 "Ĉu forigi “%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 "Ĉu malŝalti “%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 ""
+"Programaroj, kiuj instaliĝis el ĉi tiu deponejo, ne plu ricevos ĝisdatigojn, "
+"inkluzive sekureco-flikaĵojn."
+
+#. TRANSLATORS: this is button text to remove the repo
+#: src/gs-repos-dialog.c:329
+msgid "Disable"
+msgstr "Malŝalti"
+
+#. 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 "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:807 src/gs-repos-dialog.c:843
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Ĉi tiuj deponejoj kompletigas la normajn programarojn provizataj de %s."
+
+#. TRANSLATORS: info bar title in the software repositories dialog
+#: src/gs-repos-dialog.c:825
+msgid "Third Party Repositories"
+msgstr "Deponejoj de eksteraj liverantoj"
+
+#: src/gs-repos-dialog.ui:73
+msgid "No Additional Repositories"
+msgstr "Neniu cetera deponejo"
+
+#. TRANSLATORS: this is a button in the software repositories
+#. dialog for enabling a repo
+#: src/gs-repo-row.c:96
+msgid "_Enable"
+msgstr "Ŝ_alti"
+
+#. 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 "Fo_rigi…"
+
+#. 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 "_Malŝalti…"
+
+#. 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 "Ŝaltante"
+
+#. 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 "Malŝaltante"
+
+#. 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 "Ŝaltita"
+
+#. 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 "Malŝaltita"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really bad application
+#: src/gs-review-dialog.c:81
+msgid "Hate it"
+msgstr "Malŝatas ĝin"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:85
+msgid "Don’t like it"
+msgstr "Neŝatas ĝin"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:89
+msgid "It’s OK"
+msgstr "Estas en ordo"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:93
+msgid "Like it"
+msgstr "Ŝatas ĝin"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:97
+msgid "Love it"
+msgstr "Amas ĝin"
+
+#. 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 "Bonvolu pli atentas vian recenzon"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:123
+msgid "Please choose a star rating"
+msgstr "Bonvolu elekti steltakson"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:127
+msgid "The summary is too short"
+msgstr "La resumo estas tro mallonga"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:131
+msgid "The summary is too long"
+msgstr "La resumo estas tro longa"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:135
+msgid "The description is too short"
+msgstr "La priskribo estas tro mallonga"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:139
+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:10
+msgid "Post Review"
+msgstr "Sendi recenzon"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:34
+msgid "_Post"
+msgstr "_Sendi"
+
+#: src/gs-review-dialog.ui:108
+msgid "Summary"
+msgstr "Resumo"
+
+#: src/gs-review-dialog.ui:118
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Donu mallongan recenzon de via recenzo, ekzemple: “Bona aplikaĵo, mi "
+"rekomendus ĝin”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:143
+msgctxt "app review"
+msgid "Review"
+msgstr "Recenzo"
+
+#: src/gs-review-dialog.ui:153
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Kion vi trovas pri la aplikaĵo? Klopodu doni kialojn por viaj opinioj."
+
+#: src/gs-review-dialog.ui:185
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+msgstr ""
+"Eltrovu, kiuj datumoj sendiĝas en nia <a href=\"https://odrs.gnome.org/"
+"privacy\">privateco politiki</a>."
+
+#. Translators: A label for the total number of reviews.
+#: src/gs-review-histogram.ui:412
+msgid "ratings in total"
+msgstr "totalaj taksoj"
+
+#. 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 ""
+"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:227
+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:241
+msgid "Report Review?"
+msgstr "Ĉu raporti recenzon?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:245
+msgid "Report"
+msgstr "Raporti"
+
+#. 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 "Ĉu ĉi tiu recenzo estis utila al vi?"
+
+#: src/gs-review-row.ui:121
+msgid "Yes"
+msgstr "Jes"
+
+#: src/gs-review-row.ui:130
+msgid "No"
+msgstr "Ne"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:139
+msgid "Meh"
+msgstr "Pli-malpli"
+
+#: src/gs-review-row.ui:162
+msgid "Report…"
+msgstr "Raporti…"
+
+#: src/gs-review-row.ui:172
+msgid "Remove…"
+msgstr "Forigi…"
+
+#. 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 "Ne trovis ekrankopion"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:250
+msgid "Failed to load image"
+msgstr "Malsukcesis ŝarĝi 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:381
+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:411
+msgid "Could not create cache"
+msgstr "Malsukcesis krei kaŝmemoron"
+
+#. 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 "Nevalida ekrankopio"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:486
+msgid "Screenshot not available"
+msgstr "Ekrankopio ne disponeblas"
+
+#: src/gs-screenshot-image.c:544
+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:142
+#, 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:7
+msgid "Search page"
+msgstr "Serĉa paĝo"
+
+#: src/gs-search-page.ui:54
+msgid "No Application 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: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 "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:954
+#, 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:961 src/gs-shell.c:1006
+msgid "Unable to download updates"
+msgstr "Ne eblas elŝuti ĝisdatigojn"
+
+#. 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 ""
+"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:976
+#, 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:981
+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:988
+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:993
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Ne eblas elŝuti ĝisdatigojn: aŭtentigo nevalidis"
+
+#. 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 "Ne eblas elŝuti ĝisdatigojn: vi ne havas permeson instali programaron"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1009
+msgid "Unable to get list of updates"
+msgstr "Ne eblas akiri liston de ĝisdatigoj"
+
+#. 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 "Ne eblas instali %s ĉar elŝuto de %s malsukcesis"
+
+#. 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 "Ne eblas instali %s ĉar elŝuto malsukcesis"
+
+#. 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 "Ne eblas instali %s ĉar rultempa medio %s ne disponeblas"
+
+#. 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 "Ne eblas instali %s ĉar ĝi ne estas subtenita"
+
+#. 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 "Ne eblas instali: interreta aliro necesis sed ne disponeblis"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1090
+msgid "Unable to install: the application 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1095
+#, 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:1102
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1109
+#, 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 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 "Ne eblas instali %s: vi ne havas permeson instali programaron"
+
+#. 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 "Ne eblas instali %s: doma elektro necesas"
+
+#. 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 "Ne eblas instali %s: bateria nivelo tro malalta"
+
+#. 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 "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:1187
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1194
+#, 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:1201
+#, 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:1205
+#, 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:1211
+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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1221
+#, 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:1226
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1236
+#, 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:1241
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1250
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Ne eblas ĝisdatigi %s: aŭtentigo nevalidis"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1255
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Ne eblas instali ĝisdatigojn: aŭtentigo nevalidis"
+
+#. 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 "Ne eblas ĝisdatigi %s: vi ne havas permeson ĝisdatigi programaron"
+
+#. 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 ""
+"Ne eblas instali ĝisdatigojn: vi ne havas permeson ĝisdatigi programaron"
+
+#. 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 "Ne eblas ĝisdatigi %s: doma elektro necesas"
+
+#. 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 "Ne eblas instali ĝisdatigojn: doma elektro necesas"
+
+#. 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 "Ne eblas ĝisdatigi %s: bateria nivelo tro malalta"
+
+#. 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 "Ne eblas instali ĝisdatigojn: bateria nivelo tro malalta"
+
+#. 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 "Ne eblas ĝisdatigi %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1315
+#, 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:1358
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "Ne eblas altgradigi de %s al %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 "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:1372
+#, 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:1381
+#, 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:1389
+#, 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:1396
+#, 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:1403
+#, 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:1410
+#, 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:1417
+#, 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:1426
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1464
+#, 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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1470
+#, 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 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 "Ne eblas forigi %s: vi ne havas permeson forigi programaron"
+
+#. 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 "Ne eblas forigi %s: doma elektro necesas"
+
+#. 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 "Ne eblas forigi %s: bateria nivelo tro malalta"
+
+#. 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 "Ne eblas forigi %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 "Ne eblas lanĉi %s: %s ne estas instalita"
+
+#. 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 "Nesufiĉa diskospaco — liberu iom da spaco kaj provu denove"
+
+#. 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 "Pardonon, io fiaskis"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1595
+msgid "Failed to install file: not supported"
+msgstr "Malsukcesis instali dosieron: ne subtenita"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1599
+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:1636
+msgid "Failed to install: not supported"
+msgstr "Malsukcesis instali: ne subtenita"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1640
+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:1686
+#, c-format
+msgid "Unable to contact %s"
+msgstr "Ne eblas kontakti %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 devas esti restartigita por uzi la novajn kromprogramojn."
+
+#. 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 ""
+"Ĉi tiu aplikaĵo devas esti restartigita por uzi la novajn kromprogramojn."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1713
+msgid "AC power is required"
+msgstr "Doma elektro necesas"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1717
+msgid "The battery level is too low"
+msgstr "Bateria nivelo tro malalta"
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-shell-search-provider.c:256
+#, c-format
+msgid "Source: %s"
+msgstr "Fonto: %s"
+
+#: src/gs-summary-tile.c:101
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instalante)"
+
+#: src/gs-summary-tile.c:106
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Forigante)"
+
+#. 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 "Fo_rigi ĉiujn"
+
+#. 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 "Neniu ĝisdatiga priskribo disponeblas."
+
+#. 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 "Instalita je %s"
+
+#. TRANSLATORS: this is the title of the installed updates dialog window
+#: src/gs-update-dialog.c:311
+msgid "Installed Updates"
+msgstr "Instalitaj ĝisdatigoj"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-update-dialog.c:527
+msgid "Additions"
+msgstr "Aldonoj"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-update-dialog.c:531
+msgid "Removals"
+msgstr "Forigoj"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#: src/gs-update-dialog.c:535
+msgid "Updates"
+msgstr "Ĝisdatigoj"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-update-dialog.c:539
+msgid "Downgrades"
+msgstr "Malpromocioj"
+
+#: src/gs-update-dialog.ui:100
+msgid "No updates have been installed on this system."
+msgstr "Neniu ĝisdatigo instaliĝis sur ĉi tiu sistemo."
+
+#: src/gs-update-monitor.c:107
+msgid "Security Updates Pending"
+msgstr "Okazonte sekurecaj ĝisdatigoj"
+
+#: src/gs-update-monitor.c:108
+msgid "It is recommended that you install important updates now"
+msgstr "Estas rekomendita, ke vi instalu la gravajn ĝisdatigojn nun"
+
+#: src/gs-update-monitor.c:111
+msgid "Restart & Install"
+msgstr "Restartigi kaj instali"
+
+#: src/gs-update-monitor.c:115
+msgid "Software Updates Available"
+msgstr "Programaraj ĝisdatigoj disponeblas"
+
+#: src/gs-update-monitor.c:116
+msgid "Important OS and application updates are ready to be installed"
+msgstr "Gravaj operaciumaj kaj aplikaĵaj ĝisdatigoj pretas por instalado"
+
+#: src/gs-update-monitor.c:120
+msgid "View"
+msgstr "Vidi"
+
+#. 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 aplikaĵo ĝisdatigita — restartigo necesas"
+msgstr[1] "%u aplikaĵoj ĝisdatigitaj — restartigo necesas"
+
+#. 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 aplikaĵo ĝisdatigita"
+msgstr[1] "%u aplikaĵoj ĝisdatigitaj"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:245
+#, c-format
+msgid "%s has been updated."
+msgstr "%s ĝisdatiĝis."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:248
+msgid "Please restart the application."
+msgstr "Bonvolu restartigi la aplikaĵon."
+
+#. 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 kaj %s ĝisdatiĝis."
+
+#. 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 aplikaĵo bezonas restartigo."
+msgstr[1] "%u aplikaĵoj bezonas restartigo."
+
+#. 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 "Inkluzivante %s, %s kaj %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 "Operaciumaj ĝisdatigoj ne plu disponeblas"
+
+#. 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 "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:572
+#, 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:576
+msgid "Software Upgrade Available"
+msgstr "Programara altgradigo disponeblas"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:965
+msgid "Software Updates Failed"
+msgstr "Programaraj ĝisdatigoj malsukcesis"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:967
+msgid "An important OS update failed to be installed."
+msgstr "Instalado de grava ĝisdatigo por la operaciumo malsukcesis."
+
+#: src/gs-update-monitor.c:968
+msgid "Show Details"
+msgstr "Montri detalojn"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:991
+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:996
+#, 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:1002
+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:1006
+msgid "An important OS update has been installed."
+msgid_plural "Important OS 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 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 "Ekzameni"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1065
+msgid "Failed To Update"
+msgstr "Malsukcesis ĝisdatigi"
+
+#. 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 "La sistemo jam estis ĝisdata."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1076
+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:1082
+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:1088
+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:1094
+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: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 ""
+"Ni pardonpetas: la ĝisdatigo malsukcesis instali. Bonvolu atendi por alia "
+"ĝisdatigo kaj provu denove. Se la problemo restas, kontaktu vian programaran "
+"provizanton."
+
+#. 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 "Hieraŭ, %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 "Hieraŭ, %l:%M %p"
+
+#: src/gs-updates-page.c:241
+msgid "Two days ago"
+msgstr "Antaŭ du tagoj"
+
+#: src/gs-updates-page.c:243
+msgid "Three days ago"
+msgstr "Antaŭ tri tagoj"
+
+#: src/gs-updates-page.c:245
+msgid "Four days ago"
+msgstr "Antaŭ kvar tagoj"
+
+#: src/gs-updates-page.c:247
+msgid "Five days ago"
+msgstr "Antaŭ kvin tagoj"
+
+#: src/gs-updates-page.c:249
+msgid "Six days ago"
+msgstr "Antaŭ ses tagoj"
+
+#: src/gs-updates-page.c:251
+msgid "One week ago"
+msgstr "Antaŭ unu semajno"
+
+#: src/gs-updates-page.c:253
+msgid "Two weeks ago"
+msgstr "Antaŭ du semajnoj"
+
+#. TRANSLATORS: the update panel is doing *something* vague
+#: src/gs-updates-page.c:269
+msgid "Looking for new updates…"
+msgstr "Serĉante novajn ĝisdatigojn…"
+
+#. TRANSLATORS: the updates panel is starting up
+#: src/gs-updates-page.c:338
+msgid "Setting up updates…"
+msgstr "Agordante ĝisdatigojn…"
+
+#. 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 "(Ĉi tio povas esti longdaŭra)"
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: src/gs-updates-page.c:453
+#, c-format
+msgid "Last checked: %s"
+msgstr "Laste kontrolita: %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 ne plu estas subtenita."
+
+#. TRANSLATORS: OS refers to operating system, e.g. Fedora
+#: src/gs-updates-page.c:622
+msgid "Your OS is no longer supported."
+msgstr "Via operaciumo ne plu estas subtenita."
+
+#. 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 "Ĉi tiu signifas, ke vi ni ricevos sekurecajn ĝisdatigojn."
+
+#. 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 "Ni rekomendas al vi altgradigi al pli freŝdata versio."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:889
+msgid "Charges May Apply"
+msgstr "Povas kosti ion"
+
+#. 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 ""
+"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:897
+msgid "Check _Anyway"
+msgstr "Kontroli _tamen"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:913
+msgid "No Network"
+msgstr "Neniu reto"
+
+#. 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 "Interreta aliro necesas por kontroli pri ĝisdatigoj."
+
+#. This label indicates that the update check is in progress
+#: src/gs-updates-page.c:1340
+msgid "Checking…"
+msgstr "Kontrolante…"
+
+#: src/gs-updates-page.c:1353
+msgid "Check for updates"
+msgstr "Kontroli pri ĝisdatigoj"
+
+#: src/gs-updates-page.ui:7
+msgid "Updates page"
+msgstr "Paĝo de ĝisdatigoj"
+
+#. 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 "Programaro estas ĝisdata"
+
+#: src/gs-updates-page.ui:225
+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:237
+msgid "_Check Anyway"
+msgstr "_Kontroli tamen"
+
+#: src/gs-updates-page.ui:273
+msgid "Go online to check for updates"
+msgstr "Enretigu por kontroli pri ĝisdatigoj"
+
+#: src/gs-updates-page.ui:284
+msgid "_Network Settings"
+msgstr "_Retagordoj"
+
+#: src/gs-updates-page.ui:357
+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:278
+msgid "Restart & Update"
+msgstr "Restartigi kaj ĝisdatigi"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:284
+msgid "Update All"
+msgstr "Ĝisdatigi ĉiujn"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:415
+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:419
+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:423
+msgid "Application Updates"
+msgstr "Aplikaĵaj ĝisdatigoj"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:427
+msgid "Device Firmware"
+msgstr "Aparata mikroprogramo"
+
+#: src/gs-updates-section.c:455 src/gs-upgrade-banner.ui:102
+msgid "_Download"
+msgstr "_Elŝuti"
+
+#: src/gs-upgrade-banner.c:64
+msgid "_Restart Now"
+msgstr "_Restartigi nun"
+
+#: src/gs-upgrade-banner.c:66
+msgid "Updates will be applied when the computer is restarted."
+msgstr "Instalos ĝisdatigojn post al restartigo de la komputilo."
+
+#: src/gs-upgrade-banner.c:72
+msgid ""
+"It is recommended that you back up your data and files before upgrading."
+msgstr ""
+"Ni rekomendas al vi sekurkopii viajn datumojn kaj dosierojn antaŭ ol "
+"altgradigi."
+
+#. 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 nun estas disponebla"
+
+#. 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 "Atendante por elŝutado de %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 "Elŝutante %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 estas preta por instali"
+
+#: src/gs-upgrade-banner.ui:30
+msgid "A major upgrade, with new features and added polish."
+msgstr "Granda altgradigo, kun novaj funkcioj kaj plibonigoj."
+
+#: src/gs-upgrade-banner.ui:50
+msgid "_Learn More"
+msgstr "_Lernu pli"
+
+#: src/org.gnome.Software.desktop.in:4
+msgid "Add, remove or update software on this computer"
+msgstr "Aldoni, forigi aŭ ĝisdatigi programaron sur ĉi tiu komputilo"
+
+#. 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 ""
+"Ĝisdatigoj;Altgradigo;Fontoj;Deponejoj;Agordoj;Instali;Malinstali;Programo;"
+"Programaro;Aplikaĵo;Butiko;"
+
+#: plugins/core/gs-desktop-common.c:16
+msgctxt "Menu of Audio & Video"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:19
+msgctxt "Menu of Audio & Video"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:22
+msgctxt "Menu of Audio & Video"
+msgid "Audio Creation & Editing"
+msgstr "Kreado kaj redaktado de aŭdaĵo"
+
+#: plugins/core/gs-desktop-common.c:28
+msgctxt "Menu of Audio & Video"
+msgid "Music Players"
+msgstr "Muzikludiloj"
+
+#: plugins/core/gs-desktop-common.c:37
+msgctxt "Menu of Developer Tools"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:40
+msgctxt "Menu of Developer Tools"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:43
+msgctxt "Menu of Developer Tools"
+msgid "Debuggers"
+msgstr "Sencimigiloj"
+
+#: plugins/core/gs-desktop-common.c:46
+msgctxt "Menu of Developer Tools"
+msgid "IDEs"
+msgstr "Programadaj medioj"
+
+#: plugins/core/gs-desktop-common.c:55
+msgctxt "Menu of Education & Science"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:59
+msgctxt "Menu of Education & Science"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:63
+msgctxt "Menu of Education & Science"
+msgid "Artificial Intelligence"
+msgstr "Artefarita intelekto"
+
+#: plugins/core/gs-desktop-common.c:66
+msgctxt "Menu of Education & Science"
+msgid "Astronomy"
+msgstr "Astronomio"
+
+#: plugins/core/gs-desktop-common.c:70
+msgctxt "Menu of Education & Science"
+msgid "Chemistry"
+msgstr "Ĥemio"
+
+#: plugins/core/gs-desktop-common.c:74
+msgctxt "Menu of Education & Science"
+msgid "Languages"
+msgstr "Lingvoj"
+
+#: plugins/core/gs-desktop-common.c:78
+msgctxt "Menu of Education & Science"
+msgid "Math"
+msgstr "Matematiko"
+
+#: plugins/core/gs-desktop-common.c:85
+msgctxt "Menu of Education & Science"
+msgid "Robotics"
+msgstr "Robotteĥniko"
+
+#: plugins/core/gs-desktop-common.c:94
+msgctxt "Menu of Games"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:97
+msgctxt "Menu of Games"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:100
+msgctxt "Menu of Games"
+msgid "Action"
+msgstr "Batalo"
+
+#: plugins/core/gs-desktop-common.c:103
+msgctxt "Menu of Games"
+msgid "Adventure"
+msgstr "Aventuro"
+
+#: plugins/core/gs-desktop-common.c:106
+msgctxt "Menu of Games"
+msgid "Arcade"
+msgstr "Arkado"
+
+#: plugins/core/gs-desktop-common.c:109
+msgctxt "Menu of Games"
+msgid "Blocks"
+msgstr "Blokoj"
+
+#: plugins/core/gs-desktop-common.c:112
+msgctxt "Menu of Games"
+msgid "Board"
+msgstr "Tabulo"
+
+#: plugins/core/gs-desktop-common.c:115
+msgctxt "Menu of Games"
+msgid "Card"
+msgstr "Karto"
+
+#: plugins/core/gs-desktop-common.c:118
+msgctxt "Menu of Games"
+msgid "Emulators"
+msgstr "Imitiloj"
+
+#: plugins/core/gs-desktop-common.c:121
+msgctxt "Menu of Games"
+msgid "Kids"
+msgstr "Infanoj"
+
+#: plugins/core/gs-desktop-common.c:124
+msgctxt "Menu of Games"
+msgid "Logic"
+msgstr "Logiko"
+
+#: plugins/core/gs-desktop-common.c:127
+msgctxt "Menu of Games"
+msgid "Role Playing"
+msgstr "Rolludo"
+
+#: plugins/core/gs-desktop-common.c:130
+msgctxt "Menu of Games"
+msgid "Sports"
+msgstr "Sportoj"
+
+#: plugins/core/gs-desktop-common.c:134
+msgctxt "Menu of Games"
+msgid "Strategy"
+msgstr "Strategio"
+
+#: plugins/core/gs-desktop-common.c:142
+msgctxt "Menu of Graphics & Photography"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:145
+msgctxt "Menu of Graphics & Photography"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:148
+msgctxt "Menu of Graphics & Photography"
+msgid "3D Graphics"
+msgstr "3D-grafiko"
+
+#: plugins/core/gs-desktop-common.c:151
+msgctxt "Menu of Graphics & Photography"
+msgid "Photography"
+msgstr "Fotografio"
+
+#: plugins/core/gs-desktop-common.c:154
+msgctxt "Menu of Graphics & Photography"
+msgid "Scanning"
+msgstr "Skanado"
+
+#: plugins/core/gs-desktop-common.c:157
+msgctxt "Menu of Graphics & Photography"
+msgid "Vector Graphics"
+msgstr "Vektora grafiko"
+
+#: plugins/core/gs-desktop-common.c:160
+msgctxt "Menu of Graphics & Photography"
+msgid "Viewers"
+msgstr "Vidigilo"
+
+#: plugins/core/gs-desktop-common.c:168
+msgctxt "Menu of Productivity"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:171
+msgctxt "Menu of Productivity"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:174
+msgctxt "Menu of Productivity"
+msgid "Calendar"
+msgstr "Kalendaro"
+
+#: plugins/core/gs-desktop-common.c:178
+msgctxt "Menu of Productivity"
+msgid "Database"
+msgstr "Datumbazo"
+
+#: plugins/core/gs-desktop-common.c:181
+msgctxt "Menu of Productivity"
+msgid "Finance"
+msgstr "Financo"
+
+#: plugins/core/gs-desktop-common.c:185
+msgctxt "Menu of Productivity"
+msgid "Word Processor"
+msgstr "Dokumentoredaktilo"
+
+#: plugins/core/gs-desktop-common.c:194
+msgctxt "Menu of Add-ons"
+msgid "Fonts"
+msgstr "Tiparoj"
+
+#: plugins/core/gs-desktop-common.c:197
+msgctxt "Menu of Add-ons"
+msgid "Codecs"
+msgstr "Kodekoj"
+
+#: plugins/core/gs-desktop-common.c:200
+msgctxt "Menu of Add-ons"
+msgid "Input Sources"
+msgstr "Enigaj fontoj"
+
+#: plugins/core/gs-desktop-common.c:203
+msgctxt "Menu of Add-ons"
+msgid "Language Packs"
+msgstr "Lingvo-pakoj"
+
+#: plugins/core/gs-desktop-common.c:206
+msgctxt "Menu of Add-ons"
+msgid "Shell Extensions"
+msgstr "Ŝel-etendaĵoj"
+
+#: plugins/core/gs-desktop-common.c:209
+msgctxt "Menu of Add-ons"
+msgid "Localization"
+msgstr "Asimilado"
+
+#: plugins/core/gs-desktop-common.c:212
+msgctxt "Menu of Add-ons"
+msgid "Hardware Drivers"
+msgstr "Aparataraj peliloj"
+
+#: plugins/core/gs-desktop-common.c:220
+msgctxt "Menu of Communication & News"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:223
+msgctxt "Menu of Communication & News"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:226
+msgctxt "Menu of Communication & News"
+msgid "Chat"
+msgstr "Babilo"
+
+#: plugins/core/gs-desktop-common.c:233
+msgctxt "Menu of Communication & News"
+msgid "News"
+msgstr "Novaĵoj"
+
+#: plugins/core/gs-desktop-common.c:237
+msgctxt "Menu of Communication & News"
+msgid "Web Browsers"
+msgstr "Retaj foliumiloj"
+
+#: plugins/core/gs-desktop-common.c:245
+msgctxt "Menu of Utilities"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:248
+msgctxt "Menu of Utilities"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:251
+msgctxt "Menu of Utilities"
+msgid "Text Editors"
+msgstr "Tekstredaktiloj"
+
+#: plugins/core/gs-desktop-common.c:259
+msgctxt "Menu of Reference"
+msgid "All"
+msgstr "Ĉiuj"
+
+#: plugins/core/gs-desktop-common.c:262
+msgctxt "Menu of Reference"
+msgid "Featured"
+msgstr "Rekomenditaj"
+
+#: plugins/core/gs-desktop-common.c:265
+msgctxt "Menu of Art"
+msgid "Art"
+msgstr "Arto"
+
+#: plugins/core/gs-desktop-common.c:268
+msgctxt "Menu of Reference"
+msgid "Biography"
+msgstr "Biografio"
+
+#: plugins/core/gs-desktop-common.c:271
+msgctxt "Menu of Reference"
+msgid "Comics"
+msgstr "Bildrakontoj"
+
+#: plugins/core/gs-desktop-common.c:274
+msgctxt "Menu of Reference"
+msgid "Fiction"
+msgstr "Fikcio"
+
+#: plugins/core/gs-desktop-common.c:277
+msgctxt "Menu of Reference"
+msgid "Health"
+msgstr "Sano"
+
+#: plugins/core/gs-desktop-common.c:280
+msgctxt "Menu of Reference"
+msgid "History"
+msgstr "Historio"
+
+#: plugins/core/gs-desktop-common.c:283
+msgctxt "Menu of Reference"
+msgid "Lifestyle"
+msgstr "Vivostilo"
+
+#: plugins/core/gs-desktop-common.c:286
+msgctxt "Menu of Reference"
+msgid "Politics"
+msgstr "Politiko"
+
+#: plugins/core/gs-desktop-common.c:289
+msgctxt "Menu of Reference"
+msgid "Sports"
+msgstr "Sportoj"
+
+#. TRANSLATORS: this is the menu spec main category for Audio & Video
+#: plugins/core/gs-desktop-common.c:299
+msgid "Audio & Video"
+msgstr "Aŭdaĵo kaj video"
+
+#. TRANSLATORS: this is the menu spec main category for Development
+#: plugins/core/gs-desktop-common.c:302
+msgid "Developer Tools"
+msgstr "Programiloj"
+
+#. TRANSLATORS: this is the menu spec main category for Education & Science
+#: plugins/core/gs-desktop-common.c:305
+msgid "Education & Science"
+msgstr "Edukado kaj scienco"
+
+#. TRANSLATORS: this is the menu spec main category for Game
+#: plugins/core/gs-desktop-common.c:308
+msgid "Games"
+msgstr "Ludoj"
+
+#. TRANSLATORS: this is the menu spec main category for Graphics
+#: plugins/core/gs-desktop-common.c:311
+msgid "Graphics & Photography"
+msgstr "Grafiko kaj fotografio"
+
+#. TRANSLATORS: this is the menu spec main category for Office
+#: plugins/core/gs-desktop-common.c:314
+msgid "Productivity"
+msgstr "Produktemeco"
+
+#. TRANSLATORS: this is the menu spec main category for Communication
+#: plugins/core/gs-desktop-common.c:320
+msgid "Communication & News"
+msgstr "Komunikado kaj novaĵo"
+
+#. TRANSLATORS: this is the menu spec main category for Reference
+#: plugins/core/gs-desktop-common.c:323
+msgid "Reference"
+msgstr "Referenco"
+
+#. TRANSLATORS: this is the menu spec main category for Utilities
+#: plugins/core/gs-desktop-common.c:326
+msgid "Utilities"
+msgstr "Utilaĵoj"
+
+#. 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 "Operaciumaj ĝisdatigoj"
+
+#. 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 "Inkluzivas rendimentajn, stabilecajn kaj sekurecajn plibonigojn."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:41
+msgid "Downloading featured images…"
+msgstr "Elŝutante rekomenditajn bildojn…"
+
+#. 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 "Ĝisdatigo de Endless OS kun novaj funkcioj kaj cimriparoj."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:825
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS ĝisdatigservo ne povis elŝuti kaj apliki la ĝisdatigon."
+
+#. 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 "GNOME Programara AppStream sistema instalilo"
+
+#: plugins/external-appstream/gs-install-appstream.c:141
+msgid "Failed to parse command line arguments"
+msgstr "Malsukcesis interpreti komandliniajn argumentojn"
+
+#. 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 "Vi devas specifi precize unu dosiernomon"
+
+#. 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 "Nur la uzanto \"root\" rajtas uzi ĉi tiun programon"
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:163
+msgid "Failed to validate content type"
+msgstr "Malsukcesis validigi enhavespecon"
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:173
+msgid "Failed to copy"
+msgstr "Malsukcesis kopii"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/external-appstream/gs-plugin-external-appstream.c:235
+msgid "Downloading extra metadata files…"
+msgstr "Elŝutante ekstrajn metadatumajn dosierojn…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:192
+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:283
+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
+msgid "Flatpak is a framework for desktop applications on Linux"
+msgstr "Flatpak estas framo por labortablaj aplikaĵoj sur Linukso"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:861
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Prenante Flatpak-metadatumojn por %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 "%s 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:140
+#, c-format
+msgid "%s System"
+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:145
+#, c-format
+msgid "%s Embedded Controller"
+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:150
+#, c-format
+msgid "%s ME"
+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:155
+#, c-format
+msgid "%s Corporate ME"
+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:160
+#, c-format
+msgid "%s Consumer ME"
+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:166
+#, c-format
+msgid "%s Controller"
+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:172
+#, c-format
+msgid "%s Thunderbolt Controller"
+msgstr "%s Thunderbolt-kontrolilo"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:669
+msgid "Downloading firmware update signature…"
+msgstr "Elŝutante mikroprograman ĝisdatigan subskrobon…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:710
+msgid "Downloading firmware update metadata…"
+msgstr "Elŝutante mikroprogramajn ĝisdatigajn metadatumojn…"
+
+#: 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"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/odrs/gs-plugin-odrs.c:196
+msgid "Downloading application ratings…"
+msgstr "Elŝutante aplikaĵajn taksojn…"
+
+#: 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 estas servo provizante uzanto-recenzojn de aplikaĵoj"
+
+#: 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 "GNOME-ŝela etendaĵa deponejo"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/shell-extensions/gs-plugin-shell-extensions.c:806
+msgid "Downloading shell extension metadata…"
+msgstr "Elŝutante ŝeletendaĵajn metadatumojn…"
+
+#. TRANSLATORS: the one-line summary
+#: plugins/shell-extensions/gs-plugin-shell-extensions.c:914
+msgid "GNOME Shell Extension"
+msgstr "GNOME Ŝel-etendaĵo"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:191
+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 pako"
+
+#~ msgid "Spacing"
+#~ msgstr "Interspaco"
+
+#~ msgid "The amount of space between children"
+#~ msgstr "La kvanto de spaco inter idoj"
+
+#~ msgid "system-software-install"
+#~ msgstr "system-software-install"
+
+#~ msgid "_All"
+#~ msgstr "Ĉi_uj"
+
+#~ msgid "Folder Name"
+#~ msgstr "Doseruja nomo"
+
+#~ msgid "_Add"
+#~ msgstr "_Aldoni"
+
+#~ msgid "Add to Application Folder"
+#~ msgstr "Aldoni al dosierujo de aplikaĵoj"
+
+#~ msgid "Sign In / Register…"
+#~ msgstr "Saluti / Registri…"
+
+#~ msgid "Continue"
+#~ msgstr "Daŭrigi"
+
+#~ msgid "Use"
+#~ msgstr "Uzi"
+
+#~ msgid "Add another…"
+#~ msgstr "Aldoni alian…"
+
+#~ msgid "Top Rated"
+#~ msgstr "Plej bone taksita"
+
+#~ msgid "CSS validated OK!"
+#~ msgstr "CSS validiĝis bone!"
+
+#~ msgid "Failed to load file"
+#~ msgstr "Malsukcesis ŝargi dosieron"
+
+#~ msgid "Unsaved changes"
+#~ msgstr "Nekonservitaj ŝanĝoj"
+
+#~ msgid "The application list is already loaded."
+#~ msgstr "La listo de aplikaĵoj jam estas ŝargita."
+
+#~ msgid "Merge documents"
+#~ msgstr "Kunigi dokumentojn"
+
+#~ msgid "Throw away changes"
+#~ msgstr "Forĵeti ŝanĝojn"
+
+#~ msgid "Open AppStream File"
+#~ msgstr "Malfermi AppStream-dosieron"
+
+#~ msgid "_Open"
+#~ msgstr "_Malfermi"
+
+#~ msgid "_Save"
+#~ msgstr "Kon_servi"
+
+#~ msgid "Failed to save file"
+#~ msgstr "Malsukcesis konservi dosieron"
+
+#~ msgid "%s banner design deleted."
+#~ msgstr "%s rubanda fasono forigita."
+
+#~ msgid "Banner design deleted."
+#~ msgstr "Rubanda fasono forigita."
+
+#~ msgid "The application list has unsaved changes."
+#~ msgstr "La listo de aplikaĵoj havas konservitajn ŝanĝojn."
+
+#~ msgid "Use verbose logging"
+#~ msgstr "Uzi babileman protokoladon"
+
+#~ msgid "GNOME Software Banner Designer"
+#~ msgstr "Fasonisto de GNOME Programara rubando"
+
+#~ msgid "No Designs"
+#~ msgstr "Neniuj fasonoj"
+
+#~ msgid "Error message here"
+#~ msgstr "Erara mesaĝo ĉi tie"
+
+#~ msgid "App ID"
+#~ msgstr "Aplikaĵa ID"
+
+#~ msgid "Editor’s Pick"
+#~ msgstr "Elekto de redaktisto"
+
+#~ msgid "Category Featured"
+#~ msgstr "Kategorio rekomendita"
+
+#~ msgid "Undo"
+#~ msgstr "Malfari"
+
+#~ msgid "Banner Designer"
+#~ msgstr "Fasonisto de rubando"
+
+#~ msgid "New Banner"
+#~ msgstr "Nova rubando"
+
+#~ msgid "Import from file"
+#~ msgstr "Enporti el dosiero"
+
+#~ msgid "Export to file"
+#~ msgstr "Elporti al dosiero"
+
+#~ msgid "Delete Design"
+#~ msgstr "Forigi fasonon"
+
+#~ msgid "Featured App"
+#~ msgstr "Rekomendita aplikaĵo"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Operaciuma altgradigo"
+
+#~ msgid "Click on items to select them"
+#~ msgstr "Alklaku erojn por elekti ilin"
+
+#~ msgid "Select"
+#~ msgstr "Elekti"
+
+#~ msgid "_Add to Folder…"
+#~ msgstr "_Aldoni al dosierujo…"
+
+#~ msgid "_Move to Folder…"
+#~ msgstr "_Movi al dosierujo…"
+
+#~ msgid "_Remove from Folder"
+#~ msgstr "Fo_rigi de dosierujo"
+
+#~ msgid "Software catalog is being loaded"
+#~ msgstr "Ŝargante programaran katalogon"
+
+#~ msgid "Are you sure you want to purchase %s?"
+#~ msgstr "Ĉu vi certe volas aĉeti %s?"
+
+#~ msgid "%s will be installed, and you will be charged %s."
+#~ msgstr "%s instaliĝos, kaj vin pagigis %s."
+
+#~ msgid "Purchase"
+#~ msgstr "Aĉeti"
+
+#~ 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 "Signed in as %s"
+#~ msgstr "Salutinta kiel %s"
+
+#~ msgid "Sign in…"
+#~ msgstr "Saluti…"
+
+#~ msgid "Sign out"
+#~ msgstr "Adiaŭi"
+
+#~ msgid "Unable to purchase %s: authentication was required"
+#~ msgstr "Ne eblas aĉeti %s: aŭtentigo necesis"
+
+#~ msgid "Unable to purchase %s: authentication was invalid"
+#~ msgstr "Ne eblas aĉeti %s: aŭtentigo nevalidis"
+
+#~ msgid "Unable to purchase %s: no payment method setup"
+#~ msgstr "Ne eblas aĉeti %s: pagmaniero ne estas elektita"
+
+#~ msgid "Unable to purchase %s: payment was declined"
+#~ msgstr "Ne eblas aĉeti %s: pago rifuziĝis"
+
+#~ msgid "Unable to purchase %s"
+#~ msgstr "Ne eblas aĉeti %s"
+
+#~ msgid "org.gnome.Software"
+#~ msgstr "org.gnome.Software"
+
+#~ msgid "Design the featured banners for GNOME Software"
+#~ msgstr "Fasoni la rubandojn por GNOME Programaro"
+
+#~ msgid "AppStream;Software;App;"
+#~ msgstr "AppStream;Programaro;Aplikaĵo;"
+
+#~ msgid "Web Apps Support"
+#~ msgstr "Retaplikaĵa subteno"
+
+#~ msgid "Run popular web applications in a browser"
+#~ msgstr "Ruli popularajn retaplikaĵojn en foliumilo"
+
+#~ msgid "To continue, you need to use an Ubuntu One account."
+#~ msgstr "Por daŭrigi, vi bezonos konton Ubuntu One."
+
+#~ msgid "To continue, you need to use your Ubuntu One account."
+#~ msgstr "Por daŭrigi, vi bezonos konton Ubuntu One."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "To continue you need to sign in to %s."
+#~ msgstr "Salutu en %s por daŭrigi."
+
+#~ msgid "Email address"
+#~ msgstr "Retpoŝtadreso"
+
+#~ msgid "I have an account already"
+#~ msgstr "Mi jam havas konton"
+
+#~ msgid "Password"
+#~ msgstr "Pasvorto"
+
+#~ msgid "I want to register for an account now"
+#~ msgstr "Mi volas krei konton nun"
+
+#~ msgid "I have forgotten my password"
+#~ msgstr "Mi forgesis mian pasvorton"
+
+#~ msgid "Sign in automatically next time"
+#~ msgstr "Aŭtomate saluti venonte"
+
+#~ msgid "Enter your one-time pin for two-factor authentication."
+#~ msgstr "Enigu vian unufojan PIN por dufaza aŭtentigo."
+
+#~ msgid "PIN"
+#~ msgstr "PIN"
+
+#~ msgid "Authenticate"
+#~ msgstr "Aŭtentigi"
+
+#~ msgid "_About"
+#~ msgstr "_Pri"
+
+#~ msgid "_Quit"
+#~ msgstr "Ĉ_esi"
+
+#~ 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 retejo oni povas trovi informon pri %s, kaj ankaŭ opciojn por akiri "
+#~ "ĝustan kodekon por tiu ĉi formo."
+
+#~ msgid "Your %s account has been suspended."
+#~ msgstr "Via %s konto suspendiĝis."
+
+#~ msgid "It is not possible to install software until this has been resolved."
+#~ msgstr "Ne eblas instali programaron ĝis tiu solviĝis."
+
+#~ msgid "For more information, visit %s."
+#~ msgstr "Por pli da informoj, vizitu %s."
+
+#~ msgid "Unable to update %s from %s"
+#~ msgstr "Ne eblas ĝisdatigi %s de %s"
+
+#~ msgid "Downloading application page…"
+#~ msgstr "Elŝutante paĝon de aplikaĵo…"
+
+#~ msgid "Steam Support"
+#~ msgstr "Steam-subteno"
+
+#~ msgid "The ultimate entertainment platform from Valve"
+#~ msgstr "La pintega amuzaĵo-platformo de Valve"
+
+#~ msgid "Downloading new updates…"
+#~ msgstr "Elŝutante novajn ĝisdatigojn…"
+
+#~ msgid "About Software"
+#~ msgstr "Pri Programaro"
+
+#~ msgid "Total"
+#~ msgstr "Sume"
+
+#~ msgid "Could not find '%s'"
+#~ msgstr "Ne eblis trovi na '%s'"
+
+#, fuzzy
+#~| msgid "_Install"
+#~ msgid "_Install All"
+#~ msgstr "_Instali"
+
+#~ msgid "Restart & _Install"
+#~ msgstr "Restarti & _instali"
+
+#~ msgid "Remove Source"
+#~ msgstr "Forigi fonton"
+
+#~| 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 ""
+#~ "Programar-fonotj estas elŝuteblaj de la interreto. Aldono de tiu "
+#~ "programar-fonto donos al vi aliron al kromaj programaroj kiuj ne estas "
+#~ "provizitaj de %s."
+
+#~ msgid "Installed from this Source"
+#~ msgstr "Instalite de tiu fonto"
+
+#~ msgid "Source Details"
+#~ msgstr "Detaloj de fonto"
+
+#~ msgid "Added"
+#~ msgstr "Aldonite"
+
+#~ msgid "Website"
+#~ msgstr "Retejo"
+
+#~ msgid "Installation of %s failed."
+#~ msgstr "Instalado de %s malsukcesis."
+
+#~ msgid "Removal of %s failed."
+#~ msgstr "Forigo de %s malsukcesis."
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-cartoon"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-fantasy"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-realistic"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-bloodshed"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-sexual"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating drugs-alcohol"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating drugs-narcotics"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating sex-nudity"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating sex-themes"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-profanity"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-humor"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-discrimination"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-advertising"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-gambling"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-purchasing"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-chat"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-audio"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-contacts"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-info"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#, fuzzy
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-location"
+#~ msgid "None"
+#~ msgstr "Neniu"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Development"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Development"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Education"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Education"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Graphics"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Graphics"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Office"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Office"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Science"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Science"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#, fuzzy
+#~| msgctxt "Menu subcategory of Education"
+#~| msgid "Astronomy"
+#~ msgctxt "Menu of Science"
+#~ msgid "Astronomy"
+#~ msgstr "Astronomio"
+
+#, fuzzy
+#~| msgctxt "Menu subcategory of Education"
+#~| msgid "Chemistry"
+#~ msgctxt "Menu of Science"
+#~ msgid "Chemistry"
+#~ msgstr "Kemio"
+
+#, fuzzy
+#~| msgctxt "Menu subcategory of Education"
+#~| msgid "Math"
+#~ msgctxt "Menu of Science"
+#~ msgid "Math"
+#~ msgstr "Matematiko"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Communication"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Communication"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~| msgid "_All"
+#~ msgctxt "Menu of Utility"
+#~ msgid "All"
+#~ msgstr "Ĉiuj"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Utility"
+#~ msgid "Featured"
+#~ msgstr "Elstaranta"
+
+#~ msgid "Science"
+#~ msgstr "Scienco"
+
+#~ msgid " or "
+#~ msgstr " aŭ "
+
+#~ msgid "A previous update was unfinished."
+#~ msgstr "Antaŭa ĝisdatigo malsukcesis."
+
+#~ msgid "An update was not signed in the correct way."
+#~ msgstr "Ĝisdatigo ne estis korekte subskribita."
+
+#~ msgid "The update could not be completed."
+#~ msgstr "Malsukcesis fini la ĝisdatigon."
+
+#~ msgid "An offline update was requested but no packages required updating."
+#~ msgstr "Oni petis eksterretan ĝisdatigon, sed neniu pakaĵo bezonas ĝin."
+
+#~ msgid "An update failed to install correctly."
+#~ msgstr "Malsukcesis instali ĝisdatigon korekte."
+
+#~ msgid "The offline update failed in an unexpected way."
+#~ msgstr "Malsukcesis eksterrete ĝisdatigi pro nekonataj kialoj."
+
+#~ msgid "_Installing"
+#~ msgstr "_Instalado"
+
+#~ msgid "_Removing"
+#~ msgstr "_Forigado"
+
+#~ msgctxt "license"
+#~ msgid "Unknown"
+#~ msgstr "Nekonata"
+
+#~ msgctxt "size"
+#~ msgid "Calculating…"
+#~ msgstr "Kalkulante…"
+
+#~ msgctxt "size"
+#~ msgid "Unknown"
+#~ msgstr "Nekonata"
+
+#~ msgid "_History"
+#~ msgstr "_Historio"
+
+#~ msgid "Size"
+#~ msgstr "Grando"
+
+#~ msgid "Recommended Office Applications"
+#~ msgstr "Rekomenditaj oficejo-aplikaĵoj"
+
+#~ msgid "No sources found."
+#~ msgstr "Neniu fonto trovita."
+
+#~ msgid "OK"
+#~ msgstr "Akcepti"
+
+#~ msgid "One Star"
+#~ msgstr "Unu stelo"
+
+#~ msgid "Two Stars"
+#~ msgstr "Du steloj"
+
+#~ msgid "Three Stars"
+#~ msgstr "Tri steloj"
+
+#~ msgid "Four Stars"
+#~ msgstr "Kvar steloj"
+
+#~ msgid "Five Stars"
+#~ msgstr "Kvin steloj"
+
+#~ msgid "Audio"
+#~ msgstr "Sono"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Databases"
+#~ msgstr "Datumbazoj"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Disc Burning"
+#~ msgstr "Diska registrado"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Ham Radio"
+#~ msgstr "Amatora radio"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "MIDI"
+#~ msgstr "MIDI"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Mixer"
+#~ msgstr "Miksilo"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Music"
+#~ msgstr "Muziko"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Recorders"
+#~ msgstr "Registriloj"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Sequencers"
+#~ msgstr "Sekvenciloj"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Tuners"
+#~ msgstr "Agordiloj"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Building"
+#~ msgstr "Konstruado"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Databases"
+#~ msgstr "Datumbazoj"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "IDE"
+#~ msgstr "Programada ĉirkaŭaĵo"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Profiling"
+#~ msgstr "Profilado"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Translation"
+#~ msgstr "Traduko"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Web Development"
+#~ msgstr "Reta disvolvo"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Biology"
+#~ msgstr "Biologio"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Computer Science"
+#~ msgstr "Komputila scienco"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Construction"
+#~ msgstr "Konstruado"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Data Visualization"
+#~ msgstr "Datumo-bildigo"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Economy"
+#~ msgstr "Ekonomio"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Electricity"
+#~ msgstr "Elektro"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Electronics"
+#~ msgstr "Elektroniko"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Engineering"
+#~ msgstr "Inĝenierado"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geology"
+#~ msgstr "Geologio"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geoscience"
+#~ msgstr "Terscienco"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "History"
+#~ msgstr "Historio"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Humanities"
+#~ msgstr "Homsciencoj"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Image Processing"
+#~ msgstr "Bilda prilaborado"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Literature"
+#~ msgstr "Literaturo"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Maps"
+#~ msgstr "Mapoj"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Music"
+#~ msgstr "Muziko"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Nombra analitiko"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Parallel Computing"
+#~ msgstr "Paralela komputado"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Physics"
+#~ msgstr "Fiziko"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Spirituality"
+#~ msgstr "Spiriteco"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Shooter"
+#~ msgstr "Pafado"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Simulation"
+#~ msgstr "Simulado"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Sports"
+#~ msgstr "Sporto"
+
+#~ msgid "Graphics"
+#~ msgstr "Grafiko"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "2D Graphics"
+#~ msgstr "2D-grafiko"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Raster Graphics"
+#~ msgstr "Rastruma grafiko"
+
+#~ msgid "Internet"
+#~ msgstr "Interreto"
+
+#, fuzzy
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Dialup"
+#~ msgstr "Telefonkonversacio"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Email"
+#~ msgstr "Retpoŝto"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Feed"
+#~ msgstr "Abonrilato"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "File Transfer"
+#~ msgstr "Dosiertransigo"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Ham Radio"
+#~ msgstr "Amatora radio"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Instant Messaging"
+#~ msgstr "Tujmesaĝado"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "IRC Clients"
+#~ msgstr "IRC-klientoj"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Monitor"
+#~ msgstr "Monitoro"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "P2P"
+#~ msgstr "P2P"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Remote Access"
+#~ msgstr "Defora aliro"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Telephony"
+#~ msgstr "Telefonio"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Web Development"
+#~ msgstr "Reta disvolvo"
+
+#~ msgid "Office"
+#~ msgstr "Oficejo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Chart"
+#~ msgstr "Diagramo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Contact Management"
+#~ msgstr "Kontakto-mastrumado"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Dictionary"
+#~ msgstr "Vortaro"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Email"
+#~ msgstr "Retpoŝto"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Flow Chart"
+#~ msgstr "Fludiagramo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "PDA"
+#~ msgstr "Poŝkomputilo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Photography"
+#~ msgstr "Fotografio"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Project Management"
+#~ msgstr "Projekto-administrado"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Publishing"
+#~ msgstr "Eldonado"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Spreadsheet"
+#~ msgstr "Tabelkalkulilo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Viewer"
+#~ msgstr "Vidigilo"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Art"
+#~ msgstr "Arto"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Artificial Intelligence"
+#~ msgstr "Artefarita intelekto"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Astronomy"
+#~ msgstr "Astronomio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Biology"
+#~ msgstr "Biologio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Chemistry"
+#~ msgstr "Kemio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Computer Science"
+#~ msgstr "Komputila scienco"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Construction"
+#~ msgstr "Konstruado"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Data Visualization"
+#~ msgstr "Datumo-bildigo"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Economy"
+#~ msgstr "Ekonomio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Electricity"
+#~ msgstr "Elektro"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Electronics"
+#~ msgstr "Elektroniko"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Engineering"
+#~ msgstr "Inĝenierado"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Geography"
+#~ msgstr "Geografio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Geology"
+#~ msgstr "Geologio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Geoscience"
+#~ msgstr "Terscienco"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "History"
+#~ msgstr "Historio"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Humanities"
+#~ msgstr "Homsciencoj"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Image Processing"
+#~ msgstr "Bilda prilaborado"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Languages"
+#~ msgstr "Lingvoj"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Literature"
+#~ msgstr "Literaturo"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Maps"
+#~ msgstr "Mapoj"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Math"
+#~ msgstr "Matematiko"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Medical"
+#~ msgstr "Medicina"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Nombra analitiko"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Parallel Computing"
+#~ msgstr "Paralela komputado"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Physics"
+#~ msgstr "Fiziko"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Robotics"
+#~ msgstr "Robotiko"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Spirituality"
+#~ msgstr "Spiriteco"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Sports"
+#~ msgstr "Sportoj"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Emulator"
+#~ msgstr "Imitilo"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "File Manager"
+#~ msgstr "Dosiera administrilo"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "File Tools"
+#~ msgstr "Iloj por dosieroj"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Monitor"
+#~ msgstr "Monitoro"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Security"
+#~ msgstr "Sekureco"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Terminal Emulator"
+#~ msgstr "Terminalimitilo"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Accessibility"
+#~ msgstr "Alirebleco"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Archiving"
+#~ msgstr "Arkivado"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Calculator"
+#~ msgstr "Kalkulilo"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Clock"
+#~ msgstr "Horloĝo"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Compression"
+#~ msgstr "Densigo"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "File Tools"
+#~ msgstr "Iloj por dosieroj"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Maps"
+#~ msgstr "Mapoj"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Spirituality"
+#~ msgstr "Spiriteco"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Telephony Tools"
+#~ msgstr "Telefoniaj iloj"
+
+#~ msgid "Video"
+#~ msgstr "Video"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Editing"
+#~ msgstr "Redaktado"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Database"
+#~ msgstr "Datumbazo"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Disc Burning"
+#~ msgstr "Diska registrado"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Players"
+#~ msgstr "Ludiloj"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Recorders"
+#~ msgstr "Registriloj"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "TV"
+#~ msgstr "Televido"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..b1a86e1
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,7528 @@
+# 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 <rodhos92@gmail.com>, 2018.
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2013-2021.
+# germe <FOSSgerme.deb@tuta.io>, 2021.
+# Daniel Mustieles García <daniel.mustieles@gmail.com>, 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: 2022-09-01 14:01+0000\n"
+"PO-Revision-Date: 2022-09-05 14:30+0200\n"
+"Last-Translator: Daniel Mustieles García <daniel.mustieles@gmail.com>\n"
+"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\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 42.0\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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "El proyecto GNOME"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "La puntuación mínima de karma para las opiniones"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Permitir acceso al diálogo de repositorios de software"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Ofrece actualizaciones para publicaciones preliminares"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://es.wikipedia.org/wiki/Software_propietario'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Calificación por edad"
+
+#: 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 "Cómo añadir la información que falta"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Paquete"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pendiente"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalación pendiente"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Eliminación pendiente"
+
+#: 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 "Instalado"
+
+#. 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 "Instalando"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Quitando"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstalar"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Red"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Se puede comunicar a través de la red"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Servicios del sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Servicios de la sesión"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Puede acceder a los archivos de dispositivos del sistema"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Carpeta personal"
+
+#: 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 "Puede ver, editar y crear archivos"
+
+#: 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 "Puede ver archivos"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Carpeta de descargas"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Configuración"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Puede ver y modificar cualquier configuración"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema de visualización heredado"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa un sistema de visualización antiguo e inseguro"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Salir del aislamiento"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Puede salir del aislamiento y evitar otras restricciones"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detalles de la actualización"
+
+#. 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 "No hay ninguna descripción disponible sobre la actualización."
+
+#: 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 "Retroceder"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Necesita permisos adicionales"
+
+#. 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 "Opiniones"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "No se han encontrado opiniones para esa aplicación."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "No hay opiniones"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Histórico de versiones"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nuevo en la versión %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versión %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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: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 "Show verbose debugging information"
+msgstr "Mostrar información de depuración detallada"
+
+#: 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 update preferences"
+msgstr "Mostrar las preferencias de las actualizaciones"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 colaboradores de GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Daniel Mustieles <daniel.mustieles@gmail.com>, 2013-2021"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Acerca de Software"
+
+#. 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 "Una buena manera de gestionar el software en su sistema."
+
+#. 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 "No hay detalles para esa aplicación."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Puede acceder a archivos arbitrarios"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Puede obtener permisos arbitrarios"
+
+#. 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 "Revisado por su distribución"
+
+#. 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 "Proporcionado por un tercero"
+
+#. 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 "Código propietario"
+
+#. 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 "Código auditable"
+
+#. 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 "El desarrollador del software está verificado"
+
+#. 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 "Software no soportado"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "No seguro"
+
+#: 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 "Sólo para móvil"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Sólo funciona en pantallas pequeñas"
+
+#: 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 "Sólo para escritorio"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Sólo funciona en pantallas grandes"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "El tamaño de la pantalla no coincide"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "No soporta su tamaño de pantalla actual"
+
+#: 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 "Requiere una pantalla táctil"
+
+#: 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 "Requiere un teclado"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requiere un ratón"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Se necesita un mando de juego"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptativo"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funciona en móviles, tabletas y escritorios"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probablemente requiera un teclado o un ratón"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "No contiene contenido inapropiado por edad"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visitar la página 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:159
+msgid "Install…"
+msgstr "Instalar…"
+
+#. 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 "Cancelar"
+
+#. 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 "Instalar"
+
+#. 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 "Actualizar"
+
+#. 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 "Desinstalar"
+
+#. 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 "Desinstalando"
+
+#. 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 "No se puede usar el dispositivo durante la actualización."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renombrado desde %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ayudar a traducir %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 está diseñado, desarrollado y traducido por una comunidad 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:5
+msgid "Translations"
+msgstr "Traducciones"
+
+#: src/gs-app-translation-dialog.ui:92
+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:82
+#, 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:13
+msgid "Login Required"
+msgstr "Se necesita iniciar sesión"
+
+#: 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 "_Cancelar"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "Iniciar _sesión"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Usuario"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Contraseña"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nuevo y actualizado"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Otro software"
+
+#. 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 "Introduzca un número entre 1 y %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Elija una aplicación:"
+
+#: 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 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 se ha instalado correctamente"
+
+#. 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 "Se debe reiniciar para aplicar los cambios."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Se han instalado las actualizaciones del sistema"
+
+#. 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 ""
+"Las actualizaciones instaladas recientemente están disponibles para su "
+"revisión"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Lanzar"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "¿Instalar software de terceros?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "¿Activar el repositorio de software de terceros?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s no es <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">software libre</a>, lo proporciona «%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 lo proporciona «%s»."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "No advertir otra vez"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Los errores detallados del gestor de paquetes son:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalles"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Aceptar"
+
+#. 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] "Se ha instalado una actualización"
+msgstr[1] "Se han instalado las actualizaciones"
+
+#. 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] "Se ha eliminado una aplicación"
+msgstr[1] "Se han eliminado aplicaciones"
+
+#. 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] "Se debe reiniciar para aplicar el cambio."
+msgstr[1] "Se debe reiniciar para aplicar los cambios."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Ahora no"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Ahora mismo"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "hace %d hora"
+msgstr[1] "hace %d horas"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "hace %d año"
+msgstr[1] "hace %d años"
+
+#. 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Buscar en Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostrar más"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostrar menos"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Quitando…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Requiere reiniciar para terminar la instalación"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Actualización pendiente…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparando…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Desinstalando…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalar"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Reiniciar"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Instalar…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Otras aplicaciones por %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "Necesita acceso a Internet para escribir una opinión"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "No se pudo encontrar «%s»"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Página de detalles"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Cargando detalles de la aplicación…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Ayudar a _traducir"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Abrir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Actualizar"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Descargando"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Complementos"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Los complementos seleccionados se instalarán con la aplicación."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Repositorio de software incluido"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Ningún repositorio de software incluido"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Repositorio de software identificado"
+
+#: src/gs-details-page.ui:642
+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:643
+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:708
+msgid "No Metadata"
+msgstr "No hay metadatos"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Página _web del proyecto"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donar"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Colaborar con las traducciones"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "Infor_mar de un problema"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "Ay_uda"
+
+#. 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 "_Escribir una opinión"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Todas las opiniones"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Tipografías disponibles para el script %s"
+msgstr[1] "Tipografías disponibles para los scripts %s"
+
+#. 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] "Software disponible para %s"
+msgstr[1] "Software disponible para %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Software solicitado no encontrado"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s no encontrada"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "en la página 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"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 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 "No hay aplicaciones disponibles para soportar %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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Falló al buscar cualquier resultado: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "formato de archivo %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "No se pudo encontrar el software solicitado"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Página de codificadores"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Soporte de escritorio"
+
+#: 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 "Soporta el uso en pantallas grandes"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Soporte de escritorio desconocido"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requiere una pantalla grande"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Escritorio no soportado"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "No se puede usar en una pantalla grande"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Soporte de móvil"
+
+#: 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 "Soporta el uso en pantallas pequeñas"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Soporte de móvil desconocido"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requiere una pantalla pequeña"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Móvil no soportado"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "No se puede usar en pantallas pequeñas"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Soporte de teclado"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Soporte de teclado desconocido"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Se requiere un teclado"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Soporta un teclado"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Teclado no soportado"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "No se puede usar con un teclado"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Soporte de ratón"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requiere un ratón o un dispositivo apuntador"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Soporte de ratón desconocido"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Se necesita un ratón"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Soporta ratón y dispositivos apuntadores"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Ratón no soportado"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Soporte de pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Soporte de pantalla táctil desconocido"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Se necesita una pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Soporta pantallas táctiles"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Pantalla táctil no soportada"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "No se puede usar con una pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Se necesita un mando de juego"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Necesita un mando para jugar"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Soporte de mandos de juego"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s funciona 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Soporte de hardware"
+
+#. 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 "Instalado"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Página de instalados"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicaciones"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicaciones web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicaciones del sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Construido por la comunidad"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Este software lo desarrolla una comunidad abierta de voluntarios y se "
+"publica bajo la licencia <a href=\"%s\">%s</a>.\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: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 ""
+"Este software lo desarrolla una comunidad abierta de voluntarios y se "
+"publica bajo la licencia %s.\n"
+"\n"
+"Puede colaborar y ayudar a hacerlo aún mejor."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Propietario"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Aprender más"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Descargando catálogo de software"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Cargando página"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Iniciando…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Actualizaciones automáticas pausadas"
+
+#: 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 ""
+"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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Abrir la _configuración de la red"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderar página"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "No hay opiniones que moderar"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Usuario"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Añadidos"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Eliminados"
+
+#. 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 "Actualizaciones"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Bajadas de versión"
+
+#. 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 "fuentes externas seleccionadas"
+
+#. 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 ""
+"Proporciona acceso a software adicional desde %s. Se incluye algún software "
+"propietario."
+
+#. 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 "Activar"
+
+#. 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 "Explorar"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Página de vista general"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "¿Activar el repositorio de software de terceros?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Otras categorías"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "No se han encontrado datos sobre las aplicaciones"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "El usuario ha rechazado la instalación"
+
+#. 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 "Preparar %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 "¿Está seguro de querer quitar el repositorio %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "¿Seguro que quiere desinstalar %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 ""
+"Se desinstalará %s y deberá volver a instalarlo para poder usarlo de nuevo."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferencias de las actualizaciones"
+
+#: 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 ""
+"Para evitar cargos y limitaciones de la red, las actualizaciones de software "
+"automáticas están desactivadas en conexiones móviles o medidas."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Actualizaciones automáticas"
+
+#: src/gs-prefs-dialog.ui:20
+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."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificaciones de actualizaciones automáticas"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostrar notificaciones cuando las actualizaciones se instalen "
+"automáticamente."
+
+#. 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 ""
+"Alguno de los programas instalados no es compatible con %s. Si continúa, los "
+"siguientes paquetes se eliminarán automáticamente durante la actualización:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software incompatible"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continuar"
+
+#. 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 "El software instalado desde «%s» ya no recibirá actualizaciones."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "¿Quiere desactivar el repositorio?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Quitar"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Activar repositorios nuevos"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Repositorios adicionales de terceras partes. — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Estos repositorios complementan el software predeterminado proporcionado por "
+"%s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repositorios de software"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "No hay repositorios"
+
+#. 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 aplicación instalada"
+msgstr[1] "%u aplicaciones instaladas"
+
+#. 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 complemento instalado"
+msgstr[1] "%u complementos instalados"
+
+#. 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 aplicación"
+msgstr[1] "%u aplicaciones"
+
+#. 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 complemento"
+msgstr[1] "%u complementos"
+
+#. 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 y %s instalado"
+msgstr[1] "%s y %s instalados"
+
+#. 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 "La odio"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "No me gusta"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Está bien"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Me gusta"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Me encanta"
+
+#. 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 "Dedique un poco más de tiempo a escribir la opinión"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Elija una puntuación"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "El resumen es demasiado corto"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "El resumen es demasiado largo"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La descripción es demasiado corta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publicar opinión"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Publicar"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Puntuación"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resumen"
+
+#: src/gs-review-dialog.ui:97
+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»."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Opinión"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Conozca qué datos se envían en nuestra <a href=\"https://odrs.gnome.org/"
+"privacy\">política de privacidad</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "¿Informar sobre esta opinión?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Informar"
+
+#. 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 "¿Le ha resultado útil esta opinión?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sí"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "No"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Bah"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Informar…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Quitar…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Compruebe que confía en el vendedor ya que la aplicación no está aislada"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Sin permisos"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Acceso a la red"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Sin acceso a la red"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa servicios del sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa servicios de la sesión"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Acceso al dispositivo"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Sin acceso al dispositivo"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Acceso completo de lectura/escritura al sistema de archivos"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Acceso de lectura/escritura a la carpeta de inicio"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Acceso de lectura a todo el sistema de archivos"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Acceso de lectura a la carpeta de inicio del usuario"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Acceso de lectura/escritura a la carpeta de descargas"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Acceso de lectura a la carpeta de descargas"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Sin acceso al sistema de archivos del sistema"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "No puede acceder al 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:341
+msgid "Proprietary Code"
+msgstr "Código propietario"
+
+#: 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 ""
+"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: 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 "Código auditable"
+
+#: 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 ""
+"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: 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 "El desarrollador de la aplicación está verificado"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependencias no seguras"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 es seguro"
+
+#. 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 es potencialmente inseguro"
+
+#. 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 no es seguro"
+
+#. 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 "Seguridad"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Fuente"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versión de SDK obsoleta"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "No se ha proporcionado una captura de pantalla"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Captura de pantalla no encontrada"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Captura de pantalla no válida"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Página de búsqueda"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Buscar aplicaciones"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "No se pueden descargar las actualizaciones 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "No se pueden descargar las actualizaciones"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+"No se pueden descargar las actualizaciones: no hay suficiente espacio en "
+"disco"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "No se pueden descargar actualizaciones: se necesita autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "No se pueden descargar actualizaciones: la autenticación no es válida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "No se puede obtener la lista de actualizaciones"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "No se puede instalar %s ya que ha fallado la descarga de %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "No se puede instalar %s ya que ha fallado la descarga"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"No se puede instalar %s ya que la rutina de tiempo de ejecución %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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "No se puede instalar %s ya que no está soportado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"No se puede instalar: se necesita acceso a Internet, pero no está disponible"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "No se puede instalar %s: la aplicación no tiene un formato válido"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "No se puede instalar %s: no hay suficiente espacio en disco."
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "No se puede instalar %s: se necesita autorización"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "No se puede instalar %s: la autenticación no es válida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "No se puede instalar %s: se necesita conexión a la alimentación"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "No se puede instalar %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "No se puede actualizar %s desde %s ya que ha fallado la descarga"
+
+#. 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 update %s as download failed"
+msgstr "No se puede actualizar %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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"No se pueden instalar las actualizaciones desde %s ya que ha fallado la "
+"descarga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"No se pueden instalar las actualizaciones ya que ha fallado la descarga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"No se puede actualizar: se necesita acceso a Internet, pero 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:1527
+#, 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
+#: src/gs-shell.c:1532
+#, 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."
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "No se puede actualizar %s: se necesita autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "No se pueden instalar las actualizaciones: se necesita autorización"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "No se puede actualizar %s: la autenticación no es válida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"No se pueden instalar las actualizaciones: la autenticación no es válida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "No se puede actualizar %s: se necesita conexión a la alimentación"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "No se pueden instalar las actualizaciones"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "No se puede actualizar a %s ya que falló la descarga"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: 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 distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "No se puede actualizar a %s: se necesita 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "No se puede actualizar a %s: la autenticación no es 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:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "No se puede actualizar a %s: se necesita conexión a la alimentación"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "No se puede actualizar a %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "No se puede quitar %s: se necesita autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "No se puede quitar %s: la autenticación no es válida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "No se puede quitar «%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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — 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 failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Algo salió mal"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Falló al instalar el archivo: no está soportado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Falló al instalar el archivo: falló la autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Falló al instalar: no está soportado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Falló al instalar: falló la autenticación"
+
+#. 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 "No se puede contactar con %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Se debe reiniciar Software para usar los complementos nuevos."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Se necesita conexión a la alimentación"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "El nivel de la batería es muy bajo"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Repositorios de _software"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Actualizar preferencias"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examinar disco"
+
+#. 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 "Configuración de la red"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reiniciar ahora"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Más información"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Buscar"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menú primario"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Saber _más"
+
+#. 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 "Actualizaciones"
+
+#. 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 "Application Data"
+msgstr "Datos de la aplicación"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application to run"
+msgstr "Datos necesario 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 application"
+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 application 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 application"
+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: 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 "Almacenamiento"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Los datos de la caché se pueden limpiar desde la <a href=\"dummy"
+"\">configuración de la _aplicación</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalada)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instalando)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Quitando)"
+
+#. 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 "Actualizaciones instaladas"
+
+#. 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 "Instaladas en %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "No se han instalado actualizaciones"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Las actualizaciones de software están caducadas"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Compruebe las actualizaciones de software."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Actualización de software crítica lista para instalar"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Hay una actualización de software importante lista para instalar."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Actualización de software críticas listas para instalar"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Importante: hay actualizaciones de software críticas esperando."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Actualizaciones de software listas para instalar"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr ""
+"Las actualizaciones de software están esperando, listas para instalarlas."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Actualizaciones de software disponibles para descargar"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Descargue las actualizaciones de software pendientes."
+
+#. 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 aplicación actualizada — se necesita reiniciar"
+msgstr[1] "%u aplicaciones actualizadas — se necesita reiniciar"
+
+#. 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 aplicación actualizada"
+msgstr[1] "%u aplicaciones actualizada"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s se ha actualizado."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Reinicie la aplicación."
+
+#. 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 y %s se han actualizado."
+
+#. 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 aplicación necesita reiniciar."
+msgstr[1] "%u aplicaciones necesitan reiniciar."
+
+#. 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 "Incluye %s, %s y %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 "Actualizaciones del sistema operativo no disponibles"
+
+#. 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 "Suba de versión para seguir recibiendo actualizaciones de seguridad"
+
+#. 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 "Hay una versión nueva de %s disponible para instalar"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Actualización de software disponible"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Falló la actualización de software"
+
+#. 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 "Falló al instalar una actualización importante del sistema operativo."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostrar detalles"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Revisar"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Comprobada por última vez: %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 ya no está soportado."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Su sistema operativo ya no está soportado."
+
+#. 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 "Esto significa que no recibe actualizaciones de seguridad."
+
+#. 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 "Se recomienda que actualice a una versión más reciente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Puede conllevar gastos adicionales"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Comprob_ar de todas formas"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Sin red"
+
+#. 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 "Se necesita acceso a Internet para comprobar si hay actualizaciones."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Comprobar si hay actualizaciones"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Actualizaciones"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Página de actualizaciones"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Cargando actualizaciones…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Actualizados"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "¿Usar datos móviles?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Comprobar de todas formas"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "No hay conexión"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Conectarse para comprobar si hay actualizaciones."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Configuración de la _red"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Error"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Las actualizaciones se gestionan automáticamente."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reiniciar y actualizar"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Actualizar todo"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Actualizaciones de aplicaciones"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware del dispositivo"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponible"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Aprender sobre la nueva versión"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Descargando…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% descargado"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reiniciar y actualizar"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr ""
+"Recuerde hacer un respaldo de sus datos y archivos antes de actualizar."
+
+#: 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 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 ""
+"Actualizaciones;Actualizar;Fuentes;Repositorios:Preferencias;Instalar;"
+"Desinstalar;Programa;Software;App;Almacén;"
+
+#. 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 "Actualizaciones del sistema"
+
+#. 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 ""
+"Actualizaciones generales del sistema, tales como correcciones de seguridad "
+"o de errores y mejoras del rendimiento."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Descargando imágenes destacadas…"
+
+#. 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 "Una actualización de %s, con características nuevas y correcciones."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Descargando información de actualizaciones…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications on Linux"
+msgstr ""
+"Flatpak es un entorno de desarrollo para aplicaciones de escritorio en Linux"
+
+#. 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 "Carpeta %s del sistema"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subcarpeta %s de la carpeta personal"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Carpetas personal del sistema del equipo"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuración del sistema del equipo de /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Carpeta Escritorio"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subcarpeta %s de Escritorio"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Carpeta Documentos"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subcarpeta %s de Documentos"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Carpeta Música"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subcarpeta %s de Música"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Carpeta Imágenes"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subcarpeta %s de Imágenes"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Carpeta Público"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subcarpeta %s de Público"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Carpeta Vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subcarpeta %s de Vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Carpeta Plantillas"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Subcarpeta %s de Plantillas"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Carpeta de caché del usuario"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subcarpeta %s de caché de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Carpeta de configuración del usuario"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subcarpeta %s de configuración del usuario"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Carpeta de datos de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subcarpeta %s de datos de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Carpeta de tiempo de ejecución del usuario"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subcarpeta %s de tiempo de ejecución del usuario"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Obteniendo metadatos flatpak para %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Actualizar TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Actualizar receptor USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "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:148
+msgid "Install Unsigned Software?"
+msgstr "¿Instalar software sin firmar?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "¿Descargar software sin firmar?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "¿Actualizar software sin firmar?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paquetes"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "sistema"
+
+#~ 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 "Remove"
+#~ msgstr "Eliminar"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "No hay repositorios adicionales"
+
+#~ msgid "_Enable"
+#~ msgstr "Ac_tivar"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Quitar…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Desactivar…"
+
+#~ msgid "Disabling"
+#~ msgstr "Desactivar"
+
+#~ msgid "Enabled"
+#~ msgstr "Activado"
+
+#~ msgid "Disabled"
+#~ msgstr "Desactivado"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Barra lateral de navegación"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Reiniciar ahora"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s listo para instalar"
+
+#~ 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 "Reference"
+#~ msgstr "Referencia"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Licencia de software desconocida"
+
+#~ 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 "_Installed"
+#~ msgstr "_Instalado"
+
+#~ msgid "_Updates"
+#~ msgstr "_Actualizaciones"
+
+#~ 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, %R"
+#~ msgstr "Ayer, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Falló al guardar el archivo"
+
+#~ 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 "App ID"
+#~ msgstr "ID de la aplicación"
+
+#~ 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 "Delete Design"
+#~ msgstr "Eliminar diseño"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Actualización del SO"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "No se puede obtener %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "He olvidado mi contraseña"
+
+#~ 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 "U_pdate All"
+#~ msgstr "Act_ualizar todo"
+
+#~ 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 "_Install All"
+#~ msgstr "_Instalar todas"
+
+#~ 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 "web app"
+#~ msgstr "aplicación web"
+
+#~ 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 "The update could not be completed."
+#~ msgstr "No se pudo completar la actualización."
+
+#~ 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 "No sources found."
+#~ msgstr "No se han encontrado fuentes."
+
+#~ msgid "OK"
+#~ msgstr "Aceptar"
+
+#~ 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..5856fb0
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,6027 @@
+# 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 <dooteo@zundan.com>, 2014, 2015, 2017.
+# Ibai Oihanguren Sala <ibai@oihanguren.com>, 2020.
+# Asier Sarasua Garmendia <asiersarasua@ni.eus>, 2019, 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: 2022-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-08-31 16:00+0100\n"
+"Last-Translator: Asier Sarasua Garmendia <asiersarasua@ni.eus>\n"
+"Language-Team: Basque <librezale@librezale.eus>\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:21
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+msgstr "'Software' aplikazioak aplikazio berriak eta sistemaren hedapenak bilatzea eta instalatzea, edo eta instalatutako aplikazioak kentzea, baimentzen dizu."
+
+#: 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 "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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME proiektua"
+
+#: 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 "Neurtutako konexio 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 neurtutako konexio 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 last timestamp when the system was online and got any updates"
+msgstr "Sistema linean egon zen eta eguneratzeak jaso zituen azken unearen data-zigilua"
+
+#: data/org.gnome.software.gschema.xml:71
+msgid "The age in seconds to verify the upstream screenshot is still valid"
+msgstr "Adina segundotan pantaila-argazkia oraindik baliozkoa den egiaztatzeko"
+
+#: 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 "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:81
+msgid "The server to use for application reviews"
+msgstr "Aplikazioen berrikuspenetan erabiliko den zerbitzaria"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Gutxieneko karmaren puntuazioa iritzietan"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Baimendu software-biltegien elkarrizketa-koadroa atzitzea"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Eskaini aurre-argitalpenen bertsio-berritzea"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+msgid "Show the installed size for apps in the list of installed applications"
+msgstr "Erakutsi aplikazioen instalatutako tamaina instalatutako aplikazioen zerrendan"
+
+#. 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://eu.wikipedia.org/wiki/Software_jabedun'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 "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: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 "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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Softwaren sistema osorako AppStream instalatzailea"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Balorazioa adinaren arabera"
+
+#: 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 "Nola lagundu falta den informazioarekin"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Paketea"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Zain"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalazioaren zain"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Kentzearen zain"
+
+#: 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 "Instalatua"
+
+#. 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 "Instalatzen"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Kentzen"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstalatu"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Sarea"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Sarean zehar komunikatu daiteke"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Sistema-zerbitzuak"
+
+#: src/gs-app-details-page.c:69
+msgid "Can access D-Bus services on the system bus"
+msgstr "Sistemako bus-aren D-Bus zerbitzuak atzi ditzake"
+
+#: src/gs-app-details-page.c:70
+msgid "Session Services"
+msgstr "Saio-zerbitzuak"
+
+#: src/gs-app-details-page.c:70
+msgid "Can access D-Bus services on the session bus"
+msgstr "Saioko bus-aren D-Bus zerbitzuak atzi ditzake"
+
+#: src/gs-app-details-page.c:71
+msgid "Devices"
+msgstr "Gailuak"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Sistemaren gailu-fitxategiak atzi ditzake"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Karpeta nagusia"
+
+#: 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 "Fitxategiak ikusi, editatu eta sortu ditzake"
+
+#: 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 "Fitxategiak ikusi ditzake"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Deskargen karpeta"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Ezarpenak"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Edozein ezarpen ikusi eta aldatu dezake"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Bistaratze-sistema zaharra"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Bistaratze-sistema zaharra eta segurtasun gutxikoa darabil"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Egin ihes isolamendutik"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Isolamendutik ihes egin dezake eta beste muga batzuk saihestu ditzake"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Eguneratzearen xehetasunak"
+
+#. 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 "Ez dago eguneratzearen azalpenik eskuragarri."
+
+#: 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 "Joan atzera"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Baimen gehiago behar ditu"
+
+#. 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 "Berrikuspenak"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Ez da berrikuspenik aurkitu aplikazio honetarako."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Ez dago berrikuspenik"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Bertsioen historia"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Berria %s bertsioan"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "%s bertsioa"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Erakutsi metainfo edo appdata fitxategi lokal bat"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Erakutsi arazketaren informazio xehea"
+
+#: 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 update preferences"
+msgstr "Erakutsi eguneratzeen 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 GNOME Software laguntzaileak"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "translator-credits"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Software aplikazioari buruz"
+
+#. 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 "Sisteman softwarea kudeatzeko modu dotorea."
+
+#. 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 "Barkatu! Ez dago xehetasunik aplikazio horretarako."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Hardware-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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Fitxategiak ausaz 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Ausazko baimenak eskuratu ditzake"
+
+#. 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 "Zure banaketak berrikusia"
+
+#. 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 "Hirugarren batek eskainia"
+
+#. 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 "Kode jabeduna"
+
+#. 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 "Kode ikuskagarria"
+
+#. 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 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 "Software hau ez da mantentzen jadanik"
+
+#. 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 "Segurua"
+
+#. 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 "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:481
+msgid "Unsafe"
+msgstr "Arriskutsua"
+
+#: 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 "Mugikorra soilik"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Pantaila txikietan soilik funtzionatzen du"
+
+#: 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 "Mahaigaina soilik"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Pantaila handi batean soilik funtzionatzen du"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Pantaila-tamaina ez dator bat"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Ez du zure uneko pantaila-tamaina onartzen"
+
+#: 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 "Ukipen-pantaila behar du"
+
+#: 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 "Teklatua behar du"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Sagua behar du"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Joko-agintea behar du"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Moldakorra"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Telefonoetan, tabletetan eta mahaigainetan funtzionatzen du"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Ziur aski teklatua edo sagua beharko du"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Ez dauka adinagatik desegokia izan daitekeen edukirik"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Bisitatu webgunea"
+
+#. 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 "Instalatu…"
+
+#. 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 "Utzi"
+
+#. 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 "Instalatu"
+
+#. 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 "Eguneratu"
+
+#. 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 "Desinstalatu"
+
+#. 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 "Desinstalatzen"
+
+#. 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 "Gailua ezin da eguneratzean erabili."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Izena aldatu da, aurreko izena: %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Lagundu %s itzultzen"
+
+#. 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 nazioarteko boluntarioen 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:5
+msgid "Translations"
+msgstr "Itzulpenak"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Itzulpenen webgunea"
+
+#. 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 "Saioa hasteko urreneko %s (%s domeinua) behar da"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Saioa hasi behar da"
+
+#: 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 "_Utzi"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Saio-hasiera"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Erabiltzailea"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Pasahitza"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Berria eta eguneratua"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+msgid "Picks from the Web"
+msgstr "Webean hautatuak"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:125
+msgid "Other Software"
+msgstr "Bestelako softwarea"
+
+#. 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 "Sartu zenbakia 1 eta %u artean: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Aukeratu aplikazio bat:"
+
+#: 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 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' instalatuta dago orain"
+
+#. 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 "Berrabiarazi egin behar da aldaketek eragina izateko."
+
+#. 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 "Aplikazioa erabiltzeko prest dago."
+
+#. 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 "Sistemaren eguneratzeak instalatu dira jadanik"
+
+#. 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 "Azken aldian instalatuta eguneratzeak eskuragarri daude berrikusteko"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Berrabiarazi"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Abiarazi"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalatu hirugarrenen softwarea?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Gaitu hirugarrenen software-biltegia?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr "'%s' ez da <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">software librea eta iturburu irekikoa</a>, eta \"%s”(e)k hornitzen du."
+
+#. 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 - hornitzailea: %s."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Ez abisatu berriro"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Pakete-kudeatzaileak emandako erroreen xehetasunak:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Xehetasunak"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Onartu"
+
+#. 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] "Eguneratze bat instalatu da"
+msgstr[1] "Eguneratzeak instalatu dira"
+
+#. 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] "Aplikazio bat kendu da"
+msgstr[1] "Aplikazio bat"
+
+#. 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] "Sistema berrabiarazi behar da aldaketak eragina izateko."
+msgstr[1] "Berrabiaraztea eskatzen du hauek eragina izateko."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Orain ez"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Orain"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "Duela ordu %d"
+msgstr[1] "Duela %d ordu"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "Duela urte %d"
+msgstr[1] "Duela %d urte"
+
+#. 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:1246
+#, 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 "Aplikazio bat"
+
+#. 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:332
+msgid "Find in Software"
+msgstr "Bilatu softwarean"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Erakutsi g_ehiago"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Erakutsi g_utxiago"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Kentzen…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Berrabiarazi behar da instalazioa amaitzeko"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Zain dagoen eguneratzea…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Prestatzen…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Desinstalatzen…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalatu"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Berrabiarazi"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Instalatu…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "%s hornitzailearen beste aplikazio batzuk"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Interneterako sarbidea behar duzu iritzia idazteko"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Ezin da \"%s” aurkitu"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Xehetasunen orria"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Aplikazioaren xehetasunak kargatzen…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Lagundu it_zultzen"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Ireki"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Eguneratu"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Deskargatzen"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Gehigarriak"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Hautatutako gehigarriak aplikazioarekin instalatuko dira."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Software-biltegia sartu da"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Ez da software-biltegia sartu"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr "Aplikazio honek ez du software-biltegirik sartzen. Ez da eguneratuko bertsio berriak daudenean."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Software-biltegia identifikatu da"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Erabili zuretzat fidagarriak diren software-biltegiak soilik."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Metadaturik ez"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Proiektuaren _webgunea"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Eman dirua"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Lagundu it_zultzen"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Jakinarazi akatsa"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Laguntza"
+
+#. 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 "Idat_zi berrikuspena"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Berrikuspen guztiak"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "'%s' scriptaren letra-tipo eskuragarriak"
+msgstr[1] "'%s' scripten letra-tipo eskuragarriak"
+
+#. 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] "Softwarea eskuragarri '%s'(r)entzako"
+msgstr[1] "Softwarea eskuragarri '%s'(r)entzako"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Eskatutako softwarea ez da aurkitu"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s ez da aurkitu"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "webgunean"
+
+#. 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 "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: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 "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 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 "Ez dago aplikaziorik eskuragarri '%s' euskarriarentzako."
+
+#. 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' 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: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 "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 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 "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:402
+#, 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 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 "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: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 "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 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 "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:424
+#, 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 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 "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: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 "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:481
+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 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] "Bilatutako %s kodeka ez da aurkitu %s aplikaziorako. Ikusi %s xehetasun gehiagorako."
+msgstr[1] "Bilatutako %s kodeka ez da aurkitu %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: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] "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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Huts egin du bilaketa-emaitzak aurkitzeak: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "'%s' fitxategi-formatua"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Ezin da eskatutako softwarea aurkitu"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kodeken orria"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Mahaiganeko euskarria"
+
+#: 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 "Pantaila handian erabilitako euskarriak"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Mahaigaineko euskarri ezezaguna"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Pantaila handia behar du"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Mahaigaina ez da onartzen"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Ezin da pantaila handian erabili"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mugikorretako euskarria"
+
+#: 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 "Pantaila txikian erabilitako euskarriak"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mugikorretako euskarri ezezaguna"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Pantaila txikia behar du"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mugikorrak ez dira onartzen"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Ezin da pantaila txikian erabili"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Teklatuen euskarria"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Teklatuen euskarri ezezaguna"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Teklatua behar da"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Teklatuak onartzen ditu"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Teklatua ez da onartzen"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Ezin da erabili teklaturik gabe"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Saguen euskarria"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Sagua edo gailu erakuslea behar du"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Saguen euskarri ezezaguna"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Sagua behar da"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Saguak eta gailu erakusleak onartzen ditu"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Sagua ez da onartzen"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Ukipen-pantailen euskarria"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Ukipen-pantailen euskarri ezezaguna"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Ukipen-pantaila behar da"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Ukipen-pantailak onartzen ditu"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Ez ditu ukipen-pantailak onartzen"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Ezin da erabili ukipen-pantailarekin"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Joko-agintea behar da"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Joko-agintea behar du"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Joko-aginteen euskarria"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s badabil 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hardware-euskarria"
+
+#. 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 "Instalatua"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Instalatutakoen orria"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplikazioak"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Web aplikazioak"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Sistemaren aplikazioak"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Komunitateak eraikia"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr "Software hau boluntarioen komunitate batek eraiki du modu irekian eta <a href=\"%s\">%s lizentziarekin</a> 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: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 "Software hau boluntarioen komunitate batek eraiki du modu irekian eta %s lizentziarekin askatu du.\n"
+"\n"
+"Hura hobetzen lagundu dezakezu nahi baduzu."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Jabeduna"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Ikasi gehiago"
+
+#: 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 "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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Software-katalogoa deskargatzen"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Orria kargatzen"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Abiarazten…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Eguneratze automatikoak pausatu dira"
+
+#: 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 "Uneko sarea neurtutakoa da. Neurtutako konexioek datu-mugak dituzte edo diru gehiago ordaindu behar da haietan. Datuak aurrezteko, eguneratze automatikoak pausatu egin dira.\n"
+"\n"
+"Neurtu gabeko sare bat eskuragarri dagoenean berrekingo zaie eguneratze automatikoei. Ordura arte, hala ere, posible da eguneratzeak eskuz instalatzea.\n"
+"\n"
+"Uneko sarea gaizki identifikatu bada eta neurtutakotzat hartu bada, ezarpen hau aldatu egin daiteke."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Ireki sareko _ezarpenak"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderatu orria"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Ez dago berrikuspenik moderatzeko"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Erabiltzailea"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Gehitutakoak"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Kendutakoak"
+
+#. 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 "Eguneratzeak"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Aurreko bertsiora itzulitakoak"
+
+#. 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 "hautatutako kanpoko iturburuak"
+
+#. 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 "%s iturburuko software gehigarria atzitzeko aukera ematen du. Jabedun zenbait software ere badago hor."
+
+#. 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 "Gaitu"
+
+#. 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 "Arakatu"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Ikuspegi orokorraren orria"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Gaitu hirugarrenen software-biltegiak?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Beste kategoria batzuk"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Ez da aplikazioaren daturik aurkitu"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Erabiltzaileak baztertutako instalazioa"
+
+#. 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 "Prestatu %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 "Ziur zaude %s biltegia kendu nahi duzula?"
+
+#. 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 "%s biltegiko aplikazio guztiak desinstalatuko dira, eta biltegia berriro instalatu beharko da horiek berriro erabiltzeko."
+
+#. 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 "Ziur zaude %s desinstalatu nahi duzula?"
+
+#. 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 desinstalatu egingo da, eta instalatu egin beharko da berriro erabiltzeko."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Eguneratze-hobespenak"
+
+#: 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 "Aldaketak eta sarearen mugak saihesteko, software-eguneratzeak ez dira automatikoki deskargatzen konexio mugikorretan edo neurtuetan."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Eguneratze automatikoak"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Software-eguneratzeak atzeko planoak deskargatzen eta instalatzen ditu, posible bada."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Eguneratze-jakinarazpen automatikoak"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Erakutsi jakinarazpenak eguneratzeak automatikoki instalatu direnean."
+
+#. 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 "Instalatuta dauden zenbait software ez dira bateragarriak %s aplikazioarekin. Jarraitzen baduzu, honakoak automatikoki kenduko dira bertsioa berritzean:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software bateraezina"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Jarraitu"
+
+#. 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 "“%s” gunetik instalatu den softwareak ez ditu eguneratze gehiago jasoko."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "<desgaitu biltegia?"
+
+#: src/gs-repos-dialog.c:248
+msgid "Remove Repository?"
+msgstr "Kendu biltegia?"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:254
+msgid "_Disable"
+msgstr "_Desgaitu"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Kendu"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Gaitu biltegi gehiago"
+
+#: src/gs-repos-dialog.c:509
+msgid "Turn on new repositories when they are added."
+msgstr "Aktibatu biltegiak gehitzen direnean."
+
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-repos-dialog.c:518
+msgid "more information"
+msgstr "informazio gehiago"
+
+#. 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 "Hautatutako hirugarrenen biltegi gehigarriak — %s."
+
+#: src/gs-repos-dialog.c:528
+msgid "Fedora Third Party Repositories"
+msgstr "Fedoraren hirugarrenen biltegiak"
+
+#. 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 "sistema eragilea"
+
+#. 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 "Biltegi hauek %s hornitzaileak emandako software lehenetsia osatzen dute."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Software-biltegiak"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Biltegirik ez"
+
+#. 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] "Aplikazio %u instalatuta"
+msgstr[1] "%u aplikazio instalatuta"
+
+#. 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] "Gehigarri %u instalatuta"
+msgstr[1] "%u gehigarri instalatuta"
+
+#. 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] "Aplikazio %u"
+msgstr[1] "%u aplikazio"
+
+#. 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] "gehigarri %u"
+msgstr[1] "%u gehigarri"
+
+#. 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 eta %s instalatuta"
+msgstr[1] "%s eta %s instalatuta"
+
+#. 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 "Gorroto dut"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Ez dut atsegin"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Ongi dago"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Atsegin dut"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Maite dut"
+
+#. 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 "Har ezazu denbora gehiago iritzia idazteko"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Aukeratu balorazioa"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Laburpena motzegia da"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Laburpena luzeegia da"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Azalpena motzegia da"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+msgid "The description is too long"
+msgstr "Azalpena luzeegia da"
+
+#. 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 "Bidali iritzia"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "Bi_dali"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Balorazioa"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Laburpena"
+
+#: src/gs-review-dialog.ui:97
+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\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Berrikuspena"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr "Begiratu zein datu bidaltzen den gure <a href=\"https://odrs.gnome.org/privacy\">pribatutasun-politikan</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Bidali iritzia?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Eman berri"
+
+#. 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 "Iritzi hau baliagarri izan zaizu?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Bai"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Ez"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Beno…"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Eman berri…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Kendu…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Egiaztatu hornitzaileaz fidatzen zarela, aplikazio hau ez baitago isolatuta"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Baimenik ez"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Sareko sarbidea"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ez dago sareko sarbiderik"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Erabili sistema-zerbitzuak"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Saio-zerbitzuak darabiltza"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Gailuaren atzipena"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Ez dago gailuen atzipenik"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Fitxategi-sistema irakurtzeko/idazteko sarbide osoa"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Karpeta nagusia irakurtzeko/idazteko sarbidea"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Fitxategi-sistema osoa irakurtzeko sarbidea"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Karpeta nagusia irakurtzeko sarbidea"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Deskargen karpeta irakurtzeko/idazteko sarbidea"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Deskargen karpeta irakurtzeko sarbidea"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Zure deskargen karpetako datu guztiak irakurri daitezke"
+
+#: src/gs-safety-context-dialog.c:299
+msgid "Can read and write all data in the directory"
+msgstr "Direktorioko datu guztiak irakurri eta idatzi daitezke"
+
+#: src/gs-safety-context-dialog.c:310
+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:326
+msgid "No File System Access"
+msgstr "Fitxategi-sistemaren sarbiderik ez"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Ezin da fitxategi-sistemara sartu"
+
+#. 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 "Kode jabeduna"
+
+#: 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 "Iturburu-kodea ez da publikoa, eta beraz, ezin da modu independentean ikuskatu eta ez segurua izan daiteke"
+
+#. 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 "Kode ikuskagarria"
+
+#: 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 "Iturburu-kodea publikoa da eta modu independentean ikuskatu daiteke, eta beraz, aplikazioa seguruagoa izateko aukera gehiago daude"
+
+#. 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 "Aplikazioaren garatzailea egiaztatuta dago"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Mendekotasun ez seguruak"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 segurua da"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s ez da segurua"
+
+#. 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 "Segurtasuna"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Iturburua"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Zaharkitutako SDK bertsioa"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ez da pantaila-argazkirik eman"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Ez da pantaila-argazkirik aurkitu"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Ez da baliozko pantaila-argazkia"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Bilaketaren orria"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Bilatu aplikazioak"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Ezin dira firmwarearen eguneratzeak %s(e)ndik deskargatu"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Ezin dira eguneratzeak %s(e)nik deskargatu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Ezin dira eguneratzeak deskargatu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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."
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, c-format
+msgid "Unable to download updates from %s: not enough disk space"
+msgstr "Ezin dira eguneratzeak %s(e)nik deskargatu: ez dago nahikoa leku librerik diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Ezin dira eguneratzeak deskargatu: ez dago nahikoa leku librerik diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Ezin dira eguneratzeak deskargatu: autentifikazioa behar da"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Ezin dira eguneratzeak deskargatu: autentifikazioa baliogabekoa da"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Ezin da eguneratzeen zerrenda eskuratu"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Ezin da %s instalatu, deskargak huts egin baitu %s(e)ndik"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Ezin da %s instalatu, deskargak huts egin baitu"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Ezin da %s instalatu exekuzio-denborako %s ez dagoelako erabilgarri"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Ezin da `%s' instalatu ez baitago onartuta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr "Ezin da instalatu: interneteko sarbidea behar da, baina ez dago erabilgarri."
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Ezin da instalatu: aplikazioak baliogabeko formatu bat du"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Ezin da %s instalatu: ez dago nahikoa leku librerik diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Ezin da %s instalatu: autentifikazioa behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Ezin da %s instalatu: autentifikazioa baliogabea da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Ezin da %s instalatu: entxufatuta egotea behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Ezin da %s instalatu: bateria-maila baxuegia da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Ezin da %s instalatu"
+
+#. 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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Ezin da %s eguneratu %s biltegitik, deskargak huts egin baitu"
+
+#. 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 update %s as download failed"
+msgstr "Ezin da %s eguneratu, deskargak huts egin baitu"
+
+#. 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Ezin da %s biltegiko eguneratzerik instalatu, deskargak huts egin baitu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Ezin da eguneratzerik instalatu, deskargak huts egin baitu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr "Ezin da eguneratu: interneteko sarbidea behar da, baina ez dago erabilgarri."
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Ezin da %s eguneratu: ez dago nahikoa leku librerik diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Ezin da eguneratzerik instalatu: ez dago nahikoa lekurik diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Ezin da %s eguneratu: autentifikazioa behar da"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Ezin dira eguneratzeak instalatu: autentifikazioa behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Ezin da %s eguneratu: autentifikazioa baliogabea da"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Ezin dira eguneratzeak instalatu: autentifikazioa baliogabea da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Ezin da %s eguneratu: entxufatuta egotea behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Ezin dira eguneratzeak instalatu: entxufatuta egotea behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Ezin da %s eguneratu: bateria-maila baxuegia da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Ezin dira eguneratzeak instalatu: bateria-maila baxuegia da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Ezin da %s eguneratu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Ezin dira eguneratzeak instalatu"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Ezin da %s bertsiora berritu: deskargak huts egin du"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Ezin da %s bertsiora berritu: ez dago nahikoa leku diskoan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Ezin da %s bertsiora 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Ezin da %s bertsiora berritu: autentifikazioa baliogabea da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Ezin da %s bertsiora berritu: entxufatuta egotea 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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Ezin da %s bertsiora berritu: bateria-maila baxuegia da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Ezin da %s bertsiora berritu"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Ezin da %s kendu: autentifikazioa behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Ezin da %s kendu: autentifikazioa baliogabea da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Ezin da %s kendu: entxufatuta egotea behar da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Ezin da %s kendu: bateria-maila baxuegia da"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Ezin da %s kendu"
+
+#. 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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Ez dago nahikoa leku diskoan — Askatu leku piskat eta saiatu berriro."
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Zerbait gaizki irten da"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Fitxategiaren instalazioak huts egin du: ez dago onartuta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Huts egin du fitxategia instalatzean: autentifikazioak huts egin du"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Instalazioak huts egin du: ez dago onartuta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Instalazioak huts egin du: autentifikazioak huts egin du"
+
+#. 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 "Ezin da %s kontaktatu"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Software aplikazioa berrabiarazi behar da plugin berriak erabiltzeko."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Entxufatuta egon behar du"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Bateria-maila baxuegia da"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Software-biltegiak"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Eguneratze-hobespenak"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Aztertu diskoa"
+
+#. 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 "Sarearen ezarpenak"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Berrabiarazi orain"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Informazio gehiago"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Bilatu"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu nagusia"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Aurkitu _gehiago"
+
+#. 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 "Eguneratzeak"
+
+#. 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 "Application Data"
+msgstr "Aplikazio-datuak"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application to run"
+msgstr "Aplikazioak exekutatua izateko behar dituen 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 application"
+msgstr "Zuk 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 application 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 application"
+msgstr "Aplikazio honek behar dituen sistemako osagai partekatuak"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+#. 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 "Biltegiratzea"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr "Cachean dauden datuak <a href=\"dummy\">_aplikazioaren ezarpenetan</a> garbitu daitezke."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (instalatuta)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (instalatzen)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (kentzen)"
+
+#. 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 "Instalatutako eguneratzeak"
+
+#. 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 "'%s'(e)n instalatuta"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Ez da eguneratzerik instalatu"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Software-eguneratzeak iraungita daude"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Egiaztatu software-eguneratzeak dauden."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Software-eguneratze kritikoa instalatzeko prest dago"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Software-eguneratze garrantzitsua instalatzeko prest dago"
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Software-eguneratze kritikoak deskargarako prest daude"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Garrantzitsua: software-eguneratze kritikoak zain daude."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Software-eguneratzeak instalatzeko prest daude"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Software-eguneratzeak zain eta instalatzeko prest daude."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Software-eguneratzeak deskargarako prest daude"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Deskargatu zain dauden software-eguneratzeak."
+
+#. 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] "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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "Aplikazio %u eguneratu da"
+msgstr[1] "%u aplikazio eguneratu da"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s eguneratu da."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Berrabiarazi aplikazioa."
+
+#. 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 eta %s eguneratu dira."
+
+#. 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 aplikazioak berrabiaraztea behar du."
+msgstr[1] "%u aplikazio instalatuta"
+
+#. 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 eta %s barne hartzen ditu."
+
+#. 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 "Sistema Eragilearen eguneratzeak eskuragaitz"
+
+#. 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 "Bertsio-berritu segurtasun-eguneratzeak jasotzen jarraitzeko."
+
+#. 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 "%s(r)en bertsio berria eskuragarri dago instalatzeko"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Software-eguneratzeak eskuragarri"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Huts egin du softwareak eguneratzean"
+
+#. 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 "Sistema eragilearen eguneratze garrantzitsu bat ezin izan da instalatu."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Erakutsi xehetasunak"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+msgid "System Upgrade Complete"
+msgstr "Sistemaren eguneratzea osatu 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:1167
+#, 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:1173
+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:1177
+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 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 "Berrikuspena"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 "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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Azken egiaztaketa: %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 ez da gehiago sostengatuko."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Zure sistema eragilea ez da gehiago onartzen."
+
+#. 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 "Segurtasun-eguneratzerik ez duela jasoko adierazten du honek."
+
+#. 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 "Bertsio berriago batera eguneratzea gomendatzen da."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Gastu gehigarriak sor daitezke"
+
+#. 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 "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:857
+msgid "Check _Anyway"
+msgstr "Egiaztatu _dena den"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Ez dago sarerik"
+
+#. 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 "Interneterako sarbidea behar da eguneratzeak egiaztatzeko."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Egiaztatu eguneratzeak dauden"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Eguneratzeak"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Eguneratzeen orria"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Eguneratzeak kargatzen…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+msgid "This could take a while."
+msgstr "Denbora bat beharko du."
+
+#. 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 "Eguneratuta"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Erabili mugikorreko datuak?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Egiaztatu dena den"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Ez dago konexiorik"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Konektatu eguneratzeak egiaztatzeko."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Sarearen ezarpenak"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Errorea"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Eguneratzeak automatikoki kudeatuta daude."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Berrabiarazi eta eguneratu"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Eguneratu dena"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Aplikazioen eguneratzea"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Gailuaren firmwarea"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s erabilgarri"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Ikasi gehiago bertsio berriari buruz"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Deskargatzen…"
+
+#. 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 / %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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% deskargatu da"
+
+#: src/gs-upgrade-banner.ui:42
+msgid "A major upgrade, with new features and added polish."
+msgstr "Bertsio-berritze nagusia, eginbide berriekin eta gehitutako dotoreziekin."
+
+#: src/gs-upgrade-banner.ui:187
+msgid "_Restart & Upgrade"
+msgstr "_Berrabiarazi eta eguneratu"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Gogoratu datuen eta fitxategien babeskopia egitea eguneratzea abiarazi baino lehen."
+
+#: 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 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 "Eguneratzeak;Bertsio-berritzeak;Iturburuak;Biltegiak;Hobespenak;Instalatu;Desinstalatu;Programa;Softwarea;Aplikazioa;Denda;App;"
+
+#. 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 "Sistemaren eguneratzeak"
+
+#. 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 "Sistemaren eguneratze orokorrak, esaterako akatsen konponketak eta segurtasunaren hobekuntzak, eta errendimendu-hobekuntzak."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Nabarmendutako irudiak deskargatzen…"
+
+#. 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 "Eginbide berriak eta konponketak dituen eguneratze %s."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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 webeko aplikazio ezagunak nabigatzaile batean"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Eguneratzeen informazioa deskargatzen…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "%s sistemaren karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "%s azpikarpeta nagusia"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Ostalariaren sistemaren karpetak"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Ostalariaren sistemaren konfigurazioa /etc direktoriotik"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Mahaigainaren karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Mahaigainaren %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumentuen karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumentuen %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Musikaren karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Musikaren %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Irudien karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Irudien %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Partekatze publikoko karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Partekatze publikoko %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Bideoen karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Bideoen %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Txantiloien karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Txantiloien %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Erabiltzaile-cachearen karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Erabiltzaile-cachearen %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Erabiltzaile-konfigurazioaren karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Erabiltzaile-konfigurazioaren %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Erabiltzaile-datuen karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Erabiltzaile-datuen %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Erabiltzailearen exekuzio-denboraren karpeta"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Erabiltzailearen exekuzio-denboraren %s azpikarpeta"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Flatpak-eko %s(r)en metadatuak eskuratzen…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 "Urruneko “%s”(e)k ez du onartzen “%s” instalatzea, ziur asko bere iragazkiaren erruz. Kendu iragazkia eta errepikatu instalazioa. Errorearen xehetasunak: %s"
+
+#. 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s konfigurazioaren eguneratzea"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s kameraren eguneratzea"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPMaren eguneratzea"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB jasotzailearen eguneratzea"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmwarea"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Firmwarea bertsio-berritzeko euskarria"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7
+msgid "Provides support for firmware upgrades"
+msgstr "Firmwarea bertsio-berritzeko euskarria eskaintzen du"
+
+#: plugins/packagekit/gs-packagekit-task.c:148
+msgid "Install Unsigned Software?"
+msgstr "Instalatu sinatu gabeko softwarea?"
+
+#: 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 "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:153
+msgid "Download Unsigned Software?"
+msgstr "Deskargatu sinatu gabeko softwarea?"
+
+#: 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 "Sinatu gabeko eguneratzeak daude. Sinadurarik gabe, ezin da egiaztatu eguneratzearen jatorria edo hura faltsutu den."
+
+#: plugins/packagekit/gs-packagekit-task.c:158
+msgid "Update Unsigned Software?"
+msgstr "Eguneratu sinatu gabeko softwarea?"
+
+#: 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 "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:367
+msgid "Packages"
+msgstr "Paketeak"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "sistema"
+
+#~ 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 "Remove"
+#~ msgstr "Kendu"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Biltegi gehigarririk ez"
+
+#~ msgid "_Enable"
+#~ msgstr "_Gaitu"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Kendu…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Desgaitu…"
+
+#~ msgid "Disabling"
+#~ msgstr "Desgaitzen"
+
+#~ msgid "Enabled"
+#~ msgstr "Gaituta"
+
+#~ msgid "Disabled"
+#~ msgstr "Desgaituta"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Nabigazioko alboko barra"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Berrabiarazi orain"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s : instalatzeko prest"
+
+#~ 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 "Reference"
+#~ msgstr "Erreferentzia"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Softwarearen lizentzia ezezaguna"
+
+#~ 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 "_Installed"
+#~ msgstr "_Instalatuta"
+
+#~ msgid "_Updates"
+#~ msgstr "_Eguneratzeak"
+
+#~ 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, %R"
+#~ msgstr "Atzo, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Huts egin du fitxategia gordetzean"
+
+#~ 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 "App ID"
+#~ msgstr "Apl. IDa"
+
+#~ 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 "Delete Design"
+#~ msgstr "Ezabatu diseinua"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "SEren bertsio-berritzea"
+
+#~ 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..79bd4d9
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,6393 @@
+# 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 <mousavi.arash@gmail.com>, 2016.
+# Danial Behzadi <dani.behzi@ubuntu.com>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2022-11-23 16:17+0000\n"
+"PO-Revision-Date: 2022-12-14 14:41+0330\n"
+"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\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=1; plural=0;\n"
+"X-Generator: Poedit 3.2.2\n"
+"X-DamnedLies-Scope: partial\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:2076 src/gs-application.c:256
+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 "نصب یک پروندهٔ 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 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://wiki.ubuntu.ir/wiki/Proprietary_Software'"
+
+#: 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 ""
+"سیاهه‌ای از نشانی‌های اشاره کننده به پرونده‌های appstream که در یک شاخهٔ swcatalog "
+"بارگیری خواهند شد"
+
+#: 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 ""
+"نصب پرونده‌های AppStream به مکان سامانه‌ای برای تمامی کاربران. در صورت خاموش بودن، "
+"پرونده‌ها در شاخهٔ غیر استاندارد ‪$XDG_DATA_HOME/swcatalog/xmls‬ نصب می‌شوند"
+
+#: 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 ""
+"ترتیب اولویت ترجیحی قالب بسته‌ها که قالب‌های مهم‌تر، نخست فهرست می‌شوند. آرایهٔ خالی به "
+"معنی ترتیب پیش‌گزیده است. قالب‌های جا گذاشته به عنوان فهرست شده در انتها فرض می‌شوند. "
+"قالب‌های بسته‌بندی مثال شامل: deb، flatpak، rpm و snap."
+
+#: 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: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: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 "%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:1027
+#, 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:1031
+#, 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 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 مناسب نوجوانان است"
+
+#. 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 مناسب بزرگسالان است"
+
+#. 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 مناسب %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 "رتبه‌بندی سنی"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "جدید در نگارش %s"
+
+#: 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 "%%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: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 "ترجیح دادن منابع محلّی به AppStream"
+
+#: src/gs-application.c:153
+msgid "Show version number"
+msgstr "نمایش شماره نسخه"
+
+# در این رشته از نویسه LRM استفاده شده است
+#: src/gs-application.c:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "حق رونوشت © ‎۱۳۹۵-۱۴۰۱ مشارکت‌کنندگان نرم‌افزارهای گنوم"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"آرش موسوی <mousavi.arash@gmail.com>\n"
+"دانیال بهزادی <dani.behzi@ubuntu.com>\n"
+"سید اسحاق مقیم شهیدانی <eshagh094@gmail.com>\n"
+"محمد صالح کامیاب <mskf1383@protonmail.com>"
+
+#. 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 "دربارهٔ نرم‌افزارها"
+
+#. 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 "نیاز به %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: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 "منبع: %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 "تغییر نام از %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "کمک به ترجمهٔ %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 به دست اجتماعی از داوطلبان طرّاحی، توسعه و ترجمه شده است.\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: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 "لطفاً عددی از ۱ تا %Iu وارد کنید: "
+
+#. 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 "حالا %s نصب شد"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"برنامهٔ %s یک <a href=\"https://wiki.ubuntu.ir/wiki/Free_Software\">نرم‌افزار آزاد</"
+"a> نیست و به دست «%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 به دست «%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 "ممکن است نصب یا استفاده از %s در بعضی کشورها ممنوع باشد."
+
+#. 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] "به‌روز رسانی‌ها نصب شدند"
+
+#. 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] "برنامه‌ها برداشته شدند"
+
+#. 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] "اثربخشی نیازمند آغاز دوباره است."
+
+#. 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] "%Id دقیقه پیش"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%Id ساعت پیش"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%Id روز پیش"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%Id هفته پیش"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%Id ماه پیش"
+
+#: src/gs-common.c:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%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: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 "یک برنامه"
+
+#. 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: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:873 src/gs-details-page.c:899 src/gs-details-page.ui:228
+#: plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_نصب"
+
+#: src/gs-details-page.c:889
+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:913
+msgid "_Install…"
+msgstr "_نصب…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr "دیگر کاره‌ها از %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+msgid "You need internet access to write a review"
+msgstr "برای نوشتن بازبینی، نیاز به دسترسی به اینترنت دارید"
+
+#: src/gs-details-page.c:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "امکان یافتن «%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 "کمک به _ترجمه"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_نوشتن بازبینی"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] "قلم‌های موجود برای کدنوشته‌های %s"
+
+#. 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] "نرم‌افزارهای موجود برای %s"
+
+#: 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 "مورد %s پیدا نشد"
+
+#. 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 "هیچ برنامه‌ای موجود نیست که پرونده %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 ""
+"ممکن است اطّلاعات درباره %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"اطّلاعات در مورد %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"اطّلاعات در مورد %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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"اطّلاعات در مورد %s، همچنین گزینه‌هایی در خصوص چگونگی دریافت راه‌اندازی که از این "
+"چاپگر پشتیبانی کند را ممکن است در %s پیدا کنید."
+
+#. 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] "ناتوان در یافتن %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: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] ""
+"ناتوان در یافتن %s که جست‌وجویش می‌کردید. لطفاً برای اطّلاعات بیش‌تر %s را ببینید."
+
+#: 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 "شکست در یافتن نتیجه‌ای برای جست‌وجو: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "قالب پروندهٔ %s"
+
+#: 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 "احتمالاً %s روی این افزاره کار می‌کند"
+
+#. 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 روی این افزاره کار می‌کند"
+
+#. 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 به خوبی روی این افزاره کار نخواهد کرد"
+
+#. 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 روی این افزاره کار نخواهد کرد"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"این نرم‌افزار به صورت آزاد به دست اجتماعی از داوطلبان توسعه یافته و با <a "
+"href=\"%s\">پروانهٔ %s</a> منتشر شده.\n"
+"\n"
+"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید."
+
+#. 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 ""
+"این نرم‌افزار به صورت آزاد به دست اجتماعی از داوطلبان توسعه یافته و با پروانهٔ %s "
+"منتشر شده.\n"
+"\n"
+"می‌توانید در بهتر از این کردنش، مشارکت و یاری کنید."
+
+#: 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 ""
+"این نرم‌افزار به صورت آزاد توسعه نیافته، پس فقط توسعه‌دهندگانش می‌دانند چگونه کار "
+"می‌کند. این کاره ممکن است به روش‌هایی که تشخیصشان دشوار است ناامن بوده و بدون نظارت "
+"تغییر کند.\n"
+"\n"
+"ممکن است قادر به مشارکت در این نرم‌افزار نباشید."
+
+#. 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 ""
+"شبکهٔ کنونی اندازه‌گیری‌شده است. اتّصال‌های اندازه‌گیری‌شده محدودیت‌های داده‌ای یا هزینه‌های "
+"مربوط دارند. بنابراین برای ذخیرهٔ داده، به‌روز رسانی‌های خودکار مکث شده‌اند.\n"
+"\n"
+"به‌روز رسانی‌های خودکار هنگام موجود بودن یک شبکهٔ اندازه‌گیری‌نشده از سر گرفته خواهند "
+"شد. تا آن‌هنگام، می‌توان به صورت دستی، به‌روز رسانی کرد.\n"
+"\n"
+"همچنین اگر این شبکه به صورت نادرست به عنوان اندازه‌گیری‌شده شناخته شده، می‌توان این "
+"تنظیم را تغییر داد."
+
+#: 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 ""
+"دسترسی به نرم‌افزارهای اضافی از %s را فراهم می‌کند. شامل برخی نرم‌افزارهای مالکیتی."
+
+#. 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:2837
+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 "مطمئنید می‌خواهید مخزن %s را بردارید؟"
+
+#. 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 ""
+"تمام برنامه‌های %s حذف خواهند شد و برای استفادهٔ دوباره از آن‌ها، باید بازنصبشان کنید."
+
+#. 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 "آیا مطمئنید که می‌خواهید %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 حذف خواهد شد و باید برای استفادهٔ دوباره از آن، نصبش کنید."
+
+#: 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 ""
+"تعدادی از نرم‌افزارهای نصب شده با %s سازگار نیستند. اگر ادامه دهید، موارد مقابل "
+"بطور خودکار در هنگام ارتقا حذف خواهند شد:"
+
+#: 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 "نرم‌افزارهایی که از «%s» نصب شده اند، دیگر به‌روز نخواهند شد."
+
+#: 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 "مخزن‌های اضافی از سوم‌شخص‌های گزیده — %s."
+
+#: 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 "این مخزن‌ها، نرم‌افزارهای پیش‌گزیده‌ای که به دست %s فراهم شده را تکمیل می‌کنند."
+
+#. 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] "%Iu برنامه نصب شد"
+
+#. 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] "%Iu افزونه نصب شد"
+
+#. 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] "%Iu برنامه"
+
+#. 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] "%Iu افزونه"
+
+#. 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 و %s نصب شدند"
+
+#. 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 "بدم می‌آید"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy\">privacy "
+"policy</a>. The full name attached to your account will be shown publicly."
+msgstr ""
+"در <a href=\"https://odrs.gnome.org/privacy\">سیاست محرمانگیمان</a> ببینید چه "
+"داده‌هایی ارسال می‌شوند. نام کامل پیوسته به حسابتان به صورت عمومی دیده خواهد شد."
+
+#: src/gs-review-histogram.c:72
+#, c-format
+msgid "%u review total"
+msgid_plural "%u reviews total"
+msgstr[0] "مجموعاً %Iu بازبینی"
+
+#: 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 "%s بالقوه ناامن است"
+
+#. 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 ناامن است"
+
+#. 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 "ابزار توسعهٔ نرم‌افزار"
+
+#: 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] "%Iu مورد منطبق بیش‌تر"
+
+#: 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 "ناتوان در بارگیری به‌روز رسانی‌های ثابت‌افزار از %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 "ناتوان در بارگیری به‌روز رسانی‌ها از %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 "ناتوان در بارگیری به‌روز رسانی‌ها"
+
+#. 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 "ناتوان در بارگیری به‌روز رسانی‌ها از %s: فضای دیسک ناکافی"
+
+#. 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 "ناتوان در نصب %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 "ناتوان در نصب %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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "ناتوان در نصب %s به دلیل عدم پشتیبانی"
+
+#. 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 "ناتوان در نصب %s: فضای دیسک ناکافی"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "ناتوان در نصب %s: سطح باتری بیش از حد کم"
+
+#. 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 "ناتوان در نصب %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 "ناتوان در به‌روز رسانی %s از %s به دلیل شکست بارگیری"
+
+#. 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 "ناتوان در به‌روز رسانی %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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "ناتوان در نصب به‌روز رسانی‌ها از %s به دلیل شکست بارگیری"
+
+#. 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 "ناتوان در به‌روز رسانی %s: فضای دیسک ناکافی"
+
+#. 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 "ناتوان در به‌روز رسانی به %s: نیاز به تصدیق هویت"
+
+#. 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 "ناتوان در به‌روز رسانی %s: تصدیق هویت نامعتبر"
+
+#. 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 "ناتوان در به‌روز رسانی %s: شما اجازهٔ به‌روز رسانی نرم‌افزار را ندارید"
+
+#. 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 "ناتوان در به‌روز رسانی %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: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 "ناتوان در به‌روز رسانی %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: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 "ناتوان در به‌روز رسانی %s"
+
+#. 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 "ناتوان در ارتقا به %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 "ناتوان در ارتقا به %s به دلیل شکست بارگیری"
+
+#. 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 "ناتوان در ارتقا به %s: دسترسی به اینترنت مورد نیاز است"
+
+#. 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 "ناتوان در ارتقا به %s: فضای دیسک ناکافی"
+
+#. 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 "ناتوان در ارتقا به %s: نیاز به تصدیق هویت"
+
+#. 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 "ناتوان در ارتقا به %s: تصدیق هویت نامعتبر"
+
+#. 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 "ناتوان در ارتقا به %s: شما اجازهٔ ارتقای نرم‌افزار را ندارید"
+
+#. 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 "ناتوان در ارتقا به %s: نیاز به برق متناوب"
+
+#. 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 "ناتوان در ارتقا به %s: سطح باتری بیش از حد کم"
+
+#. 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 "ناتوان در ارتقا به %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 "ناتوان در برداشتن %s: نیاز به تصدیق هویت"
+
+#. 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 "ناتوان در برداشتن %s: تصدیق هویت نامعتبر"
+
+#. 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 "ناتوان در برداشتن %s: شما اجازهٔ برداشتن نرم‌افزار را ندارید"
+
+#. 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 "ناتوان در برداشتن %s: نیاز به برق متناوب"
+
+#. 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 "ناتوان در برداشتن %s: سطح باتری بیش از حد کم"
+
+#. 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 "ناتوان در برداشتن %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 "ناتوان در اجرای %s: %s نصب نشده است"
+
+#. 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 "متأسفیم، اشکالی به وجود آمد"
+
+#. 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 "فضای دیسک ناکافی — کمی فضا آزاد کرده و دوباره تلاش کنید"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "شکست در نصب پرونده: عدم پشتیبانی"
+
+#. 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 "شکست در نصب: شکست تصدیق هویت"
+
+#. 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 "ناتوان در تماس با %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 "سطح باتری بیش از حد کم"
+
+#: 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 <a href=\"dummy\">_application settings</a>."
+msgstr ""
+"داده‌های انبار شده می‌توانند از <a href=\"dummy\">_تنظیمات برنامه</a> پاک‌سازی شوند."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (نصب شده)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (در حال نصب)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (در حال برداشتن)"
+
+#. 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 "در %s نصب شده است"
+
+#: 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] "%Iu برنامه به‌روز رسانی شد — نیاز به شروع دوباره"
+
+#. TRANSLATORS: apps were auto-updated
+#: src/gs-update-monitor.c:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%Iu برنامه به‌روز رسانی شد"
+
+#. 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 "%s و %s به‌روز شدند."
+
+#. 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] "%Iu برنامه نیاز به یک شروع دوباره دارند."
+
+#. 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 "نگارشی جدید از %s برای نصب موجود است"
+
+#. 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 "به %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] "به‌روز رسانی‌های نرم‌افزاری نصب شد"
+
+#. 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] "به‌روز رسانی‌های مهم سیستم‌عامل نصب شد."
+
+#. 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 "آخرین بررسی: %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 دیگر پشتیبانی نمی‌شود."
+
+#: 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 "%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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s موجود است"
+
+#: 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 "%s از %s بارگیری"
+
+#. 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 "%Iu٪ بار گرفته"
+
+#: 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 ""
+"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: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 "به‌روز رسانی %s با امکانات جدید و رفع اشکال‌ها."
+
+#: 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 "پشتیبانی فلت‌پک"
+
+#: 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 "شاخهٔ سامانه %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "شاخهٔ خانه %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "شاخه‌های سامانهٔ میزبان"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "پیکربندی سامانهٔ میزبان از ‪/etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "شاخهٔ میزکار"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "زیرشاخهٔ میزکار %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "شاخهٔ سندها"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "زیرشاخهٔ سندها %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "شاخهٔ آهنگ‌ها"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "زیرشاخهٔ آهنگ‌ها %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "شاخهٔ عکس‌ها"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "زیرشاخهٔ عکس‌ها %s"
+
+#: 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 "زیرشاخهٔ هم‌رسانی عمومی %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "شاخهٔ ویدیوها"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "زیرشاخهٔ ویدیوها %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "شاخهٔ قالب‌ها"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "زیرشاخهٔ قالب‌ها %s"
+
+#: 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 "زیرشاخهٔ انبارش کاربر %s"
+
+#: 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 "زیرشاخهٔ پیکربندی کاربر %s"
+
+#: 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 "زیرشاخهٔ دادهٔ کاربر %s"
+
+#: 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 "زیرشاخهٔ زمان اجرای کاربر %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "دسترسی به سامانهٔ پروندهٔ %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "در حال گرفتن فرادادهٔ فلت‌پک برای %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "شکست در افزودن به نصب برای افزونهٔ «%s»: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "شکست در افزودن به حذف برای افزونهٔ «%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 ""
+"مخزن «%s» اجازهٔ نصب «%s» را احتمالاً به خاطر پالایه‌هایش نمی‌دهد. پالایه را برداشته و "
+"نصب را تکرار کنید. خطای با جزییات: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "به‌روز رسانی دوربین %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "به‌روز رسانی تی‌پی‌ام %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "به‌روز رسانی صفحه لمسی %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "به‌روز رسانی موشی %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "به‌روز رسانی صفحه‌کلید %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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "به‌روز رسانی 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "به‌روز رسانی گیرندهٔ یواس‌بی %s"
+
+#: 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:2696
+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 "اسنپ یک بستهٔ جهانی گنو/لینوکسی است"
+
+#~ msgid "No updates have been installed on this system."
+#~ msgstr "هیچ به‌روز رسانی‌ای روی این سامانه نصب نشده است."
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "مدیر برنامه برای گنوم"
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ 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 "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 "Remove"
+#~ msgstr "برداشتن"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "بدون مخزن‌های اضافی"
+
+#~ msgid "_Enable"
+#~ msgstr "به کار انداختن"
+
+#~ msgid "_Remove…"
+#~ msgstr "_برداشتن…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_از کار انداختن…"
+
+#~ msgid "Enabling"
+#~ msgstr "به کار انداختن"
+
+#~ msgid "Disabling"
+#~ msgstr "از کار انداختن"
+
+#~ msgid "Enabled"
+#~ msgstr "به کار افتاده"
+
+#~ msgid "Disabled"
+#~ msgstr "از کار افتاده"
+
+#~ msgid "_Remove All"
+#~ msgstr "_برداشتن همه"
+
+#~ msgid "_Restart Now"
+#~ 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 "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 "_Installed"
+#~ msgstr "_نصب شده"
+
+#~ msgid "_Updates"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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, %R"
+#~ msgstr "دیروز، %OH:%OM"
+
+#~ 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 "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 "طراح بنر نرم‌افزارهای گنوم"
+
+#~ msgid "No Designs"
+#~ msgstr "بدون طرح"
+
+#~ msgid "Error message here"
+#~ msgstr "پیام خطا در اینجا"
+
+#~ msgid "App ID"
+#~ msgstr "App ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "حذف طراحی"
+
+#~ msgid "OS Upgrade"
+#~ 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 "I have forgotten my password"
+#~ 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 "U_pdate All"
+#~ 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 "_Install All"
+#~ 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 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..7f96446
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,7208 @@
+# 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 <lasse.liehu@gmail.com>, 2014.
+# Jiri Grönroos <jiri.gronroos+l10n@iki.fi>, 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: 2022-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-08-30 19:14+0300\n"
+"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
+"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\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.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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Ohjelmistot mahdollistaa uusien sovellusten löytämisen ja asennuksen sekä "
+"nykyisten sovellusten poistamisen."
+
+#: 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Gnome-projekti"
+
+#: 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 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ä"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 "Sovellusarvosteluihin käytettävä palvelin"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Karmapisteiden vähimmäismäärä arvosteluille"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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: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 "Salli pääsy ohjelmistolähteiden ikkunaan"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Tarjoa esijulkaisujen versiopäivityksiä"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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: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 ""
+"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: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 ""
+"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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr ""
+"Gnomen Ohjelmistot-sovelluksen järjestelmänlaajuinen AppStream-asennusohjelma"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Ikäraja"
+
+#: 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 "Kuinka lisätä puuttuvat tiedot"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Paketti"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Odottaa"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Odottaa asennusta"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Odottaa poistoa"
+
+#: 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 "Asennettu"
+
+#. 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 "Asennetaan"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Poistetaan"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Poista asennus"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Verkko"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Voi viestiä verkkoa käyttäen"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Järjestelmäpalvelut"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Istuntopalvelut"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Laitteet"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Voi käyttää järjestelmälaitetiedostoja"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Kotikansio"
+
+#: 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 "Voi nähdä, muokata ja luoda tiedostoja"
+
+#: 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 "Voi nähdä tiedostoja"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Lataukset-kansio"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Asetukset"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Voi nähdä ja muuttaa mitä tahansa asetuksia"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Vanhennettu ikkunointijärjestelmä"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Käyttää vanhaa ja turvatonta ikkunointijärjestelmää"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Eristyksistä karkaaminen"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Voi paeta hiekkalaatikosta ja kiertää muita rajoituksia"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Päivityksen tiedot"
+
+#. 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 "Päivityksen kuvausta ei ole saatavilla."
+
+#: 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 "Takaisin"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Vaatii lisäoikeuksia"
+
+#. 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 "Arvostelut"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Tähän sovellukseen liittyviä arvosteluja ei löytynyt."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Ei arvosteluja"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versiohistoria"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Uutta versiossa %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versio %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Näytä paikallinen metainfo- tai appdata-tiedosto"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Näytä runsasta vianselvitystietoa"
+
+#: 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 update preferences"
+msgstr "Näytä päivitysvalinnat"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Tekijänoikeus © 2016–2022 GNOME Software -kehittäjät"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Jiri Grönroos"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Tietoja - Ohjelmistot"
+
+#. 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 "Mukava tapa hallita järjestelmän ohjelmistoja."
+
+#. 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 "Valitettavasti tästä sovelluksesta ei ole tarkempia tietoja."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Voi päästä mielivaltaisiin tiedostoihin tiedostojärjestelmässä"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Voi hankkia mielivaltaisia oikeuksia"
+
+#. 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 "Jakelun katselmoima"
+
+#. 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 "Kolmannen osapuolen tarjoama"
+
+#. 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 "Suljettua koodia"
+
+#. 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 "Koodi auditoitavissa"
+
+#. 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 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 "Ohjelmisto ei ole enää tuettu"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Turvaton"
+
+#: 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 "Vain mobiili"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Toimii vain pienellä näytöllä"
+
+#: 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 "Vain työpöytä"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Toimii vain suurella näytöllä"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Näytön koon yhteensopimattomuus"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Ei tue nykyisen näyttösi kokoa"
+
+#: 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 "Vaatii kosketusnäytön"
+
+#: 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 "Vaatii näppäimistön"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Vaatii hiiren"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Peliohjain on pakollinen"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Mukautuva"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Toimii puhelimilla, tableteilla ja työpöydillä"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Vaatii luultavasti näppäimistön tai hiiren"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Ei sisällä ikärajoitusta vaativaa sisältöä"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Käy verkkosivustolla"
+
+#. 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 "Asenna…"
+
+#. 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 "Peru"
+
+#. 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 "Asenna"
+
+#. 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 "Päivitä"
+
+#. 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 "Poista asennus"
+
+#. 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 "Poistetaan asennus"
+
+#. 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 "Laitetta ei voi käyttää päivityksen aikana."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Aiempi nimi oli %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Auta kääntämään %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 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:5
+msgid "Translations"
+msgstr "Kielikäännökset"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Käännösten verkkosivusto"
+
+#. 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 "Kirjautumisen vaativa etä %s (realm %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Kirjautuminen vaaditaan"
+
+#: 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 "_Peru"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Kirjaudu"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Käyttäjä"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Salasana"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Uudet ja päivitetyt"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+msgid "Picks from the Web"
+msgstr "Poiminnat verkosta"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:125
+msgid "Other Software"
+msgstr "Muu ohjelmisto"
+
+#. 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 "Kirjoita numero 1:stä %u:een: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Valitse sovellus:"
+
+#: 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 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 on nyt asennettu"
+
+#. 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 "Muutosten voimaantulo vaatii uudelleenkäynnistyksen."
+
+#. 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 "Sovellus on valmiina käytettäväksi."
+
+#. 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 "Järjestelmäpäivitykset on asennettu"
+
+#. 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 "Äskettäin asennetut päivitykset ovat nyt valmiina arvosteltaviksi"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Käynnistä uudelleen"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Käynnistä"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Asennetaanko kolmannen osapuolen ohjelmisto?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Käytetäänkö kolmannen osapuolen ohjelmistolähdettä?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ei ole <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">vapaa ja avoin ohjelmisto</a>, eikä sitä ole tarjolla "
+"lähteessä “%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 on tarjolla lähteestä “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Älä varoita uudelleen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Yksityiskohtaiset virhetiedot pakettihallinnalta:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Tiedot"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Hyväksy"
+
+#. 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] "Päivitys on asennettu"
+msgstr[1] "Päivitykset on asennettu"
+
+#. 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] "Sovellus on poistettu"
+msgstr[1] "Sovellukset on poistettu"
+
+#. 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] "Muutoksen voimaan tulemiseksi vaaditaan uudelleenkäynnistys."
+msgstr[1] "Muutosten voimaan tulemiseksi vaaditaan uudelleenkäynnistys."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Ei nyt"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Juuri nyt"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d tunti sitten"
+msgstr[1] "%d tuntia sitten"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d vuosi sitten"
+msgstr[1] "%d vuotta 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Etsi ohjelmistoista"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Näytä lisää"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Näytä _vähemmän"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Poistetaan…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Asennuksen valmistuminen vaatii uudelleenkäynnistyksen"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Päivitys odottaa…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Valmistellaan…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Poistetaan asennus…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Asenna"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Käynnistä uudelleen"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Asenna…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Muut kehittäjän %s sovellukset"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Arvostelun kirjoittaminen vaatii internetyhteyden"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Kohdetta “%s” ei löytynyt"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Tietosivu"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Ladataan sovelluksen tietoja…"
+
+#: src/gs-details-page.ui:77
+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ä."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Auta _kielikäännöksissä"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Avaa"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Päivitä"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Ladataan"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Lisäosat"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Valitut lisäosat asennetaan sovelluksen mukana."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Ohjelmistolähde sisällytetty"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Ohjelmistolähdettä ei ole sisällytetty"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Ohjelmistolähde tunnistettu"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Käytä vain ohjelmistolähteitä, joihin luotat."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Ei metatietoja"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "_Projektin sivusto"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Lahjoita"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Osallistu k_äännöksiin"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Ilmoita ongelmasta"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Ohje"
+
+#. 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 "_Kirjoita arvostelu"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Kaikki arvostelut"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Saatavilla olevat fontit \"%s\"-skriptille"
+msgstr[1] "Saatavilla olevat fontit \"%s\"-skripteille"
+
+#. 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] "Saatavilla olevat ohjelmistot - %s"
+msgstr[1] "Saatavilla olevat ohjelmistot - %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Pyydettyä ohjelmistoa ei löytynyt"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "Kohdetta %s ei löydy"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "verkkosivustolla"
+
+#. 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 "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: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 ""
+"Tietoja kohteesta %s, ja ohjeita kuinka saada puuttuvat sovellukset, saattaa "
+"olla tarjolla tällä %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 "Sovelluksia \"%s\"-tuen tarjoamiseksi ei ole saatavilla."
+
+#. 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 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: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 ""
+"Tietoja kohteesta %s, ja ohjeita kuinka saada tätä tiedostomuotoa tukeva "
+"sovellus, saattaa olla tarjolla tällä %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 "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:402
+#, 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 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 "%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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Hakutuloksia ei löytynyt: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s-tiedostomuoto"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Pyydettyä ohjelmistoa ei löydy"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Koodekin sivu"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Työpöytätuki"
+
+#: 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 "Tukee suurella näytöllä käyttöä"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Työpöytätuki tuntematon"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Vaatii suuren näytön"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Työpöytä ei ole tuettu"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Ei voi käyttää suurella näytöllä"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobiilituki"
+
+#: 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 "Tukee käyttöä pienellä näytöllä"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobiilituki tuntematon"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Vaatii pienen näytön"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobiili ei tuettu"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Ei voi käyttää pienellä näytöllä"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Näppäimistötuki"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Näppäimistötuki tuntematon"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Näppäimistö on pakollinen"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Tukee näppäimistöjä"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Näppäimistö ei ole tuettu"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Ei voi käyttää näppäimistöllä"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Hiirituki"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Vaatii hiiren tai osoitinlaitteen"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Hiirituki tuntematon"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Hiiri on pakollinen"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Tukee hiirtä ja osoitinlaitteita"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Hiiri ei ole tuettu"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Kosketusnäytön tuki"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Kosketusnäytön tuki tuntematon"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Kosketusnäyttö on pakollinen"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Tukee kosketusnäyttöjä"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Kosketusnäyttö ei ole tuettu"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Ei voi käyttää kosketusnäytöllä"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Peliohjain on pakollinen"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Vaatii peliohjaimen"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Peliohjaintuki"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s toimii 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Laitetuki"
+
+#. 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 "Asennettu"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Asennussivu"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Sovellukset"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Verkkosovellukset"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Järjestelmäsovellukset"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Yhteisön tekemä"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Tätä ohjelmistoa kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se "
+"on julkaistu lisenssillä <a href=\"%s\">%s</a>.\n"
+"\n"
+"Voit osallistua ja tehdä ohjelmasta entistä paremman."
+
+#. 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 ""
+"Tätä ohjelmistoa kehitetään avoimesti vapaaehtoisen yhteisön toimesta, ja se "
+"on julkaistu lisenssillä %s.\n"
+"\n"
+"Voit osallistua ja tehdä ohjelmasta entistä paremman."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Suljettu"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Lue lisää"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Ladataan ohjelmistoluetteloa"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Ladataan sivua"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Käynnistetään…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automaattiset päivitykset keskeytetty"
+
+#: 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 ""
+"Nykyinen verkkoyhteys on käytön mukaan laskutettava. Käytön mukaan "
+"laskutettavissa yhteyksissä on yleensä datarajoituksia tai muuttuvia "
+"kustannuksia. Datan säästämiseksi automaattiset päivitykset on keskeytetty.\n"
+"\n"
+"Automaattiset päivitykset otetaan jälleen käyttöön, kun käytettävissä on muu "
+"kuin käytön mukaan laskutettava yhteys. Siihen saakka päivitykset on "
+"mahdollista asentaa manuaalisesti.\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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Avaa _verkkoasetukset"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderoi sivua"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Ei arvosteluja moderoitavaksi"
+
+#: src/gs-origin-popover-row.c:104
+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:108
+msgid "Beta"
+msgstr "Beeta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+msgid "User"
+msgstr "Käyttäjä"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Lisäykset"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Poistot"
+
+#. 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 "Päivitykset"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Version muutokset alempaan"
+
+#. 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 "valituista ulkoisista lähteistä"
+
+#. 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 ""
+"Tarjoaa enemmän ohjelmistoja %s. Sisältää joitain suljettuja ohjelmistoja."
+
+#. 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 "Käytä"
+
+#. 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 "Tutki"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Yhteenvetosivu"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Käytetäänkö kolmansien osapuolten ohjelmistolähteitä?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Muut luokat"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Sovellustietoja ei löytynyt"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Käyttäjä kieltäytyi asennuksesta"
+
+#. 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 "Valmistele %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 "Poistetaanko ohjelmistolähde %s?"
+
+#. 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 ""
+"Kaikki sovellukset lähteestä %s poistetaan. Käyttääksesi kyseisiä "
+"ohjelmistoja uudelleen, tulee lähde asentaa uudelleen."
+
+#. 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 "Poistetaanko %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 poistetaan. Jos haluat käyttää sitä jatkossa, se pitää asentaa uudelleen."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Päivitysvalinnat"
+
+#: 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 ""
+"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ä."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automaattiset päivitykset"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Lataa ja asentaa ohjelmistopäivitykset taustalla, jos mahdollista."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Automaattisen päivityksen ilmoitukset"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Näytä ilmoitus, kun päivitykset on asennettu automaattisesti."
+
+#. 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 ""
+"Jotkin asennetut ohjelmistot eivät ole yhteensopivia käyttöjärjestelmän %s "
+"kanssa. Jos jatkat, seuraavat poistetaan automaattisesti versiopäivityksen "
+"yhteydessä:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Yhteensopimaton ohjelmisto"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Jatka"
+
+#. 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 ""
+"Ohjelmisto, joka on asennettu ohjelmistolähteestä “%s”, ei saa enää "
+"minkäänlaisia päivityksiä."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Poistetaanko ohjelmistolähde käytöstä?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Poista"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Ota uudet ohjelmistolähteet käyttöön"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Lisää ohjelmistolähteitä valituilta kolmansilta osapuolilta — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Ohjelmistolähteet"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Ei ohjelmistolähteitä"
+
+#. 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 sovellus asennettu"
+msgstr[1] "%u sovellusta asennettu"
+
+#. 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 lisäosa asennettu"
+msgstr[1] "%u lisäosaa asennettu"
+
+#. 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 sovellus"
+msgstr[1] "%u sovellusta"
+
+#. 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 lisäosa"
+msgstr[1] "%u lisäosaa"
+
+#. 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 ja %s asennettu"
+msgstr[1] "%s ja %s asennettu"
+
+#. 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 "En tykkää lainkaan"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "En tykkää erityisemmin"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Ihan OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Tykkään siitä"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Tykkään siitä todella paljon"
+
+#. 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 "Käytä hieman enemmän aikaa arvostelun kirjoittamiseen"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Valitse tähtimäärä"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Yhteenveto on liian lyhyt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Yhteenveto on liian pitkä"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Kuvaus on liian lyhyt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Lähetä arvostelu"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Lähetä"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Arvosana"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Yhteenveto"
+
+#: src/gs-review-dialog.ui:97
+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.\""
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Arvostelu"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Katso mitä tietoja lähetetään lukemalla <a href=\"https://odrs.gnome.org/"
+"privacy\">yksityisyyskäytäntömme</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Haluatko tehdä ilmoituksen arvostelusta?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Ilmoita"
+
+#. 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 "Oliko tästä arvostelusta sinulle hyötyä?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Kyllä"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Ei"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "No jaa"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Ilmoita…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Poista…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Varmista että luotat toimittajaan, sillä sovellus ei ole eristetty"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Ei oikeuksia"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Verkon käyttö"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ei pääsyä verkkoa"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Käyttää järjestelmäpalveluja"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Käyttää istuntopalveluja"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Pääsy laitteisiin"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Ei pääsyä laitteisiin"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Täysi luku-/kirjoitusoikeus tiedostojärjestelmään"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Luku-/kirjoitusoikeus kotikansioon"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Täysi lukuoikeus tiedostojärjestelmään"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Kotikansion lukuoikeus"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Luku-/kirjoitusoikeus Lataukset-kansioon"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Lukuoikeus Lataukset-kansioon"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Voi lukea Lataukset-kansion kaiken sisällön"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Ei pääsyä tiedostojärjestelmään"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Ei lainkaan pääsyä 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:341
+msgid "Proprietary Code"
+msgstr "Suljettua koodia"
+
+#: 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 ""
+"Lähdekoodi ei ole julkista, joten sitä ei voi itsenäisesti auditoida, ja "
+"koodi voi olla turvatonta"
+
+#. 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 "Koodi auditoitavissa"
+
+#: 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 ""
+"Lähdekoodi on julkista ja itsenäisesti auditoitavissa, sovellus on "
+"todennäköisesti turvallinen"
+
+#. 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 "Sovelluksen kehittäjä on vahvistettu"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Turvattomia riippuvuuksia"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 on turvallinen"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s on turvaton"
+
+#. 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 "Turvallisuus"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Lähde"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Vanhentunut 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 "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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ei kuvakaappausta"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Kuvakaappausta ei löytynyt"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Kuvakaappaus on virheellinen"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Hakusivu"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Etsi sovelluksia"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Laiteohjelmistopäivitysten lataaminen lähteestä %s 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Päivitysten lataaminen epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Päivitysten lataaminen epäonnistui: levytilaa ei ole riittävästi"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Päivitysten lataaminen epäonnistui: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Päivitysten lataaminen epäonnistui: tunnistautuminen oli virheellinen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Päivitysluettelon noutaminen epäonnistui"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr ""
+"Sovelluksen %s asennus epäonnistui, koska lataaminen lähteestä %s epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Sovelluksen %s asennus epäonnistui, koska lataaminen epäonnistui"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"Sovelluksen %s asennus epäonnistui, koska runtime-kirjasto %s ei ole "
+"saatavilla"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Sovelluksen %s asennus epäonnistui, koska se ei ole tuettu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Asennus epäonnistui: internetyhteys vaadittiin, mutta sitä ei ollut "
+"saatavilla"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Asennus epäonnistui: sovelluksen muoto ei ole kelvollinen"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Sovelluksen %s asennus epäonnistui: levytilaa ei ole riittävästi"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Sovelluksen %s asennus epäonnistui: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Sovelluksen %s asennus epäonnistui: tunnistautuminen oli virheellinen"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Sovelluksen %s asennus epäonnistui: verkkovirta vaaditaan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Sovelluksen %s asennus 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" or
+#. * "Fedora Project [fedoraproject.org]"
+#: src/gs-shell.c:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr ""
+"Sovelluksen %s päivittäminen lähteestä %s ei onnistu, koska lataaminen "
+"epäonnistui"
+
+#. 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 update %s as download failed"
+msgstr "Sovelluksen %s päivitys epäonnistui, koska 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Päivitysten asentaminen lähteestä %s epäonnistui, koska lataaminen "
+"epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Päivitysten asentaminen ei onnistu, koska lataaminen epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Päivitys epäonnistui: internetyhteys vaadittiin, mutta sitä ei ollut "
+"saatavilla"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Sovelluksen %s päivitys epäonnistui: ei riittävästi levytilaa"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Päivitysten asentaminen ei onnistu: levytilaa ei ole riittävästi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Sovelluksen %s päivitys epäonnistui: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Päivitysten asentaminen ei onnistu: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Sovelluksen %s päivitys epäonnistui: tunnistautuminen oli virheellinen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Päivitysten asentaminen ei onnistu: tunnistautuminen oli virheellinen"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Sovelluksen %s päivitys epäonnistui: verkkovirta vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Päivitysten asentaminen ei onnistu: verkkovirta vaaditaan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Päivitysten asentaminen ei onnistunut"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Järjestelmäpäivitys %s epäonnistui, koska lataaminen epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Järjestelmäpäivitys %s epäonnistui: 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Järjestelmäpäivitys %s epäonnistui: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Järjestelmäpäivitys %s epäonnistui: 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:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Järjestelmäpäivitys %s epäonnistui: verkkovirta vaaditaan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Järjestelmäpäivitys %s epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Sovelluksen %s poistaminen epäonnistui: tunnistautuminen vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr ""
+"Sovelluksen %s poistaminen epäonnistui: tunnistautuminen oli virheellinen"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Sovelluksen %s poistaminen epäonnistui: verkkovirta vaadittiin"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Sovelluksen %s poistaminen epäonnistui"
+
+#. 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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Levytilaa ei ollut riittävästi — vapauta levytilaa ja yritä uudelleen"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Valitettavasti jokin meni pieleen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Tiedoston asentaminen epäonnistui: ei tuettu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Tiedoston asennus epäonnistui: tunnistautuminen epäonnistui"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Asentaminen epäonnistui: ei tuettu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Asentaminen epäonnistui: tunnistautuminen epäonnistui"
+
+#. 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 "Yhteys kohteeseen %s ei onnistu"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted 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:1975
+msgid "AC power is required"
+msgstr "Verkkovirta vaaditaan"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Akussa ei ole riittävästi virtaa"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Ohjelmistolähteet"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Päivitysvalinnat"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Tutki levy"
+
+#. 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 "Verkkoasetukset"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Käynnistä uudelleen nyt"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Lisätietoja"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Etsi"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Ensisijainen valikko"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Lue lisä_ä"
+
+#. 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 "Päivitykset"
+
+#. 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 "Application Data"
+msgstr "Sovelluksen data"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Tallennustila"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Välimuistissa olevat tiedot voi tyhjentää <a href=\"dummy\">_sovelluksen "
+"asetuksista</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Asennettu)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Asennetaan)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Poistetaan)"
+
+#. 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 "Asennetut päivitykset"
+
+#. 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 "Asennettu %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Päivityksiä ei asennettu"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Ohjelmistopäivitykset eivät ole ajan tasalla"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Tarkista ohjelmistopäivitykset."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kriittinen ohjelmistopäivitys valmis asennettavaksi"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Tärkeä ohjelmistopäivitys on valmis asennettavaksi."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kriittisiä ohjelmistopäivityksiä valmiina ladattavaksi"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Tärkeää: kriittiset ohjelmistopäivitykset odottavat."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Ohjelmistopäivitykset valmiit asennettavaksi"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Ohjelmistopäivitykset odottavat asennusta."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Ohjelmistopäivityksiä valmiina ladattavaksi"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Lataa odottavat ohjelmistopäivitykset."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u sovellus päivitetty"
+msgstr[1] "%u sovellusta päivitetty"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s on päivitetty."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Käynnistä sovellus uudelleen."
+
+#. 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 ja %s on päivitetty."
+
+#. 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 sovellus vaatii uudelleenkäynnistyksen."
+msgstr[1] "%u sovellusta vaatii uudelleenkäynnistyksen."
+
+#. 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 "Mukaan lukien %s, %s ja %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 "Käyttöjärjestemän päivitykset eivät ole saatavilla"
+
+#. 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 ""
+"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:728
+#, 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:732
+msgid "Software Upgrade Available"
+msgstr "Ohjelmistopäivitys saatavilla"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Ohjelmistopäivitykset epäonnistuivat"
+
+#. 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 "Tärkeä käyttöjärjestelmän päivityksen asennus epäonnistui."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Näytä tiedot"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Tarkastele"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Viimeksi tarkistettu: %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 ei ole enää tuettu."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Käyttöjärjestelmäsi ei ole enää tuettu."
+
+#. 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 ""
+"Tämä tarkoittaa, ettei käyttöjärjestelmään ole saatavilla enää "
+"tietoturvapäivityksiä."
+
+#. 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 "On suositeltavaa, että päivität käyttöjärjestelmän uudempaan versioon."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Saattaa aiheuttaa kuluja"
+
+#. 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 ""
+"Päivitysten tarkistaminen mobiilidatayhteydellä saattaa aiheuttaa suuren "
+"laskun."
+
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-updates-page.c:857
+msgid "Check _Anyway"
+msgstr "Tarkista _silti"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Ei verkkoa"
+
+#. 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 "Päivitysten tarkistaminen vaatii internetyhteyden."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Tarkista päivitykset"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Päivitykset"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Päivityssivu"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Ladataan päivityksiä…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Ajan tasalla"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Käytätkö mobiilidataa?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Tarkista silti"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Ei yhteyttä"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Yhdistä verkkoon tarkistaaksesi päivitykset."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Verkkoasetukset"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Virhe"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Päivityksiä hallitaan automaattisesti."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Käynnistä uudelleen ja päivitä"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Päivitä kaikki"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Sovelluspäivitykset"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Laitteen laiteohjelmisto"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s saatavilla"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Lue lisää uudesta versiosta"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Ladataan…"
+
+#. 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/%s ladattu"
+
+#. 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%% ladattu"
+
+#: src/gs-upgrade-banner.ui:42
+msgid "A major upgrade, with new features and added polish."
+msgstr "Suuri päivitys uusin ominaisuuksin ja parannuksin."
+
+#: src/gs-upgrade-banner.ui:187
+msgid "_Restart & Upgrade"
+msgstr "Käynnistä uu_delleen ja päivitä"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Varmuuskopioi tärkeät tiedostot ja muut tiedot ennen päivittämistä."
+
+#: 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 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;Päivitys;Päivitykset;Lähteet;Ohjelmistolähteet;"
+"Ohjelmistovarastot;Asenna;Poista;Ohjelma;Sovellus;Kauppa;"
+
+#. 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 "Järjestelmäpäivitykset"
+
+#. 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 ""
+"Yleiset järjestelmäpäivitykset, kuten tietoturva- ja korjauspäivitykset sekä "
+"suorituskykyä parantavat päivitykset."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Ladataan nostokuvia…"
+
+#. 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 "Käyttöjärjestelmän %s päivitys uusin ominaisuuksin ja parannuksin."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "Gnomen verkkoselain"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Ladataan versiopäivitystietoja…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Järjestelmäkansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Koti-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Tietokoneen järjestelmäkansiot"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Tietokoneen järjestelmäasetukset kansiosta /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Työpöytäkansio"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Työpöytä-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Asiakirjat-kansio"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Asiakirjat-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Musiikkikansio"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Musiikki-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Kuvat-kansio"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Kuvat-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Julkinen Jaettu-kansio"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Julkinen Jaettu-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videot-kansio"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videot-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Mallit-kansio"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Mallit-alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Käyttäjän välimuistikansio"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Käyttäjän välimuistikansion alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Käyttäjän asetuskansio"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Käyttäjän asetuskansion alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Käyttäjän datakansio"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Käyttäjän datakansion alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Käyttäjän suoritusaikainen kansio"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Käyttäjän suoritusaikaisen kansion alikansio %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Noudetaan flatpak-metatietoja kohteelle %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Etäpää “%s” ei salli kohteen “%s” asennusta luultavasti suodattimen vuoksi. "
+"Poista suodatin ja toista asennus. Yksityiskohtainen virhe: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Kamerapäivitys %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "USB-vastaanotinlaitteen %s päivitys"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware-laiteohjelmisto"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Asennetaanko allekirjoittamaton ohjelmisto?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Ladataanko allekirjoittamaton ohjelmisto?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Päivitetäänkö allekirjoittamaton ohjelmisto?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paketit"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "järjestelmä"
+
+#~ 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 "_Installed"
+#~ msgstr "_Asennetut"
+
+#~ msgid "_Updates"
+#~ msgstr "_Päivitykset"
+
+#~ 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 "Reference"
+#~ msgstr "Viittaus"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Tuntematon ohjelmistolisenssi"
+
+#~ 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 "Remove"
+#~ msgstr "Poista"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Ei erillisiä ohjelmistolähteitä"
+
+#~ msgid "_Enable"
+#~ msgstr "_Käytä"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Käynnistä uudelleen nyt"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s valmiina asennettavaksi"
+
+#~ 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, %R"
+#~ msgstr "Eilen, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Tiedoston tallentaminen epäonnistui"
+
+#~ 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 "App ID"
+#~ msgstr "Sovelluksen tunniste"
+
+#~ 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 "Delete Design"
+#~ msgstr "Poista suunnitelma"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Järjestelmäpäivitys"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Ei voitu ostaa %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Unohdin salasanani"
+
+#~ 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 "U_pdate All"
+#~ msgstr "Päivitä _kaikki"
+
+#~ 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 "_Install All"
+#~ msgstr "_Asenna kaikki"
+
+#~ 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 "web app"
+#~ msgstr "verkkosovellus"
+
+#~ 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 "The update could not be completed."
+#~ msgstr "Päivitystä ei voitu viedä loppuun."
+
+#~ 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 "No sources found."
+#~ msgstr "Lähteitä ei löytynyt."
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ 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/fr.po b/po/fr.po
new file mode 100644
index 0000000..a7afb9b
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,5407 @@
+# French translation for gnome-software.
+# Copyright (C) 2014-2022 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+#
+# Alain Lojewski <allomervan@gmail.com>, 2014-2018.
+# Guillaume Bernard <associations@guillaume-bernard.fr>, 2017-2021.
+# William Oprandi <william.oprandi@gmail.com>, 2019.
+# Adrien Plazas <kekun.plazas@laposte.net>, 2019.
+# Julien Humbert <julroy67@gmail.com>, 2020.
+# Hydroxyp <hydroxyp@gmail.com>, 2020.
+# Thibault Martin <thibaultamartin@gnome.org>, 2020.
+# Alexandre Franke <afranke@gnome.org>, 2022.
+# Claude Paroz <claude@2xlibre.net>, 2022.
+# Charles Monzat <charles.monzat@free.fr>, 2018-2022.
+#
+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: 2022-09-09 20:47+0000\n"
+"PO-Revision-Date: 2022-09-18 11:52+0200\n"
+"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\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 40.0\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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2018
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Le projet GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"L’horodatage du dernier moment où le système était en ligne et a obtenu des "
+"mises à jour"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "Le score minimum pour les appréciations"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Propose des mises à niveau pour les versions à l’essai"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://fr.wikipedia.org/wiki/Logiciel_propri%C3%A9taire'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Évaluation par âge"
+
+#: 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 "Comment contribuer à des informations manquantes"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paquet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "En attente"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Installation en attente"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Suppression en attente"
+
+#: 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 "Installée"
+
+#. 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 "Installation en cours"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Suppression en cours"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Désinstaller"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Réseau"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Peut communiquer à travers le réseau"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Services système"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Services de session"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Périphériques"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Peut accéder aux fichiers du système"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Dossier personnel"
+
+#: 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 "Peut voir, éditer et créer des fichiers"
+
+#: 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 "Peut voir les fichiers"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Dossier de téléchargement"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Paramètres"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Peut voir et modifier n’importe quel paramètre"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Système d’affichage désuet"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Utilise un vieux système d’affichage non sécurisé"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Fuite du bac à sable"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Peut s’échapper du bac à sable et contourner d’autres restrictions"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Détails de la mise à jour"
+
+#. 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 "Aucune description de la mise à jour n’a été fournie."
+
+#: 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 "Retourner en arrière"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Demande davantage 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:855
+msgid "Reviews"
+msgstr "Évaluations"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Aucune évaluation trouvée pour cette application."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Aucune évaluation"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Historique des versions"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nouveautés de la version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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: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 "Show verbose debugging information"
+msgstr "Afficher les informations détaillées de débogage"
+
+#: 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 update preferences"
+msgstr "Afficher les préférences de mise à jour"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 Les contributeurs de Logiciels de GNOME"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Alain Lojewski <allomervan@gmail.com>\n"
+"Guillaume Bernard <associations@guillaume-bernard.fr>\n"
+"Adrien Plazas <kekun.plazas@laposte.net>\n"
+"Julien Humbert <julroy67@gmail.com>\n"
+"Charles Monzat <charles.monzat@free.fr>"
+
+#. 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 "À propos de Logiciels"
+
+#. 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 "Une façon élégante de gérer les applications de votre système."
+
+#. 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 "Désolé, il n’y a aucune information sur cette application."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Peut accéder aux périphériques matériels"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Peut accéder à des fichiers arbitraires"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Peut acquérir des permissions arbitraires"
+
+#. 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 "Vérifiée par votre distribution"
+
+#. 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 "Fournie par un tiers"
+
+#. 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 "Code propriétaire"
+
+#. 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 "Code vérifiable"
+
+#. 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 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 "Le logiciel n’est plus pris en charge"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Non fiable"
+
+#: 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 "Mobile uniquement"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Fonctionne uniquement sur un petit écran"
+
+#: 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 "Ordinateur uniquement"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Fonctionne uniquement sur un grand écran"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Non-concordance de la taille de l’écran"
+
+#: 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 prend pas en charge la taille actuelle de votre écran"
+
+#: 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 "Nécessite un écran tactile"
+
+#: 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 "Nécessite un clavier"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Nécessite une souris"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Manette de jeu nécessaire"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptative"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Fonctionne sur les téléphones, tablettes et ordinateurs"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Nécessite probablement un clavier ou une souris"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Ne contient aucun contenu inapproprié lié à l’âge"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visiter le site 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:159
+msgid "Install…"
+msgstr "Installer…"
+
+#. 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 "Annuler"
+
+#. 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 "Installer"
+
+#. 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 "Mettre à jour"
+
+#. 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 "Désinstaller"
+
+#. 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 "Désinstallation en cours"
+
+#. 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 "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:337 src/gs-shell-search-provider.c:264
+#, 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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renommée depuis %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Aider à traduire %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 ""
+"Le logiciel « %s » est conçu, développé et traduit par une communauté "
+"internationale de bénévoles.\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:5
+msgid "Translations"
+msgstr "Traductions"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Site web de _traduction"
+
+#. 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 "Authentification distante sur %s requise (nom de domaine %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Authentification requise"
+
+#: 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 "A_nnuler"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Authentification"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Utilisateur"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Mot de _passe"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nouveautés et mises à jour"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Autres logiciels"
+
+#. 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 "Veuillez saisir un nombre de 1 à %u : "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Choisissez une application :"
+
+#: 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 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 est maintenant installée"
+
+#. 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 "Un redémarrage est nécessaire pour terminer l’installation."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Les mises à jour système sont maintenant installées"
+
+#. 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 "Les mises à jour récemment installées sont maintenant consultables"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Redémarrer"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Lancer"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Installer le logiciel tiers ?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Activer les dépôts logiciels tiers ?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s n’est pas un <a href=\"https://fr.wikipedia.org/wiki/Free/"
+"Libre_Open_Source_Software\">logiciel libre et ouvert</a> et est distribué "
+"par « %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 est distribué par « %s »."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Ne plus m’avertir"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Voici les détails des erreurs du gestionnaire de paquets :"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Détails"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Accepter"
+
+#. 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] "Une mise à jour a été installée sur ce système"
+msgstr[1] "Des mises à jour ont été installées sur ce système"
+
+#. 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] "Une application a été supprimée"
+msgstr[1] "Des applications ont été supprimées"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Pas maintenant"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "À l’instant"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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 "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:332
+msgid "Find in Software"
+msgstr "Démarrer Logiciels"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Afficher davantage"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Moins d’infos"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Suppression en cours…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Nécessite un redémarrage pour terminer l’installation"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Mise à jour en attente…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Préparation…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Désinstallation en cours…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Installer"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Redémarrer"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Installer…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Autres applications par %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+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:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Impossible de trouver « %s »"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Page des descriptions"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Chargement des détails de l’application…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Ce logiciel n’est pas disponible dans votre langue et apparaîtra en anglais "
+"américain (US English)."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Aider à _traduire"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Ouvrir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "Mettre à _jour"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Téléchargement"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Extensions"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Les extensions sélectionnées vont être installées avec l’application."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Dépôt de logiciels inclus"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Aucun dépôt de logiciels inclus"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Dépôt de logiciels identifié"
+
+#: src/gs-details-page.ui:642
+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:643
+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:708
+msgid "No Metadata"
+msgstr "Aucune métadonnée"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Site _web du projet"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "Faire un _don"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribuer aux _traductions"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Signaler un problème"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "Aid_e"
+
+#. 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 "_Rédiger une évaluation"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Toutes les évaluations"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+msgid "Downloading extra metadata files…"
+msgstr "Téléchargement de nouveaux fichiers de métadonnées…"
+
+#. 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: 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] "Polices disponibles pour le script %s"
+msgstr[1] "Polices disponibles pour les scripts %s"
+
+#. 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] "Logiciel disponible pour %s"
+msgstr[1] "Logiciels disponibles pour %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Logiciel demandé introuvable"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s sont introuvables"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "sur le site 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"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 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 "Aucune application disponible pour prendre en charge %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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 ""
+"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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Échec de la recherche, aucun résultat : %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Format de fichier %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Impossible de trouver le logiciel demandé"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Page des Codecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Prise en charge de l’ordinateur"
+
+#: 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 "Prend en charge l’utilisation sur un grand écran"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Prise en charge de l’ordinateur inconnue"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Nécessite un grand écran"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Ordinateur non pris en charge"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Non utilisable avec un grand écran"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Prise en charge du mobile"
+
+#: 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 "Prend en charge l’utilisation sur un petit écran"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Prise en charge du mobile inconnue"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Nécessite un petit écran"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobile non pris en charge"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Non utilisable avec un petit écran"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Prise en charge du clavier"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Prise en charge du clavier inconnue"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Clavier requis"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Prend en charge les claviers"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Clavier non pris en charge"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Non utilisable avec un clavier"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Prise en charge de la souris"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+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:656
+msgid "Mouse Support Unknown"
+msgstr "Prise en charge de la souris inconnue"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Souris requise"
+
+#: src/gs-hardware-support-context-dialog.c:663
+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:665
+msgid "Mouse Not Supported"
+msgstr "Souris non prise en charge"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Prise en charge de l’écran tactile"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Prise en charge de l’écran tactile inconnue"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Écran tactile requis"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Prend en charge les écrans tactiles"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Écran tactile non pris en charge"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Non utilisable avec un écran tactile"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Manette de jeu requise"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Nécessite une manette de jeu"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Prise en charge de la manette de jeu"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s fonctionne 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Prise en charge du matériel"
+
+#. 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 "Installées"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Page installée"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Applications"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Applications web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Applications système"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Construit par la communauté"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Il s’agit d’un logiciel libre développé par une communauté de volontaires, "
+"et publié sous <a href=\"%s\">licence %s</a>.\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: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 ""
+"Il s’agit d’un logiciel libre développé par une communauté de volontaires, "
+"et publié sous licence %s.\n"
+"\n"
+"Vous pouvez participer et aider à son amélioration."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Propriétaire"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_En savoir plus"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Téléchargement du catalogue de logiciels"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Chargement de la page"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Démarrage…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Mises à jour automatiques en pause"
+
+#: 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 ""
+"Le réseau actuel est un réseau avec quotas. Les connexions avec quotas sont "
+"assorties de limites de données ou de frais. Afin d’économiser les données, "
+"les mises à jour automatiques ont été mises en pause.\n"
+"\n"
+"Les mises à jour automatiques reprendront dès qu’un réseau sans quotas sera "
+"disponible. Néanmoins, il est toujours possible d’installer manuellement les "
+"mises à jour.\n"
+"\n"
+"Si le réseau actuel a été incorrectement identifié comme étant avec quotas, "
+"il est possible de modifier ce paramètre."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Ouvrir les _paramètres réseau"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Page des modérations"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Il n’y a pas d’évaluation a modérer"
+
+#: 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:108
+msgid "Beta"
+msgstr "Bêta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+msgid "User"
+msgstr "Utilisateur"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Ajouts"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Suppressions"
+
+#. 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 "Mises à jour"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Retour à des versions antérieures"
+
+#. 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 "sources externes sélectionnées"
+
+#. 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 ""
+"Fournit l’accès à des logiciels supplémentaires à partir de %s. Certains "
+"logiciels propriétaires sont inclus."
+
+#. 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 "Activer"
+
+#. 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 "Explorer"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Page d’aperçu"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Activer les dépôts logiciels tiers ?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Autres catégories"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Aucune donnée de l’application trouvée"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Inconnue"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "L’utilisateur a refusé l’installation"
+
+#. 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 "Préparation de %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 "Voulez-vous vraiment supprimer le dépôt %s ?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Voulez-vous vraiment désinstaller %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 va être désinstallée et il vous faudra la réinstaller pour pouvoir "
+"l’utiliser à nouveau."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Préférences de mise à jour"
+
+#: 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 ""
+"Pour éviter les frais et les limites de réseau, les mises à jour logicielles "
+"ne sont pas automatiquement téléchargées sur les connexions mobiles ou avec "
+"quotas."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Mises à jour automatiques"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Télécharge et installe les mises à jour logicielles en arrière-plan, lorsque "
+"cela est possible."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notifications de mise à jour automatique"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Afficher des notifications lorsque des mises à jour ont été installées "
+"automatiquement."
+
+#. 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 ""
+"Certains logiciels actuellement installés sont incompatibles avec %s. Si "
+"vous continuez, ceux listés ci-dessous seront automatiquement supprimés "
+"pendant la mise à niveau :"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Logiciels incompatibles"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continuer"
+
+#. 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 ""
+"Les logiciels installés depuis « %s » cesseront de recevoir des mises à jour."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Désactiver le dépôt ?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Supprimer"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Activer les nouveaux dépôts"
+
+#: src/gs-repos-dialog.c:509
+msgid "Turn on new repositories when they are added."
+msgstr "Active 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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Dépôts de logiciels"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Aucun dépôt"
+
+#. 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 application installée"
+msgstr[1] "%u applications installées"
+
+#. 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 extension installée"
+msgstr[1] "%u extensions installées"
+
+#. 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 application"
+msgstr[1] "%u applications"
+
+#. 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 extension"
+msgstr[1] "%u extensions"
+
+#. 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 et %s installée"
+msgstr[1] "%s et %s installées"
+
+#. 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 "Détestable"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Passable"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Acceptable"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Bonne"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Excellente"
+
+#. 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 "Veuillez consacrer plus de temps à la rédaction de l’appréciation"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Veuillez choisir une appréciation"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Le résumé est trop court"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Le résumé est trop long"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La description est trop courte"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Envoyer l’appréciation"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Envoyer"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Évaluation"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Résumé"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Donnez un bref résumé de votre appréciation, comme : « Application géniale, "
+"je recommande »."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Appréciation"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Que pensez-vous de l’application ? Argumentez vos motifs."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Vous trouverez la liste des données transmises dans notre <a href=\"https://"
+"odrs.gnome.org/privacy\">politique de confidentialité</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Signaler l’appréciation ?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Signaler"
+
+#. 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 "Est-ce que cette appréciation vous a été utile ?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Oui"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Non"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Bof"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Signaler…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Supprimer…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Vérifiez que vous faites confiance au fournisseur, car l’application ne "
+"s’exécute pas dans un bac à sable"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Aucune permission"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Accès au réseau"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Aucun accès au réseau"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Utilise les services système"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Utilise les services de session"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Accès aux périphériques"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Aucun accès aux périphériques"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Accès en lecture/écriture au dossier personnel"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Accès complet en lecture au système de fichiers"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Accès en lecture au dossier personnel"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Accès en lecture/écriture au dossier de téléchargement"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Accès en lecture au dossier de téléchargement"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Aucun accès au système de fichiers"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Ne peut en aucun cas accéder au 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:341
+msgid "Proprietary Code"
+msgstr "Code propriétaire"
+
+#: 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 ""
+"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: 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 "Code vérifiable"
+
+#: 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 ""
+"Le code source est public et peut être vérifié de manière indépendante, ce "
+"qui rend l’application plus fiable"
+
+#. 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 "Le développeur de l’application est vérifié"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dépendances non sécurisées"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 est fiable"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s est non fiable"
+
+#. 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 "Sécurité"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Source"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Version du SDK obsolète"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Aucune capture d’écran fournie"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Capture d’écran introuvable"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Capture d’écran non valide"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Page de recherche"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Rechercher des applications"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+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:1293
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Impossible de télécharger les mises à jour : accès à Internet nécessaire "
+"mais indisponible"
+
+#. 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 ""
+"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:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Impossible de télécharger les mises à jour : espace disque insuffisant"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Impossible de télécharger les mises à jour : authentification requise"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr ""
+"Impossible de télécharger les mises à jour : authentification non valide"
+
+#. 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 ""
+"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:1331
+msgid "Unable to get list of updates"
+msgstr "Impossible d’obtenir la liste des mises à jour"
+
+#. 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 "Impossible d’installer %s : le téléchargement depuis %s a échoué"
+
+#. 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 "Impossible d’installer %s : le téléchargement a échoué"
+
+#. 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 ""
+"Impossible d’installer %s : l’environnement d’exécution %s n’est pas "
+"disponible"
+
+#. 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 "Impossible d’installer %s : il n’est pas pris en charge"
+
+#. 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 ""
+"Installation impossible : l’accès à Internet est nécessaire mais indisponible"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Installation impossible : le format de l’application n’est pas valide"
+
+#. 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 "Impossible d’installer %s : il n’y a pas assez d’espace disque"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Impossible d’installer %s : authentification requise"
+
+#. 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 "Impossible d’installer %s : authentification non valide"
+
+#. 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 ""
+"Impossible d’installer %s : vous n’avez pas la permission d’installer des "
+"logiciels"
+
+#. 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 "Impossible d’installer %s : branchez l’alimentation secteur"
+
+#. 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 "Impossible d’installer %s : la batterie est trop peu chargée"
+
+#. 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 "Impossible d’installer %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 ""
+"Impossible de mettre à jour %s depuis %s, car le téléchargement a échoué"
+
+#. 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 "Impossible de mettre à jour %s : le téléchargement a échoué"
+
+#. 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 ""
+"Impossible d’installer les mises à jour depuis %s, car le téléchargement a "
+"échoué"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Impossible d’installer les mises à jour, car le téléchargement a échoué"
+
+#. 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 ""
+"Impossible de mettre à jour : l’accès à Internet est nécessaire mais "
+"indisponible"
+
+#. 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 "Impossible de mettre à jour %s : il n’y a pas assez d’espace disque"
+
+#. 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 "Impossible d’installer les mises à jour : espace disque insuffisant"
+
+#. 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 "Impossible de mettre à jour %s : authentification requise"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr ""
+"Impossible d’installer les mises à jour : une authentification était requise"
+
+#. 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 "Impossible de mettre à jour %s : authentification non valide"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Impossible d’installer les mises à jour : l’authentification n’était pas "
+"valide"
+
+#. 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 ""
+"Impossible de mettre à jour %s : vous n’avez pas la permission de mettre à "
+"jour les logiciels"
+
+#. 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 ""
+"Impossible d’installer les mises à jour : vous n’avez pas la permission de "
+"mettre à jour les logiciels"
+
+#. 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 "Impossible de mettre à jour %s : branchez l’alimentation secteur"
+
+#. 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 ""
+"Impossible d’installer les mises à jour : branchez l’alimentation secteur"
+
+#. 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 "Impossible de mettre à jour %s : la batterie est trop peu chargée"
+
+#. 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 ""
+"Impossible d’installer les mises à jour : la batterie est trop peu chargée"
+
+#. 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 "Impossible de mettre à jour %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Impossible d’installer les mises à jour"
+
+#. 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 "Impossible de mettre à niveau vers %s depuis %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 "Impossible de mettre à niveau vers %s : le téléchargement a échoué"
+
+#. 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 ""
+"Impossible de mettre à niveau vers %s : l’accès à Internet était nécessaire "
+"mais n’était pas disponible"
+
+#. 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 "Impossible de mettre à niveau vers %s : 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Impossible de mettre à niveau vers %s : 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Impossible de mettre à niveau vers %s : 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:1700
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr ""
+"Impossible de mettre à niveau vers %s : vous n’avez pas la permission "
+"d’effectuer la mise à niveau"
+
+#. 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 ""
+"Impossible de mettre à niveau vers %s : 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:1712
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr ""
+"Impossible de mettre à niveau vers %s : la batterie est trop peu chargée"
+
+#. 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 "Impossible de mettre à niveau vers %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 "Impossible de désinstaller %s : authentification requise"
+
+#. 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 "Impossible de désinstaller %s : authentification non valide"
+
+#. 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 ""
+"Impossible de désinstaller %s : vous n’avez pas la permission de "
+"désinstaller le logiciel"
+
+#. 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 "Impossible de désinstaller %s : branchez l’alimentation secteur"
+
+#. 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 "Impossible de désinstaller %s : la batterie est trop peu chargée"
+
+#. 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 "Impossible de désinstaller %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 "Impossible de lancer %s : %s n’est pas installé"
+
+#. 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 "Espace disque insuffisant — veuillez en libérer et réessayez"
+
+#. 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 "Désolé, quelque chose n’a pas marché"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Impossible d’installer le fichier : il n’est pas pris en charge"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Impossible d’installer le fichier : l’authentification a échoué"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Impossible d’installer : non pris en charge"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Impossible d’installer : l’authentification a échoué"
+
+#. 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 "Impossible de contacter %s"
+
+#. 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 "Logiciels doit être redémarré pour utiliser les nouveaux greffons."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Branchez l’alimentation secteur"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "La batterie est trop peu chargée"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Dépôts de logiciels"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Préférences de _mise à jour"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examiner le disque"
+
+#. 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 "Paramètres réseau"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Redémarrer maintenant"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Davantage d’informations"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Rechercher"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "En savoir _plus"
+
+#. 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 "Mises à jour"
+
+#. 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 "Application Data"
+msgstr "Données d’application"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Stockage"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Les données mises en cache peuvent être effacées à partir des <a "
+"href=\"dummy\">_paramètres de l’application</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (installée)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (installation en cours)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (suppression en cours)"
+
+#. 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 "Mises à jour installées"
+
+#. 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 "Installées le %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Aucune mise à jour installée"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Les mises à jour logicielles sont obsolètes"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Veuillez rechercher des mises à jour logicielles."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Mise à jour logicielle critique prête à l’installation"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Une importante mise à jour logicielle est prête à être installée."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Mises à jour logicielles critiques disponibles au téléchargement"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Important : des mises à jour logicielles critiques sont en attente."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Mises à jour logicielles prêtes à l’installation"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr ""
+"Des mises à jour logicielles sont en attente et prêtes à être installées."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Mises à jour logicielles disponibles au téléchargement"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Veuillez télécharger les mises à jour logicielles en attente."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u application mise à jour"
+msgstr[1] "%u applications mises à jour"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s a été mise à jour."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Veuillez redémarrer l’application."
+
+#. 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 et %s ont été mises à jour."
+
+#. 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 application nécessite un redémarrage."
+msgstr[1] "%u applications nécessitent un redémarrage."
+
+#. 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 "Inclut %s, %s et %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 "Les mises à jour du système d’exploitation sont indisponibles"
+
+#. 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 ""
+"Mettez à niveau pour continuer à bénéficier des mises à jour de sécurité."
+
+#. 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 "Une nouvelle version de %s est disponible à l’installation"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Des mises à niveau logicielles sont disponibles"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Échec des mises à jour logicielles"
+
+#. 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 ""
+"Échec d’installation d’une importante mise à jour du système d’exploitation."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Afficher les détails"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Consulter"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Dernière vérification : %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 n’est plus pris en charge."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Votre système d’exploitation n’est plus pris en charge."
+
+#. 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 "Cela signifie qu’il ne reçoit plus de mises à jour de sécurité."
+
+#. 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 "Il est recommandé de mettre à niveau vers une version plus récente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Il peut y avoir facturation"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Rechercher _quand même"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Aucun réseau"
+
+#. 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 "L’accès à Internet est nécessaire pour rechercher des mises à jour."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Rechercher des mises à jour"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Mises à jour"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Page des mises à jour"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Chargement des mises à jour…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+msgid "This could take a while."
+msgstr "Cela peut prendre du temps."
+
+#. 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 "À jour"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Utiliser les données mobiles ?"
+
+#: src/gs-updates-page.ui:243
+msgid ""
+"Checking for updates when 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."
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "_Rechercher quand même"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Aucune connexion"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Se connecter pour rechercher des mises à jour."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Paramètres du _réseau"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Erreur"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Les mises à jour sont gérées automatiquement."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Redémarrer et mettre à jour"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Tout mettre à jour"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Mises à jour de l’application"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Micrologiciel du périphérique"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponible"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "En apprendre davantage sur la nouvelle version"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Téléchargement…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u %% téléchargé"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Redémarrer et mettre à jour"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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 ""
+"mises à jour;mise à niveau;sources;dépôts;préférences;installer;désinstaller;"
+"programmes;logiciels;applications;magasin;boutique;"
+
+#. 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 "Mises à jour système"
+
+#. 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 ""
+"Mises à jour générales du système, telles que la sécurité ou les corrections "
+"d’anomalies, et améliorations des performances."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Téléchargement des images en vedette…"
+
+#. 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 "Une mise à jour %s avec de nouvelles fonctionnalités et corrections."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "Web de GNOME"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Téléchargement des informations de mise à niveau…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Dossier système %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Sous-dossier personnel %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Dossiers du système hôte"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuration du système hôte à partir de /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Dossier Bureau"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Sous-dossier Bureau %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dossier Documents"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Sous-dossier Documents %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Dossier Musique"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Sous-dossier Musique %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Dossier Images"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Sous-dossier Images %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Dossier partagé public"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Sous-dossier partagé public %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Dossier Vidéos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Sous-dossier Vidéos %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Dossier Modèles"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Sous-dossier Modèles %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Dossier personnel de cache"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Sous-dossier personnel de cache %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Dossier personnel de configuration"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Sous-dossier personnel de configuration %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Dossier personnel de données"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Sous-dossier personnel de données %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Dossier personnel d’exécution"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Sous-dossier personnel d’exécution %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, 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:3579
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"« %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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Mise à jour du récepteur USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Micrologiciel"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Installer le logiciel non signé ?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Télécharger le logiciel non signé ?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Mettre à jour le logiciel non signé ?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paquets"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
diff --git a/po/fur.po b/po/fur.po
new file mode 100644
index 0000000..179e6b8
--- /dev/null
+++ b/po/fur.po
@@ -0,0 +1,7220 @@
+# 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 <f.t.public@gmail.com>, 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: 2022-09-22 16:06+0000\n"
+"PO-Revision-Date: 2022-09-25 21:53+0200\n"
+"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
+"Language-Team: Friulian <f.t.public@gmail.com>\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 1.1 RC2\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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Software al permet di cjatâ e instalâ gnovis aplicazions e estensions di "
+"sisteme e gjavâ aplicazions esistentis."
+
+#: 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 ""
+"Software al met in evidence te bacheche 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. Al 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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2043
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Il progjet GNOME"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Il servidôr di doprâ pes recensions des aplicazions"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "I ponts minims di karma pes recensions"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Permet l'acès al dialic dai dipuesits software"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Ufrìs avanzaments par distribuzions preliminaris"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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"
+
+# fâ pagjine par software proprietari su vikipedie
+#. 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://it.wikipedia.org/wiki/Software_proprietario'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Fasse di etât"
+
+#: 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 "Cemût contribuî cu lis informazions che a mancjin"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Pachet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "In spiete"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalazion in spiete"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Rimozion in spiete"
+
+#: 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 "Instalade"
+
+#. 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 "Instalazion"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Rimozion"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Disinstale"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Rêt"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Al pues comunicâ vie rêt"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Servizis di sisteme"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Servizis di session"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositîfs"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Al pues acedi ai files dal dispositîf dal sisteme"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Cartele home"
+
+#: 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 "Al pues viodi, modificâ e creâ i file"
+
+#: 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 "Al pues viodi i file"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Cartele dai discjariaments"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Impostazions"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Al pues viodi e modificâ cualsisei impostazion"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sisteme di visualizazion vecje maniere"
+
+#: src/gs-app-details-page.c:80
+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:81
+msgid "Sandbox escape"
+msgstr "Jessude dal isolament"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Al pues lâ fûr dal isolament e imbroiâ cualsisei altre restrizion"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detais dal inzornament"
+
+#. 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 "Nissune descrizion dal inzornament disponibile."
+
+#: 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 "Torne indaûr"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+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:855
+msgid "Reviews"
+msgstr "Recensions"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "No je stade cjatade nissune recension par cheste aplicazion."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Nissune recension"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Cronologjie des versions"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novitâts te version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 src/gs-review-row.c:63
+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: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 "Show verbose debugging information"
+msgstr "Mostre informazion detaiadis di debug"
+
+#: 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 update preferences"
+msgstr "Mostre lis preferencis di inzornament"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 i colaboradôrs di GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Fabio Tomat <f.t.public@gmail.com>"
+
+#. 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 "Informazions su Software"
+
+#. 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 "Un biel mût di ministrâ il software sul sisteme."
+
+#. 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 "Scuse! Nissun detai par chê aplicazion."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Al pues acedi ai dispositîfs hardware"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Al pues acedi a files arbitraris"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Al pues cuistâ permès arbitraris"
+
+#. 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 "Revisionât de tô distribuzion"
+
+#. 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 "Furnît di une tierce part"
+
+#. 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 "Codiç proprietari"
+
+#. 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 "Codiç che si pues ispezionâ"
+
+#. 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 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 "Software no plui supuartâ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/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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Insigûr"
+
+#: 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 "Dome celulâr"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Al funzione dome su schermi piçul"
+
+#: 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 "Dome scritori"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Al funzione dome su schermi grant"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Dimension schermi no adate"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Nol supuarte la tô dimension di schermi atuâl"
+
+#: 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 "Al domande un schermi tatil"
+
+#: 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 "E covente une tastiere"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Al covente un mouse"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Al covente il gamepad"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adatîf"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Al funzione su celulârs, tablets e scritoris"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probabil che al domandi une tastiere o un mouse"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Nol conten contignûts inadats pe etât"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visite il sît 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:159
+msgid "Install…"
+msgstr "Instale…"
+
+#. 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 "Anule"
+
+#. 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 "Instale"
+
+#. 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 "Inzorne"
+
+#. 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 "Disinstale"
+
+#. 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 "Daûr a disinstalâ"
+
+#. 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 "Nol è pussibil doprâ il dispositîf intant che tu inzornis."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Cambiât non di %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Jude a voltâ %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 al è progjetât, svilupât e tradot di une comunitât internazionâl di "
+"volontaris.\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:5
+msgid "Translations"
+msgstr "Traduzions"
+
+#: src/gs-app-translation-dialog.ui:92
+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:13
+msgid "Login Required"
+msgstr "Acès necessari"
+
+#: 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 "_Anule"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Jentre"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Utent"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Password"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Gnovis e inzornadis"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Altri software"
+
+#. 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 "Inserìs un numar di 1 a %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Sielç une aplicazion:"
+
+#: 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 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 al è cumò instalât"
+
+#. 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 "Al è necessari tornâ a inviâ par rindi efetivis lis modifichis."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "I inzornaments di sisteme a son cumò instalâts"
+
+#. 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 ""
+"I inzornaments instalâts cumò denant a son disponibii par jessi esaminâts"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Torne invie"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Eseguìs"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalâ software di tiercis parts?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Abilitâ il dipuesit software di tiercis parts?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nol è <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\"> software libar e open source</a> e al è furnît di “%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 al è furnît di “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "No sta visâmi plui"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+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:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detais"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Acete"
+
+#. 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] "Al è stât instalât un inzornament"
+msgstr[1] "I inzornaments a son stâts instalâts"
+
+#. 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] "Une aplicazion e je stade gjavade"
+msgstr[1] "A son stadis gjavadis aplicazions"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "No cumò"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Propite cumò"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostre altris"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostre di mancul"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Daûr a gjavâ…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Al covente tornâ a inviâ par completâ la instalazion"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "In spiete pal inzornament…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Daûr a prontâ…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Daûr a disinstalâ…"
+
+#. 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 "_Instale"
+
+#: src/gs-details-page.c:886
+msgid "_Restart"
+msgstr "To_rne invie"
+
+#. 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 "_Instale…"
+
+#. 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 "Altris Apps di %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+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:1732 src/gs-details-page.c:1748
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Impussibil cjatâ “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Pagjine di detais"
+
+# recensions des aplicazions o recensions de aplicazion?
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Daûr a discjariâ i detais de aplicazion…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Jude a _tradusi"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Vierç"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Inzorne"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Daûr a discjariâ"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Estensions"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Lis estensions selezionadis a vignaran instaladis cu la aplicazion."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Dipuesit software includût"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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, "
+"cussì ancje l'acès a altri software."
+
+#: src/gs-details-page.ui:605
+msgid "No Software Repository Included"
+msgstr "Nissun dipuesit software includût"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Dipuesit software identificât"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Dopre nome i dipuesits software che tu ti fidis."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nissun metadât"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Sît _web dal progjet"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Done"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribuìs aes _traduzions"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Segnale un probleme"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Jude"
+
+#. 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 "_Scrîf recension"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Dutis lis recensions"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:244
+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:142
+msgid " and "
+msgstr " e "
+
+#. 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] "Caratars disponibii pal script %s"
+msgstr[1] "Caratars disponibii pai script %s"
+
+#. 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] "Software disponibil par %s"
+msgstr[1] "Software disponibii par %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Software domandât no cjatât"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s no cjatât"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "tal sît 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"Lis informazion su %s, e cussì ancje lis opzions su cemût vê lis aplicazions "
+"che a mancjin, a podaressin jessi cjatadis su %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 "No je nissune aplicazion disponibile pal supuart 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:376
+#, 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: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 ""
+"Lis informazion su %s, e cussì ancje lis opzions su cemût vê une aplicazion "
+"che e supuarte chest formât, a podaressin jessi cjatadis su %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Impussibil cjatâ risultâts de ricercje: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Formât di file %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Impussibil cjatâ il software domandât"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Pagjine dai codec"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Supuart pal scritori"
+
+#: 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 "E supuarte la utilizazion suntun schermi grant"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Supuart pal scritori no cognossût"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "E à bisugne di un schermi grant"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Scritori no supuartât"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Nol è pussibil doprâle suntun schermi grant"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Supuart pe conession mobile"
+
+#: 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 "E supuarte la utilizazion suntun schermi piçul"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Supuart pe conession mobile no cognossût"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "E à bisugne di un schermi piçul"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Conession mobile no supuartade"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Nol è pussibil doprâle suntun schermi piçul"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Supuart pe tastiere"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Supuart pe tastiere no cognossût"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Tastiere necessarie"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "E supuarte lis tastieris"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tastiere no supuartade"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Nol è pussibil doprâle cuntune tastiere"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Supuart pal mouse"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+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:656
+msgid "Mouse Support Unknown"
+msgstr "Supuart pal mouse no cognossût"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Mouse necessari"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Al supuarte i mouse e i dispositîfs di pontament"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mouse no supuartât"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Supuart pal schermi tatil"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Supuart pal schermi tatil no cognossût"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Schermi tatil necessari"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "E supuarte i schermis tatii"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Schermi tatil no supuartât"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Nol è pussibil doprâle cuntun schermi tatil"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad necessari"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "E à bisugne di un gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Supuart pal gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s al funzione 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Supuart hardware"
+
+#. 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 "Instaladis"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Pagjine instalade"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicazions"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicazions web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicazions di sisteme"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Fat de comunitât"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Chest software al è disvilupât in mût viert di une comunitât di volontaris e "
+"publicât sot de <a href=\"%s\">licence %s</a>.\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: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 ""
+"Chest software al è disvilupât in mût viert di une comunitât di volontaris e "
+"publicât sot de licence %s.\n"
+"\n"
+"Tu puedis contribuî e judâ a rindilu ancjemò miôr."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietari"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "P_lui informazions"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Daûr a discjamâ il catalic dai softwares"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Daûr a cjariâ la pagjine"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Inviament in cors…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Inzornaments automatics in pause"
+
+#: 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 ""
+"La rêt atuâl e je a consum. Lis conessions a consum a àn limits sui dâts o "
+"tarifis associadis a chescj. Duncje, par sparagnâ dâts, i inzornaments "
+"automatics a son stâts metûts in pause.\n"
+"\n"
+"I inzornaments automatics a continuaran cuant che e devente disponibile une "
+"rêt che no je a consum. Fintremai chel moment, tu puedis distès instalâ a "
+"man i inzornaments.\n"
+"\n"
+"In alternative, se la rêt atuâl no je stade identificade ben, stant che no "
+"je a consum, tu puedis cambiâ cheste impostazion."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Vierç _Impostazions di rêt"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderâ pagjine"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "No son recensions di moderâ"
+
+#: 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: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 "Utent"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Zontaduris"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Rimozions"
+
+#. 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 "Inzornaments"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Regressions"
+
+#. 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 "sorzints esternis selezionadis"
+
+#. 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 ""
+"Al furnìs acès a software adizionâl, che al rive di %s. Al è includût "
+"cualchi software proprietari."
+
+#. 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 "Abilite"
+
+#. 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 "Esplore"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Pagjine panoramiche"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Abilitâ i dipuesits software di tiercis parts?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Altris categoriis"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Dâts de aplicazion no cjatâts"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "No cognossût"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "L'utent al à declinât la instalazion"
+
+#. 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 "Preparâ %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 "Gjavâ pardabon il dipuesit %s?"
+
+#. 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 ""
+"Dutis lis aplicazions che a rivin di %s a vignaran disinstaladis e tu varâs "
+"di tornâ a instalâ il dipuesit (repository) par podê tornâ a doprâlis."
+
+#. 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 "Disinstalâ pardabon %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 al vignarà disinstalât e par podêlu doprâ di gnûf tu varâs di instalâlu."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferencis di inzornament"
+
+#: 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 ""
+"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)."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Inzornaments automatics"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Al discjame e al instale in sotfont i inzornaments software, cuant che al "
+"pues fâlu."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notifichis di inzornament automatichis"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostre lis notifichis cuant che i inzornaments a son stâts instalâts in "
+"automatic."
+
+#. 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 ""
+"Cualchidun dai software al moment instalâts nol è compatibil cun %s. Se tu "
+"continuis i pachets chi daurman a vignaran gjavâts in automatic dilunc "
+"l'inzornament:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software no compatibil"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continue"
+
+#. 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 ""
+"Il software che al è stât instalât di “%s” al finarà di ricevi inzornaments."
+
+#: 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:254
+msgid "_Disable"
+msgstr "_Disabilite"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Gjave"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Abilite gnûfs dipuesits"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Dipuesits software"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nissun dipuesit"
+
+#. 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 aplicazion instalade"
+msgstr[1] "%u aplicazions instaladis"
+
+#. 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 estension instalade"
+msgstr[1] "%u estensions instaladis"
+
+#. 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 aplicazion"
+msgstr[1] "%u aplicazions"
+
+#. 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 estension"
+msgstr[1] "%u estensions"
+
+#. 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 e %s instaladis"
+msgstr[1] "%s e %s instaladis"
+
+#. 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 "La odei"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "No mi plâs"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "E je buine"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Mi plâs"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Le adori"
+
+#. 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 "Cjapiti plui timp par scrivi une opinion"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Sielç une stele come valutazion"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Il struc al è masse curt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Il struc al è masse lunc"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La descrizion e je masse curte"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publiche recension"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Publiche"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Valutazion"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Struc"
+
+#: src/gs-review-dialog.ui:97
+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\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Recension"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Cognòs te nestre <a href=\"https://odrs.gnome.org/privacy\">politiche di "
+"privacy</a> 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] "%u revision totâl"
+msgstr[1] "%u revisions totâls"
+
+#: src/gs-review-histogram.ui:93
+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:56
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "No cognossût"
+
+#. 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 ""
+"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:225
+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:239
+msgid "Report Review?"
+msgstr "Segnalâ recension?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Segnale"
+
+#. 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 recension ise stade utile?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sì"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "No"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Mah"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Segnale…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Gjave…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Controle di fidâti dal vendidôr, viodût che la aplicazion no je isolade"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Nissun permès"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Acès ae rêt"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Nissun acès ae rêt"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Al dopre servizis di sisteme"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Al dopre servizis di session"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Acès a dispositîfs"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Nissun acès a dispositîfs"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Acès complet ae leture/scriture dal filesystem"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Acès ae leture/scriture de cartele home"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Acès complet ae leture dal filesystem"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Acès ae leture de cartele home"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Acès ae leture/scriture de cartele dai discjariâts"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Acès in leture de cartele dai discjariâts"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Nissun acès al filesystem"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Nol pues acedi par nuie al filesystem"
+
+#. 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 "Codiç proprietari"
+
+#: 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 ""
+"Il codiç sorzint nol è public, duncje nol è pussibil esaminâlu in mût "
+"indipendent e nol è dite che al sedi sigûr"
+
+#. 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 "Codiç che si pues ispezionâ"
+
+#: 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 ""
+"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: 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 "Il svilupadôr de App al è verificât"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dipendencis no siguris"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 al è 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:383
+#, 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s nol è sigûr"
+
+#. 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 "Sigurece"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Sorzint"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Version SDK datade"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Schermade no furnide"
+
+#. 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 "Schermade no cjatade"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+msgid "Screenshot not valid"
+msgstr "Schermade no valide"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:797
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Pagjine di ricercje"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Cîr aplicazions"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Impussibil discjariâ i inzornaments"
+
+#. 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 ""
+"Impussibil discjariâ i inzornaments: al coventave l'acès a internet ma nol "
+"jere disponibil"
+
+#. 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 ""
+"Impussibil discjariâ di %s i inzornaments: nol jere vonde spazi sul disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Impussibil discjariâ i inzornaments: nol jere vonde spazi sul disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Impussibil discjariâ i inzornaments: e coventave la autenticazion"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Impussibil discjariâ i inzornaments: la autenticazion no jere valide"
+
+#. 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 ""
+"Impussibil discjariâ i inzornaments: no si à i permès par instalâ software"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Impussibil otignî la liste dai inzornaments"
+
+#. 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 "Impussibil instalâ %s par vie che no si è rivâts a discjariâ di %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 "Impussibil instalâ %s par vie che no si è rivâts a discjariâ"
+
+#. 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 "Impussibil instalâ %s par vie che il runtime %s nol è disponibil"
+
+#. 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 "Impussibil instalâ %s par vie che nol è supuartât"
+
+#. 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 ""
+"Impussibil instalâ: al coventave l'acès a internet ma nol jere disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Impussibil instalâ: la aplicazion e à un formât no valit"
+
+#. 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 "Impussibil instalâ %s: nol jere vonde spazi sul disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Impussibil instalâ %s: e coventave la autenticazion"
+
+#. 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 "Impussibil instalâ %s: la autenticazion no jere valide"
+
+#. 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 "Impussibil instalâ %s: no si à i permès par instalâ software"
+
+#. 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 "Impussibil instalâ %s: e covente la alimentazion vie prese"
+
+#. 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 "Impussibil instalâ %s: il nivel de batarie al è masse bas"
+
+#. 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 "Impussibil instalâ %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 "Impussibil inzornâ %s di %s par vie che no si è rivâts a discjariâ"
+
+#. 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 "Impussibil inzornâ %s par vie che no si è rivâts a 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Impussibil instalâ i inzornaments di %s par vie che no si è rivâts a "
+"discjariâ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Impussibil instalâ i inzornaments par vie che no si è rivâts a discjariâ"
+
+#. 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 ""
+"Impussibil inzornâ: al coventave l'acès a internet ma nol jere disponibil"
+
+#. 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 "Impussibil inzornâ %s: nol jere vonde spazi sul disc"
+
+#. 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 "Impussibil instalâ i inzornaments: nol è vonde spazi sul disc"
+
+#. 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 "Impussibil inzornâ %s: e coventave la autenticazion"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Impussibil instalâ i inzornaments: e coventave la autenticazion"
+
+#. 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 "Impussibil inzornâ %s: la autenticazion no jere valide"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Impussibil instalâ i inzornaments: la autenticazion no jere valide"
+
+#. 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 "Impussibil inzornâ %s: no si à i permès par inzornâ software"
+
+#. 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 ""
+"Impussibil inzornâ i inzornaments: no si à i permès par inzornâ software"
+
+#. 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 "Impussibil inzornâ %s: e covente la alimentazion vie prese"
+
+#. 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 ""
+"Impussibil instalâ i inzornaments: e covente tacâsi ae prese di alimentazion"
+
+#. 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 "Impussibil inzornâ %s: il nivel de batarie al è masse bas"
+
+#. 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 "Impussibil instalâ i inzornaments: il nivel de batarie al è masse bas"
+
+#. 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 "Impussibil inzornâ %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Impussibil instalâ i inzornaments"
+
+# from -> avendo?
+#. 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 "Impussibil avanzâ a %s di %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 "Impussibil avanzâ a %s par vie che no si è rivâts a discjariâ"
+
+#. 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 ""
+"Impussibil avanzâ a %s: al coventave l'acès a internet ma nol jere disponibil"
+
+#. 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 "Impussibil avanzâ a %s: nol jere vonde spazi sul disc"
+
+#. 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 "Impussibil avanzâ a %s: e coventave la autenticazion"
+
+#. 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 "Impussibil avanzâ a %s: la autenticazion no jere valide"
+
+#. 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 "Impussibil avanzâ a %s: no si à i permès par avanzâ"
+
+#. 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 "Impussibil avanzâ a %s: e covente la alimentazion vie prese"
+
+#. 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 "Impussibil avanzâ a %s: il nivel de batarie al è masse bas"
+
+#. 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 "Impussibil avanzâ a %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 "Impussibil gjavâ %s: e coventave la autenticazion"
+
+#. 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 "Impussibil gjavâ %s: la autenticazion no jere valide"
+
+#. 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 "Impussibil gjavâ %s: no si à i permès par gjavâ software"
+
+#. 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 "Impussibil gjavâ %s: e covente la alimentazion vie prese"
+
+#. 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 "Impussibil gjavâ %s: il nivel de batarie al è masse bas"
+
+#. 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 "Impussibil gjavâ %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 "Impussibil inviâ %s: %s nol è instalât"
+
+#. 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 ""
+"No'nd è vonde spazi libar sul disc — libere un tic di spazi e torne prove"
+
+#. 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 "Nus displâs, alc al è lât stuart"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "No si è rivâts a instalâ il file: no supuartât"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "No si è rivâts a instalâ il file: autenticazion falide"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "No si è rivâts a instalâ: no supuartât"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "No si è rivâts a instalâ: autenticazion falide"
+
+#. 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 "Impussibil contatâ %s"
+
+#. 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 "Si scugne tornâ a inviâ Software par podê doprâ i gnûfs plugins."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Al covente jessi tacâts ae prese"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "Il nivel de batarie al è masse bas"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Dipuesits _software"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferencis di _inzornament"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Esamine disc"
+
+#. 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 "Impostazions di rêt"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Torne invie cumò"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Plui informazions"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Ricercje"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menù primari"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Par savê di _plui"
+
+#. 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 "Inzornaments"
+
+#. 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 "Application Data"
+msgstr "Dâts de aplicazion"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Archiviazion"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Al è pussibil netâ i dâts de cache des <a href=\"dummy\">impostazions de "
+"_aplication</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalât)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instalazion)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Rimozion)"
+
+#. 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 "Inzornaments instalâts"
+
+#. 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 "Instalât ai %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Nissun inzornament instalât"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "I inzornaments software a son obsolets"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Par plasê controle la presince di inzornaments software."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Inzornament software critics pronts pe instalazion"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Un inzornament software impuartant al è pront pe instalazion."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Inzornaments software critics disponibii pal discjariament"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Impuartant: a son in spiete inzornaments software critics."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Inzornament software pronts pe instalazion"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "I inzornaments software a son in spiete pronts pe instalazion."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Inzornaments software disponibii pal discjariament"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Par plasê discjarie i inzornaments software."
+
+#. 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 aplicazion inzornade — si necessite tornâ a inviâ"
+msgstr[1] "%u aplicazions inzornadis — si necessite tornâ a inviâ"
+
+#. 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 aplicazion inzornade"
+msgstr[1] "%u aplicazions inzornadis"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s al è stât inzornât."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Par plasê torne invie la aplicazion."
+
+#. 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 e %s a son stâts inzornâts."
+
+#. 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 aplicazion e à dibisugne che e sedi tornade a inviâ."
+msgstr[1] "%u aplicazions a àn dibisugne che a sedin tornadis a inviâ."
+
+#. 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 "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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Inzornaments dal Sisteme operatîf no disponibii"
+
+#. 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 "Inzorne par continuâ a ricevi inzornaments di sigurece."
+
+#. 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 "Une gnove version di %s e je disponibile pe instalazion"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Avanzament software disponibil"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Inzornaments software falîts"
+
+#. 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 ""
+"Nol è stât pussibil instalâ un impuartant inzornament dal sisteme operatîf."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostre detais"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Esamine"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Ultin control: %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 no je plui supuartade."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Il to sisteme operatîf nol è plui supuartât."
+
+#. 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 "Chest al significhe che nol ricevarà inzornaments di sigurece."
+
+#. 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 "Si consee di avanzâ a une version plui resinte."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Tu podaressis spindi bêçs"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Controle _distès"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nissune rêt"
+
+#. 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 "L'acès a internet al è necessari par controlâ i inzornaments."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Control inzornaments"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Inzornaments"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Pagjine inzornaments"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Daûr a cjariâ i inzornaments…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Dut inzornât"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Doprâ dâts mobii?"
+
+#: src/gs-updates-page.ui:243
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Controlâ i inzornaments intant che si dopre la bande largje mobile al "
+"podarès causâ spesis in plui."
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "_Controle distès"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Nissune conession"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Va in rêt par controlâ i inzornaments."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Impostazions di _rêt"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Erôr"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "I inzornaments a son gjestîts in automatic."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Torne invie e inzorne"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Inzorne dut"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Inzornaments aplicazion"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware dispositîf"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponibil/e"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Scuvierç di plui su la gnove version"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Daûr a discjariâ…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% discjariât"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "To_rne invie e inzorne"
+
+#: src/gs-upgrade-banner.ui:201
+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â."
+
+#: 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 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 ""
+"Inzornaments;Avanzament;Sorzints;Repositories;Dipuesits;Preferencis;Instalâ;"
+"Disinstalâ;Program;Software;Aplicazion;Negozi;"
+
+#. 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 "Inzornaments di sisteme"
+
+#. 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 ""
+"Inzornaments di sisteme gjenerâi, come chei di sigurece o che a comedin "
+"erôrs, e mioraments di prestazions."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Daûr a discjariâ lis imagjins in risalt…"
+
+#. 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 "Inzornament di %s cun gnovis funzionalitâts e corezions."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Daûr a discjariâ lis informazions di avanzament…"
+
+#. 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 ""
+"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 applications on Linux"
+msgstr "Flatpak al è un ambient di svilup par aplicazions di scritori su Linux"
+
+#. 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 "Cartele di sisteme %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Sot-cartele di home %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Cartelis di sisteme dal host"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configurazion dal sisteme host che e rive di /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Cartele Scritori"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Sot-cartele dal scritori %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Cartele dai documents"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Sot-cartele dai documents %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Cartele de musiche"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Sot-cartele di Musiche %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Cartele des imagjins"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Sot-cartele di imagjins %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Cartele di condivision publiche"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Sot-cartele di condivision publiche %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Cartele dai videos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Sot-cartele dai videos %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Cartele dai modei"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Sot-cartele di modei %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Cartele de cache dal utent"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Sot-cartele de cache dal utent %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Cartele de configurazion dal utent"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Sot-cartele de configurazion dal utent %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Cartele dai dâts dal utent"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Sot-cartele di dâts utent %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Cartele di runtime dal utent"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Sot-cartele di runtime dal utent %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Daûr a otignî i metadâts flatpak par %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"“%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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Inzornament configurazion %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Inzornament ricevidôr USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "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:148
+msgid "Install Unsigned Software?"
+msgstr "Instalâ il software cence firme?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Discjamâ il software cence firme?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Inzornâ il software cence firme?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pachets"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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 "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 has unknown permissions"
+#~ msgstr "La App e à permès no cognossûts"
+
+#~ 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 "Remove"
+#~ msgstr "Gjave"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Nissun dipuesit adizionâl"
+
+#~ msgid "_Enable"
+#~ msgstr "_Abilite"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Torne invie cumò"
+
+#~ 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 %s Ready to be Installed"
+#~ msgstr "%s %s pronte par jessi instalade"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Sbare laterâl di navigazion"
+
+#~ 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 "_Installed"
+#~ msgstr "_Instalât"
+
+#~ msgid "_Updates"
+#~ msgstr "_Inzornaments"
+
+#~ 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 "Reference"
+#~ msgstr "Riferiment"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Licence software no cognossude"
+
+#~ 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 "Failed to save file"
+#~ msgstr "No si è rivâts a salvâ il file"
+
+#~ 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 "App ID"
+#~ msgstr "ID App"
+
+#~ 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 "Delete Design"
+#~ msgstr "Elimine disen"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Avanzament dal SO"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Impussibil comprâ %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "O ai dismenteât la mê password"
+
+#~ 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."
+
+# from -> avendo?
+#~ msgid "Unable to update %s from %s"
+#~ msgstr "Impussibil inzornâ %s di %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 "U_pdate All"
+#~ msgstr "I_nzorne dut"
+
+#~ 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 "_Install All"
+#~ msgstr "_Instale ducj"
+
+#~ 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 "web app"
+#~ msgstr "Aplicazion web"
+
+#~ 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 <leftmostcat@gmail.com>, 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 <leftmostcat@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\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 <leftmostcat@gmail.com>"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <fios@foramnagaidhlig.net>, 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 <fios@foramnagaidhlig.net>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr "Chan eil %s na <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">bhathar-bhog saor is open source</a> 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..169dd58
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,6127 @@
+# 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 <frandieguez@gnome.org>, 2013-2022.
+# Fran Dieguez <frandieguez@gnome.org>, 2013-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: 2022-09-02 21:09+0000\n"
+"PO-Revision-Date: 2022-09-05 00:16+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
+"Language-Team: Galician <proxecto@trasno.gal>\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-Generator: Gtranslator 40.0\n"
+"X-Project-Style: gnome\n"
+"X-DL-Team: gl\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:21
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2018
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "O Proxecto GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"A última marca de tempo cando o sistema estivo en liña e obtivo "
+"actualizacións"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+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:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Ofrecer anovacións para pre-publicacións"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://gl.wikipedia.org/wiki/Software_privativo'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"Preferencia da orde de prioridade dos formatos de empaquetado, sendo os "
+"primeiros 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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 é 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:1027
+#, 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:1031
+#, 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 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 é 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Cualificación por idade"
+
+#: 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 "Como contribuír con información que falta"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paquete"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pendente"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalación pendente"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Retirado pendente"
+
+#: 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 "Instalado"
+
+#. 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 "Instalando"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Retirando"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstalar"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Rede"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Pode comunicarse pola rede"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Servizos do sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Servizos da sesión"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Pode acceder aos ficheiros do dispositivo do sistema"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Cartafol persoal"
+
+#: 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 "Pode ver, editar e crear ficheiros"
+
+#: 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 "Pode ver ficheiros"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Cartafol de descargas"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Configuracións"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Pode ver e cambiar calquera preferencia"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema de pantalla antigo"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa un sistema de pantalla antigo e inseguro"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Saír do illamento"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Pode escapar da caixa de area e saltar calquera outra restrición"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Información da actualización"
+
+#. 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 "Non hai unha descrición dispoñíbel."
+
+#: 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 "Atrás"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Require permisos adicionais"
+
+#. 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 "Revisións"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Non se atoparon revisións para esta aplicación."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Non hai revisións"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Historial de versións"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novo na versión %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versión %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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: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 "Show verbose debugging information"
+msgstr "Mostrar información de depuración detallada"
+
+#: 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 update preferences"
+msgstr "Mostrar as preferencias de actualización"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 Contribuíntes de GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Fran Diéguez <frandieguez@gnome.org>, 2013-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 "Sobre Software"
+
+#. 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 "Unha gran forma de xestionar o software no seu sistema."
+
+#. 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 "Desculpe! Non hai detalles para esta aplicación."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Pode acceder ao hardware 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Pode acceder a ficheiros arbitrarios"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Pode adquirir permisos arbitrarios"
+
+#. 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 "Revisado pola súa distribución"
+
+#. 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 "Fornecido por un terceiro"
+
+#. 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 "Código privativo"
+
+#. 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 "Código auditábel"
+
+#. 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 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 "Software xa non é compatíbel"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Insegura"
+
+#: 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 "Móbil só"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Só funciona nunha pantalla pequena"
+
+#: 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 "Escritorio só"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Só funciona en pantallas grandes"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Discordancia do tamaño de pantalal"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Non admite o seu tamaño de pantalla actual"
+
+#: 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 "Require unha pantalla táctil"
+
+#: 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 "Require un teclado"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Require un rato"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Precisa mando de xogos"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptativo"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funciona en teléfonos, tabletas e escritorios"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probabelmente require un teclado ou rato"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Contén contido non axeitado á idade"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visitar sitio 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:159
+msgid "Install…"
+msgstr "Instalar…"
+
+#. 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 "Cancelar"
+
+#. 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 "Instalar"
+
+#. 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 "Anovar"
+
+#. 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 "Desinstalar"
+
+#. 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 "Desinstalando"
+
+#. 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 "O dispositivo non se pode usar durante a actualización."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renomeado desde %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Axuda a traducir %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 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:5
+msgid "Translations"
+msgstr "Traducións"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Sitio web de _tradución"
+
+#. 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 "Inicio de sesión remoto para %s requirido (reino %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Inicio de sesión requirido"
+
+#: 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 "_Cancelar"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Iniciar sesión"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Usuario"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Contrasinal"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Novo e actualizado"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Outro software"
+
+#. 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 "Escriba un número desde 1 a %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Escolla unha aplicación:"
+
+#: 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 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 agora está instalado"
+
+#. 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 "Debe reiniciar para aplicar os cambios."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Instaláronse as actualizacións do SO"
+
+#. 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 ""
+"As actualizacións instaladas recentemente están dispoñíbeis para a súa "
+"revisión"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Iniciar"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Desexa instalar software de terceiros?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Desexa activar os Repositorios de software de terceiros?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s non é <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">software libre e de fontes abertas</a>, e é fornecido por "
+"«%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 é fornecido por «%s»."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Non advertir outra vez"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Lista detallada dos erros do xestor de paquetes:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalles"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Aceptar"
+
+#. 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] "Instalouse unha actualización"
+msgstr[1] "Instaláronse as actualizacións"
+
+#. 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] "Eliminouse unha aplicación"
+msgstr[1] "Elimináronse aplicacións"
+
+#. 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] "Debe reiniciar para aplicar o cambio."
+msgstr[1] "Debe reiniciar para aplicar os cambios."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Agora non"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Agora mesmo"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "Hai %d hora"
+msgstr[1] "Hai %d horas"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "Hai %d ano"
+msgstr[1] "Hai %d anos"
+
+#. 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 "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:332
+msgid "Find in Software"
+msgstr "Buscar en Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostrar máis"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostrar menos"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Retirando…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Require reiniciar para rematar a instalación"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Actualización pendente…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparando…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Desinstalando…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalar"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Reiniciar"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Instalar…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Outras aplicacións de %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "Precisa acceso a Internet para escribir unha reseña"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Non foi posíbel atopar «%s»"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Páxina de detalles"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Cargando a información da aplicación…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Este software non está dispoñíbel no seu idioma e aparecerá en inglés de "
+"EEUU."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Axudar a _traducir"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Abrir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Actualizar"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Descargando"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Engadidos"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Os engadidos seleccionados instalaranse coa aplicación."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Inclúe repositorio de software"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Non inclúe repositorio de software"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Repositorio de software identificado"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Use só repositorios de software nas que confíe."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Sen metadatos"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Sitio _web do proxecto"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donar"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Contribuír traducións"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Informar dun erro"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Axuda"
+
+#. 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 "_Escribir unha revisión"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Todas as revisións"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Tipo de letra dispoñíbel para o script %s"
+msgstr[1] "Tipos de letra dispoñíbeis para o script %s"
+
+#. 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] "Software dispoñíbel para %s"
+msgstr[1] "Software dispoñíbel para %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Non se atopa o software solicitado"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "Non se atopou «%s»"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "no sitio 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"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 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 "Non hai ningunha aplicación dispoñíbel para o formato %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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, 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:874
+#, c-format
+msgid "%s file format"
+msgstr "Formato de ficheiro %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Non foi posíbel atopar o software requirido"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Páxina dos códecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Compatibilidade con escritorio"
+
+#: 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 "Permite o seu uso en pantallas grandes"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Compatibilidade con escritorio descoñecida"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Require unha pantalla grande"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Escritorio non compatíbel"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Non pode usarse nunha pantalla grande"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Compatibilidade con móbil"
+
+#: 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 "Admite o uso en pantallas paquenas"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Compatibilidade con móbil descoñecida"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Require unha pantalla pequena"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Móbel non compatíbel"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Non pode usarse nunha pantalla pequena"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Soporte de teclado"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Compabilidade de teclado descoñecida"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Teclado requirido"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Compatíbel con teclados"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Non compatíbel con teclado"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Non se pode usar con un teclado"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Compatibilidade de rato"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Require un rato ou dispositivo de apuntado"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Compatibilidade con móbil descoñecida"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Require rato"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Admite ratos e dispositivos de apuntado"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Non compatíbel con rato"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Compatiblidade de pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Compatibilidade de pantalla táctil descoñecida"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Require área táctil"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Compatíbel con pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Non compatíbel con pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Non se pode usar con unha pantalla táctil"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Require mando de xogos"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Require un mando de xogo"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Compatibilidade de mando de xogo"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Compatibilidade hardware"
+
+#. 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 "Instaladas"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Páxina de instalado"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicacións"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicacións web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicacións do sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Construído pola comunidade"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Este software desenvólvese de forma aberta por unha comunidade de "
+"voluntarios, e publicado baixo a <a href=\"%s\">licenza %s</a>.\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: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 ""
+"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."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Privativo"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Saber máis"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Descargando o catálogo de software"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Cargando páxina"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Iniciando…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Actualizacións automáticas pausadas"
+
+#: 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 ""
+"A rede actual é medida. As conexións medidas teñen límites ou cargos "
+"monetarios asociados. Para aforrar datos, as actualizacións automáticas "
+"foron polo tanto pausadas.\n"
+"\n"
+"As actualizacións medidas retomaranse cando estea dispoñíbel unha rede non "
+"medida. Ate ese momento, aínda é posíbel instalar manualmente as "
+"actualizacións.\n"
+"\n"
+"De forma alternativa, se a rede actual foi identificada de forma incorrecta "
+"como medida, esta configuración pode cambiarse."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Abrir as _Preferencias da rede"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderar páxina"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Non hai revisións que moderar"
+
+#: 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: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 "Usuario"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "A engadir"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "A eliminar"
+
+#. 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 "Actualizacións"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "A desactualizar"
+
+#. 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 "orixes externos seleccionados"
+
+#. 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 ""
+"Fornece acceso a software adicional dende %s. Inclúese algún software "
+"privativo."
+
+#. 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 "Activar"
+
+#. 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 "Explorar"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Páxina de vista previa"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Desexa activar os repositorios de software de terceiros?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Outras categorías"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Non se atopou ningún dato de aplicacións"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Descoñecida"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "O usuario declinou a instalación"
+
+#. 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 "Preparar %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 "Está seguro de que desexa retirar o repositorio «%s»?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Está seguro de que desexa desinstalar «%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 vaise desinstalar, e terá que instalalo para usalo de novo."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferencias de actualización"
+
+#: 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 ""
+"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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Actualizacións automáticas"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Instala calquera actualización pendente en segundo plano, cando sexa posíbel."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificacións de actualizacións automáticas"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostrar notificacións cando as actualizacións sexan instaladas "
+"automaticamente."
+
+#. 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 ""
+"Algún software instalado actualmente non é compatíbel con %s. Se continúa, "
+"os seguintes serán eliminados automaticamente durante a anovación:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software non compatíbel"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continuar"
+
+#. 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 ""
+"O software que foi instalado desde «%s» non recibirá novas actualizacións."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Desexa desactivar o repositorio?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Desinstalar"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Activar novos repositorios"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Repositorios adicionais desde terceiros seleccionados — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Estes repositorios suplementan o software fornecido por omisión por %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repositorios de software"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Non hai repositorios"
+
+#. 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 aplicación instalado"
+msgstr[1] "%u aplicacións instalados"
+
+#. 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 engadido instalado"
+msgstr[1] "%u engadidos instalados"
+
+#. 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 aplicación"
+msgstr[1] "%u aplicacións"
+
+#. 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 engadido"
+msgstr[1] "%u engadidos"
+
+#. 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 e %s instalado"
+msgstr[1] "%s e %s instalados"
+
+#. 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 "Ódioo"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Non me gusta"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Está ben"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Gústame"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Encántame"
+
+#. 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 "Por favor, tome uns minutos escribindo a revisión"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Escolla a puntuación"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "O resumo é demasiado curto"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "O resumo é demasiado longo"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "A descrición é demasiado curta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publicar opinión"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Enviar"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Puntuación"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resumo"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Envíenos un pequeno resumo da súa revisión, por exemplo: «Gran aplicación, "
+"moi recomendable»."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Opinión"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Que pensa da aplicación? Tente darnos as razóns da súa visión."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Saiba que datos se envían na nosa <a href=\"https://odrs.gnome.org/"
+"privacy\">política de privacidade</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Reportar opinión?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Informar"
+
+#. 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 "Esta opinión foi útil para vostede?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sí"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Non"
+
+#. 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 "Informar…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Retirar…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Comprobe que confía no fornecedor, xa que non é una aplicación illada"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Sen permisos"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Acceso á rede"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Sen acceso á rede"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa os servizos do sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa os servizos da sesión"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Acceso a dispositivos"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Sen acceso a dispositivos"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Acceso de lectura/escritura ao sistema de ficheiros completo"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Acceso de lectura e escritura ao cartafol persoal"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Acceso de lectura ao sistema de ficheiros completo"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Acceso de lectura ao cartafol personal"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Acceso de lectura/escritura ao cartafol de Descargas"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Acceso de lectura ao cartafol de Descargas"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Sen acceso ao sistema de ficheiros"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Non pode acceder ao sistema de ficheiros de ningunha forma"
+
+#. 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 "Código privativo"
+
+#: 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 ""
+"O código fonte non é público, polo que non pode ser auditado "
+"independentemente e podería non ser seguro"
+
+#. 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 "Código auditábel"
+
+#: 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 ""
+"O código fonte é público e pode auditarse de forma independente, o que fai "
+"que a aplicación sexa máis segura"
+
+#. 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 "O desenvolvedor da aplicación está verificado"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependencias non seguras"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 é segura"
+
+#. 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 é potencialmente insegura"
+
+#. 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 é insegura"
+
+#. 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 "Seguranza"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Orixe"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versión do SDK desfasada"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Non se forneceu unha captura de pantalla"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Captura de pantalla non atopada"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Captura de pantalla non atopada"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Páxina de busca"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Buscar por aplicacións"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Non é posíbel descargar anovacións"
+
+#. 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 ""
+"Non é posíbel descargar anovacións: requírese acceso a internet pero non "
+"está dispoñíbel"
+
+#. 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 ""
+"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:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+"Non foi posíbel descargar as anovacións: non hai espazo en disco dabondo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Non foi posíbel descargar as anovacións: requírese autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Non foi posíbel descargar as anovacións: a autenticación non é válida"
+
+#. 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 ""
+"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:1331
+msgid "Unable to get list of updates"
+msgstr "Non foi posíbel descargar a lista de anovacións"
+
+#. 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 "Non foi posíbel instalar %s xa que a descarga fallou desde %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 "Non foi posíbel instalar %s xa que a descarga fallou"
+
+#. 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 ""
+"Non foi posíbel instalar %s xa que o ambiente de execución %s non está "
+"dispoñíbel"
+
+#. 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 "Non foi posíbel instalar %s xa que non é compatíbel"
+
+#. 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 ""
+"Non foi posíbel instalar: requírese acceso á rede pero non está dispoñíbel"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Non foi posíbel instalar: a aplicación ten un formato non válido"
+
+#. 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 "Non foi posíbel instalar %s: non hai espazo en disco dabondo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Non foi posíbel instalar %s: requírese autenticación"
+
+#. 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 "Non foi posíbel instalar %s: a autenticación non é válida"
+
+#. 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 "Non foi posíbel instalar %s: non ten permiso para instalar software"
+
+#. 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 "Non foi posíbel instalar %s: precísase conexión á alimentación"
+
+#. 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 "Non foi posíbel instalar %s: O nivel de batería é demasiado baixo"
+
+#. 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 "Non foi posíbel instalar %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 "Non foi posíbel actualizar %s desde %s xa que a descarga fallou"
+
+#. 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 "Non foi posíbel actualizar %s xa que a descarga fallou"
+
+#. 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 ""
+"Non foi posíbel instalar actualizacións desde %s xa que a descarga fallou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Non foi posíbel instalar as actualizacións xa que a descarga fallou"
+
+#. 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 ""
+"Non foi posíbel actualizar: precísase acceso a Internet, pero non está "
+"dispoñíbel"
+
+#. 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 "Non foi posíbel actualizar %s: non hai espazo en disco dabondo"
+
+#. 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 ""
+"Non foi posíbel instalar as actualizacións: non hai espazo en disco dabondo"
+
+#. 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 "Non foi posíbel %s: precísase autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Non foi posíbel instalar as actualizacións: requírese autenticación"
+
+#. 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 "Non foi posíbel %s: a autenticación non é válida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, 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"
+
+#. 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 ""
+"Non foi posíbel actualizar %s: non ten permisos para actualizar software"
+
+#. 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 ""
+"Non foi posíbel actualizar as actualizacións: non ten permisos para "
+"actualizar software"
+
+#. 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 "Non foi posíbel actualizar %s: precísase conexión á alimentación"
+
+#. 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 ""
+"Non foi posíbel instalar as actualizacións: precísase conexión á alimentación"
+
+#. 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 "Non foi posíbel actualizar %s: O nivel de batería é demasiado baixo"
+
+#. 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 ""
+"Non foi posíbel instalar as actualizacións: O nivel de batería é demasiado "
+"baixo"
+
+#. 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 "Non foi posíbel actualizar %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Non foi posíbel instalar as actualizacións"
+
+#. 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 "Non foi posíbel anovar a %s desde %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 "Non foi posíbel anovar a %s xa que fallou a descarga"
+
+#. 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 ""
+"Non foi posíbel actualizar a %s: precísase acceso a Internet, pero non está "
+"dispoñíbel"
+
+#. 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 "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 distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Non foi posíbel actualizar a %s: precísase 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Non foi posíbel actualizar a %s: a 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:1700
+#, 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"
+
+#. 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 "Non foi posíbel a %s: precísase conexión á alimentación"
+
+#. 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 "Non foi posíbel a %s: O nivel de batería é demasiado baixo"
+
+#. 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 "Non foi posíbel actualizar a %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 "Non foi posíbel quitar %s: precísase autenticación"
+
+#. 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 "Non foi posíbel quitar %s: a autenticación non é válida"
+
+#. 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 "Non foi posíbel quitar %s: non ten permisos para quitar software"
+
+#. 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 "Non foi posíbel quitar %s: precísase conexión á alimentación"
+
+#. 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 "Non foi posíbel quitar %s: O nivel de batería é demasiado baixo"
+
+#. 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 "Non foi posíbel quitar «%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 "Non foi posíbel iniciar %s: %s non está instalado"
+
+#. 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 ""
+"Non hai espazo en disco dabondo. Por favor libere algún espazo e ténteo de "
+"novo"
+
+#. 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 "Desculpa, isto non funcionou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Produciuse un fallo ao instalar o ficheiro: non compatíbel"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Non foi posíbel instalar o ficheiro: fallou a autenticación"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Produciuse un fallo na instalación: non compatíbel"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Non foi posíbel facer a instalación: fallou a autenticación"
+
+#. 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 "Non foi posíbel contactar con %s"
+
+#. 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 "Software debe reiniciarse para usar os engadidos novos."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Precísase conexión á alimentación"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "O nivel de batería é demasiado baixo"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Repositorios de _software"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferencias de _actualización"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examinar disco"
+
+#. 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 "Preferencias da rede"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reiniciar agora"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Máis información"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Buscar"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menú principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Saber _máis"
+
+#. 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 "Actualizacións"
+
+#. 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 "Application Data"
+msgstr "Datos da aplicación"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Esta aplicación require compoñentes compartidos do sistema"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#. 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 "Almacenamento"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Os datos da caché poden limparse desde as <a href=\"dummy\">preferencias de "
+"_aplicacion</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalado)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instalando)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Retirando)"
+
+#. 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 "Actualizacións instaladas"
+
+#. 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 "Instalado o %s"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "No Updates Installed"
+msgstr "Non hai actualizacións instaladas"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "As actualizacións de software están obsoletas"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Comprobe as actualizacións de software."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "As actualización de software críticas están listas para instalar"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Hai unha actualizacións de software importante lista para instalarse."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Hai actualizacións críticas de software dispoñíbeis para descargar"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Importante: as actualizacións de software críticas están agardando."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Actualización de software listas para instalarse"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Hai actualizacións de software agardando para instalarse."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Hai actualizacións de software dispoñíbeis para descargar"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Descargue as actualizacións de software que están agardando."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u aplicación actualizada"
+msgstr[1] "%u aplicacións actualizadas"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s foi actualizado."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Reinicie a aplicación."
+
+#. 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 e %s foron actualizados."
+
+#. 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 aplicación require reiniciar."
+msgstr[1] "%u aplicacións requiren reiniciar."
+
+#. 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 "Inclúe %s, %s e %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 "Actualizacións de sistema operativo non dispoñíbeis"
+
+#. 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 "Suba de versión 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:728
+#, 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:732
+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:1137
+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:1139
+msgid "An important operating system update failed to be installed."
+msgstr ""
+"Produciuse un erro ao instalar unha actualización do sistema operativo "
+"importante."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostrar información"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Revisar"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Última comprobación: %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 xa non ten soporte."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "O seu sistema operativo xa non ten soporte."
+
+#. 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 "Isto significa que non recibirá anovacións de seguranza."
+
+#. 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 "Recoméndase que anovar a unha versión máis recente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Pode producir custos adicionais"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Comprobar de todos _modos"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Non hai rede"
+
+#. 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 "Requírese acceso a Internet para buscar actualizacións."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Buscando actualizacións"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Actualizacións"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Páxina de actualizacións"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Cargando actualizacións…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Actualizado"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Desexa usar os datos móbiles?"
+
+#: src/gs-updates-page.ui:243
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Comprobar actualizacións mentres usa a banda larga móbil pode causar custos "
+"adicionais."
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "_Comprobar de novo"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Non hai conexión"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Conéctese para comprobar as actualizacións."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Preferencias da _rede"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Erro"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "As actualizacións xestiónanse automaticamente."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reiniciar e actualizar"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Anovar todos"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Actualizacións de aplicacións"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware de dispositivo"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s dispoñíbel"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Saber máis sobre a nova versión"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Descargando…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% descargado"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reiniciar e actualizar"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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 ""
+"Actualizacións;Anovar;Orixes;Repositorios;Preferencias;Instalar;Desinstalar;"
+"Programa;Software;Aplicación;Tenda;"
+
+#. 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 "Actualización do sistema"
+
+#. 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 ""
+"Actualizacións xerais do sistema, como seguranza ou arranxo de erros, así "
+"como melloras de rendemento."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Descargando as imaxes destacadas…"
+
+#. 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 "Anovación de %s con novas características e melloras."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Descargando a información de anovación…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Cartafol do sistema %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subcartafol persoal %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Cartafoles do sistema anfitrión"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuración do sistema do anfitrión desde /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Cartafol do escritorio"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subcartafol do escritorio %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Cartafol de documentos"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subcartafol de documentos %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Cartafol de música"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subcartafoles de música %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Cartafol de imaxes"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subcartafol de imaxes %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Cartafol de compartición pública"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subcartafol de compartición pública %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Cartafol de vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subcartafol de vídeos %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Cartafol de modelos"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Subcartafol de modelos %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Cartafol de caché de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subcartafol de caché de usuario %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Cartafol de configuración de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subcartafol de configuración de usuario %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Cartafol datos de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subcartafol de datos de usuario %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Cartafol de «runtime» de usuario"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subcartafol de «runtime» de usuario %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Obtendo os metadatos de flatpak para %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Actualización de Receptor USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "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:148
+msgid "Install Unsigned Software?"
+msgstr "Desexa instalar software non asinado?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Desexa descargar software non asinado?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Desexa actualizar software non asinado?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paquetes"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
+
+#~ msgid "No updates have been installed on this system."
+#~ msgstr "Non se instalou ningunha actualización neste computador."
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Xestor de aplicacións para GNOME"
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Software catalog is being downloaded"
+#~ msgstr "Estase descargando o catálogo de software"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "system"
+#~ msgstr "sistema"
+
+#~ 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 "Access arbitrary files"
+#~ msgstr "Acceso a ficheiros arbitrarios"
+
+#~ msgid "Can access arbitrary files on the file system"
+#~ msgstr "Pode acceder a ficheiros arbitrarios no seu sistema de ficheiros"
+
+#~ msgid "A list of popular applications"
+#~ msgstr "Unha lista das aplicacións máis populares"
+
+#~ msgid "A list of applications to use, overriding the system defined ones."
+#~ msgstr ""
+#~ "Unha lista das aplicacións a usar, sobrescribindo os definidos polo "
+#~ "sistema."
+
+#~ msgid "Checking…"
+#~ msgstr "Comprobando…"
+
+#~ msgid "Endless OS"
+#~ msgstr "Endless OS"
+
+#~ msgid "Loading…"
+#~ msgstr "Cargando…"
+
+#~ msgid "Downloading application ratings…"
+#~ msgstr "Descargando as puntuacións da aplicación…"
+
+#~ msgid "GNOME Software"
+#~ msgstr "GNOME Software"
+
+#~ msgid "The URI that references the background for an upgrade banner."
+#~ msgstr "O URI que referencia o fondo para un anuncio de actualización."
+
+#~ msgid ""
+#~ "The URI can contain up to three '%u', which will be replaced by the "
+#~ "upgrade version."
+#~ msgstr ""
+#~ "O URI que contén ate tres «%u», que será substituído pola versión de "
+#~ "actualización."
+
+#~ msgid "Welcome"
+#~ msgstr "Benvido"
+
+#~ msgid "Welcome to Software"
+#~ msgstr "Benvido 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 permítelle instalar todo o software que precisa, todo desde o "
+#~ "mesmo lugar. Vexa as nosas recomendacións, explore as categorías ou "
+#~ "busque as aplicacións que quere."
+
+#~ msgid "_Browse Software"
+#~ msgstr "_Explorar Software"
+
+#~ msgid "_Add shortcut"
+#~ msgstr "_Engadir atallo"
+
+#~ msgid "Re_move shortcut"
+#~ msgstr "_Retirar atallo"
+
+#~ msgid "OS Updates"
+#~ msgstr "Anovacións do sistema operativo"
+
+#~ msgid "Includes performance, stability and security improvements."
+#~ msgstr "Inclúe melloras no rendemento, estabilidade e de seguridade."
+
+#~ msgid "Downloading firmware update signature…"
+#~ msgstr "Descargando a sinatura da actualización de firmware…"
+
+#~ msgid "Downloading firmware update metadata…"
+#~ msgstr "Descargando os metadatos de actualización de firmware…"
+
+#~ msgid "Software has unknown permissions"
+#~ msgstr "Software para permisos descoñecidos"
+
+#~ msgid "Software comes from a trusted source"
+#~ msgstr "Software ven dunha orixe confiábel"
+
+#~ msgid "Unknown Permissions"
+#~ msgstr "Permisos descoñecidos"
+
+#~ msgid "The permissions needed by this app aren’t known"
+#~ msgstr "Non se coñecen os permisos que precisa esta aplicación"
+
+#~ msgid "App comes from a trusted source"
+#~ msgstr "A aplicación provén dunha orixe confiábel"
+
+#~ msgid "Your distribution has verified that this app can be trusted"
+#~ msgstr "A súa distribución verificou que esta aplicación é confiábel"
+
+#~ msgid "Show the prompt to install nonfree software repositories"
+#~ msgstr ""
+#~ "Mostrar un diálogo de pregunta para instalar repositorios de software non "
+#~ "libre"
+
+#~ msgid "Not optimized for touch devices or phones"
+#~ msgstr "Non optimizado para os dispositivos táctiles ou teléfonos"
+
+#~ msgid "Recently Updated"
+#~ msgstr "Actualizado recentemente"
+
+#~ msgid "_Read More"
+#~ msgstr "_Ler máis"
+
+#~ msgid "_Read Less"
+#~ msgstr "_Ler menos"
+
+#~ msgid "_Launch"
+#~ msgstr "_Iniciar"
+
+#~ msgid "More…"
+#~ msgstr "Máis…"
+
+#~ msgid "Recommended Games"
+#~ msgstr "Xogos recomendados"
+
+#~ msgid "Recommended Creation Applications"
+#~ msgstr "Aplicacións de gráficos recomendadas"
+
+#~ msgid "Recommended Work Applications"
+#~ msgstr "Aplicacións de traballo recomendadas"
+
+#~ msgid ""
+#~ "Some of this software is proprietary and therefore has restrictions on "
+#~ "use, sharing, and access to source code."
+#~ msgstr ""
+#~ "Algún deste software é privativo e polo tanto ten restricións para "
+#~ "compartir e acceso ao código fonte."
+
+#~ msgid "Find out more…"
+#~ msgstr "Saber máis…"
+
+#~ msgid "Recent Releases"
+#~ msgstr "Últimas publicacións"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "Desexa eliminar «%s»?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "Desexa desactivar «%s»?"
+
+#~ msgid "Remove"
+#~ msgstr "Retirar"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Non hai repositorios adicionais"
+
+#~ msgid "_Enable"
+#~ msgstr "_Activar"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Retirar…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Desactivar…"
+
+#~ msgid "Enabling"
+#~ msgstr "Activando"
+
+#~ msgid "Disabling"
+#~ msgstr "Desactivando"
+
+#~ msgid "Enabled"
+#~ msgstr "Activado"
+
+#~ msgid "Disabled"
+#~ msgstr "Desactivado"
+
+#~ msgid "_Remove All"
+#~ msgstr "_Retirar todo"
+
+#~ msgid "_Restart Now"
+#~ msgstr "_Reiniciar agora"
+
+#~ msgid "Updates will be applied when the computer is restarted."
+#~ msgstr "As actualizacións aplicaranse cando se reinicie o computador."
+
+#~ msgid "Waiting to Download %s %s"
+#~ msgstr "Agardando para descargar %s %s"
+
+#~ msgid "Downloading %s %s"
+#~ msgstr "Descargando %s %s"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s listo para ser instalado"
+
+#~ msgid "Requires a specific screen size"
+#~ msgstr "Require un tamaño de pantalla específico"
+
+#~ msgctxt "updated"
+#~ msgid "Never"
+#~ msgstr "Nunca"
+
+#~ msgid "Localized in your Language"
+#~ msgstr "Localizado no seu idioma"
+
+#~ msgid "Release Activity"
+#~ msgstr "Actividade de publicación"
+
+#~ msgid "Developer"
+#~ msgstr "Desenvolvedor"
+
+#~ 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 "Descoñecido"
+
+#~ msgid "History"
+#~ msgstr "Historia"
+
+#~ msgid "Select All"
+#~ msgstr "Seleccionar todo"
+
+#~ msgid "Select None"
+#~ msgstr "Deseleccionar todo"
+
+#~ msgid "_Installed"
+#~ msgstr "_Instalado"
+
+#~ msgid "_Updates"
+#~ msgstr "_Anovacións"
+
+#~ msgid "Featured %s"
+#~ msgstr "Destacados en %s"
+
+#~ 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 ordenador por subcategorías"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "All"
+#~ msgstr "Todos"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "Featured"
+#~ msgstr "Destacados"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "All"
+#~ msgstr "Todos"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "Featured"
+#~ msgstr "Destacado"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "All"
+#~ msgstr "Todos"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "Featured"
+#~ msgstr "Destacados"
+
+#~ msgid "Audio & Video"
+#~ msgstr "Son e vídeo"
+
+#~ msgid "Developer Tools"
+#~ msgstr "Ferramentas de desenvolvemento"
+
+#~ msgid "Education & Science"
+#~ msgstr "Educación e ciencia"
+
+#~ msgid "Games"
+#~ msgstr "Xogos"
+
+#~ msgid "Graphics & Photography"
+#~ msgstr "Gráficos e fotografía"
+
+#~ msgid "Productivity"
+#~ msgstr "Produtividade"
+
+#~ msgid "Communication & News"
+#~ msgstr "Comunicación e novas"
+
+#~ msgid "Reference"
+#~ msgstr "Referencia"
+
+#~ msgid "Utilities"
+#~ msgstr "Utilidades"
+
+#~ msgid ""
+#~ "Unable to determine which parts of the system this application accesses. "
+#~ "This is typical for older applications."
+#~ msgstr ""
+#~ "Non se pode determinar a que partes do sistema pode acceder esta "
+#~ "aplicación. Isto é normal para aplicacións antigas."
+
+#~| msgid "Low"
+#~ msgctxt "App permissions"
+#~ msgid "Low"
+#~ msgstr "Baixo"
+
+#~| msgid "Medium"
+#~ msgctxt "App permissions"
+#~ msgid "Medium"
+#~ msgstr "Medio"
+
+#~| msgid "High"
+#~ msgctxt "App permissions"
+#~ msgid "High"
+#~ msgstr "Alto"
+
+#~| msgid "Unknown"
+#~ msgctxt "App permissions"
+#~ msgid "Unknown"
+#~ msgstr "Descoñecido"
+
+#~ msgid "Public domain"
+#~ msgstr "Dominio público"
+
+#~ msgid "https://en.wikipedia.org/wiki/Public_domain"
+#~ msgstr "https://gl.wikipedia.org/wiki/Dominio_p%C3%BAblico"
+
+#~ msgid "https://www.gnu.org/philosophy/free-sw"
+#~ msgstr "https://www.gnu.org/philosophy/free-sw.gl.html"
+
+#~ msgid "Users are bound by the following license:"
+#~ msgid_plural "Users are bound by the following licenses:"
+#~ msgstr[0] "Os usuarios están limitados pola seguinte licencia:"
+#~ msgstr[1] "Os usuarios están limitados polas seguintes licenzas:"
+
+#~ msgid "Sandboxed"
+#~ msgstr "Illado"
+
+#~ msgid "Category"
+#~ msgstr "Categoría"
+
+#~ msgid "Free"
+#~ msgstr "Libre"
+
+#~| msgid "Unknown"
+#~ msgctxt "Application license"
+#~ msgid "Unknown"
+#~ msgstr "Descoñecida"
+
+#~ msgid ""
+#~ "This means that the software can be freely run, copied, distributed, "
+#~ "studied and modified."
+#~ msgstr ""
+#~ "Isto significa que o software pode executarse, copiarse, distribuírse, "
+#~ "estudar e modificar de forma libre."
+
+#~ msgid "Proprietary Software"
+#~ msgstr "Software privativo"
+
+#~ 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 o software é propiedade dunha persoa individual ou "
+#~ "empresa. A miúdo hai restricións no seu uso e normalmente non se pode "
+#~ "acceder ao seu código fonte."
+
+#~ msgid "Unknown Software License"
+#~ msgstr "Licenza de software non dispoñíbel"
+
+#~ msgid "The license terms of this software are unknown."
+#~ msgstr "Descoñécense os termos da licenza deste software."
+
+#~ msgid "The application was rated this way because it features:"
+#~ msgstr "A aplicación foi cualificada así polos seguintes motivos:"
+
+#~ msgid "No details were available for this rating."
+#~ msgstr "Non hai detalles dispoñíbeis para esta puntuación."
+
+#~ msgid "Recommended Audio & Video Applications"
+#~ msgstr "Aplicacións de son e vídeo recomendados"
+
+#~ msgid "Recommended Productivity Applications"
+#~ msgstr "Aplicacións de produtividade recomendados"
+
+#~ msgid "ratings in total"
+#~ msgstr "puntuacións totais"
+
+#~ msgid "Looking for new updates…"
+#~ msgstr "Buscando novas actualizacións…"
+
+#~ msgid "Setting up updates…"
+#~ msgstr "Configurando actualizacións…"
+
+#~ msgid "Software is up to date"
+#~ msgstr "Todos o software está actualizado"
+
+#~ msgid "ODRS is a service providing user reviews of applications"
+#~ msgstr ""
+#~ "ODRS é un servizo que fornece opinións de usuarios sobre aplicacións"
+
+#~ msgid "Cartoon characters in unsafe situations"
+#~ msgstr "Personaxes de banda deseñada en situacións non seguras"
+
+#~ msgid "Cartoon characters in aggressive conflict"
+#~ msgstr "Personaxes animados en conflitos agresivos"
+
+#~ msgid "Graphic violence involving cartoon characters"
+#~ msgstr "Violencia gráfica con personaxes animados"
+
+#~ msgid "Characters in unsafe situations easily distinguishable from reality"
+#~ msgstr ""
+#~ "Personaxes en situacións non seguras distinguíbeis facilmante da realidade"
+
+#~ msgid ""
+#~ "Characters in aggressive conflict easily distinguishable from reality"
+#~ msgstr ""
+#~ "Personaxes en conflitos agresivos distinguíbeis facilmente da realidade"
+
+#~ msgid "Graphic violence easily distinguishable from reality"
+#~ msgstr "Violencia gráfica distinguíbel facilmente da realidade"
+
+#~ msgid "Mildly realistic characters in unsafe situations"
+#~ msgstr "Personaxes semi-realistas en situacións non seguras"
+
+#~ msgid "Depictions of realistic characters in aggressive conflict"
+#~ msgstr "Representacións de personaxes realistas en conflitos agresivos"
+
+#~ msgid "Graphic violence involving realistic characters"
+#~ msgstr "Violencia gráfica con personaes realistas"
+
+#~ msgid "No bloodshed"
+#~ msgstr "Sen masacres"
+
+#~ msgid "Unrealistic bloodshed"
+#~ msgstr "Masacre non realista"
+
+#~ msgid "Realistic bloodshed"
+#~ msgstr "Masacre realista"
+
+#~ msgid "Depictions of bloodshed and the mutilation of body parts"
+#~ msgstr "Representacións de masacres e mutilación de partes do corpo"
+
+#~ msgid "Rape or other violent sexual behavior"
+#~ msgstr "Violación ou outro comportamento sexual violento"
+
+#~ msgid "References to alcoholic beverages"
+#~ msgstr "Referencias a bebeidas alcohólicas"
+
+#~ msgid "Use of alcoholic beverages"
+#~ msgstr "Use de bebidas alcohólicas"
+
+#~ msgid "References to illicit drugs"
+#~ msgstr "Referencias a drogas ilegais"
+
+#~ msgid "Use of illicit drugs"
+#~ msgstr "Uso de drogas ilegais"
+
+#~ msgid "References to tobacco products"
+#~ msgstr "Referencias ao 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 "Representacións ou referencias provocativas"
+
+#~ msgid "Sexual references or depictions"
+#~ msgstr "Representacións ou referencias sexuais"
+
+#~ msgid "Graphic sexual behavior"
+#~ msgstr "Comportamento sexual gráfico"
+
+#~ msgid "Mild or infrequent use of profanity"
+#~ msgstr "Uso moderado ou pouco frecuente da blasfemia"
+
+#~ msgid "Moderate use of profanity"
+#~ msgstr "Uso moderado da blasfemia"
+
+#~ msgid "Strong or frequent use of profanity"
+#~ msgstr "Uso amplio ou frecuente da blasfemia"
+
+#~ msgid "Slapstick humor"
+#~ msgstr "Humor"
+
+#~ msgid "Vulgar or bathroom humor"
+#~ msgstr "Humor vulgar ou estolóxico"
+
+#~ msgid "Mature or sexual humor"
+#~ msgstr "Humor adulto ou sexual"
+
+#~ msgid "Negativity towards a specific group of people"
+#~ msgstr "Negatividade cara un determinado grupo de persoas"
+
+#~ msgid "Discrimination designed to cause emotional harm"
+#~ msgstr "Discriminación para causar dano emocional"
+
+#~ msgid "Explicit discrimination based on gender, sexuality, race or religion"
+#~ msgstr ""
+#~ "Discriminación explícita baseada en xénero, sexualidade, raza ou relixión"
+
+#~ msgid "Product placement"
+#~ msgstr "Venta de produtos"
+
+#~ msgid "Explicit references to specific brands or trademarked products"
+#~ msgstr ""
+#~ "Referencias explícitas a marcas concretas ou produtos de marcas "
+#~ "rexistradas"
+
+#~ msgid "Users are encouraged to purchase specific real-world items"
+#~ msgstr ""
+#~ "Incítase aos xogadores a comprar determian dos elementos do mundo real"
+
+#~ msgid "Gambling on random events using tokens or credits"
+#~ msgstr "Xogo en eventos aleatorios usando créditos ou vidas"
+
+#~ msgid "Gambling using “play” money"
+#~ msgstr "Xogo usando diñeiro virtual"
+
+#~ msgid "Gambling using real money"
+#~ msgstr "Xogo usando diñeiro real"
+
+#~ msgid "Users are encouraged to donate real money"
+#~ msgstr "Incítase aos xogadores a donar diñeiro real"
+
+#~ msgid "Ability to spend real money in-app"
+#~ msgstr "Posibilidade de gastar diñeiro real no xogo"
+
+#~ msgid "User-to-user interactions without chat functionality"
+#~ msgstr "Interaccións de usuario a usuario sen a funcionalidade de chat"
+
+#~ msgid "Moderated chat functionality between users"
+#~ msgstr "Funcionalidade de chat moderado entre usuarios"
+
+#~ msgid "Uncontrolled audio or video chat functionality between users"
+#~ msgstr "Funcionalidade de son ou vídeo sen controlar entre usuarios"
+
+#~ msgid "Sharing social network usernames or email addresses"
+#~ msgstr ""
+#~ "Compartición en redes sociais de nomes de usuario ou enderezos de correo-e"
+
+#~ msgid "Checking for the latest application version"
+#~ msgstr "Buscando a última versión da aplicación"
+
+#~ msgid "Sharing diagnostic data that does not let others identify the user"
+#~ msgstr ""
+#~ "Compartición de datos de diagnóstico que non lle permite a outros "
+#~ "identificar ao usuario"
+
+#~ msgid "Sharing information that lets others identify the user"
+#~ msgstr "Compartición de información identificable ao usuario"
+
+#~ msgid "Sharing physical location with other users"
+#~ msgstr "Compartición da localización física con outros usuarios"
+
+#~ msgid "Indirect references to homosexuality"
+#~ msgstr "Referencias indirectas á homosexualidade"
+
+#~ msgid "Kissing between people of the same gender"
+#~ msgstr "Bicos entre persoas do mesmo xénero"
+
+#~ msgid "Graphic sexual behavior between people of the same gender"
+#~ msgstr "Comportamento sexual gráfico entre persoas do mesmo sexo"
+
+#~ msgid "Indirect references to prostitution"
+#~ msgstr "Referencias indirectas á prostitución"
+
+#~ msgid "Direct references to prostitution"
+#~ msgstr "Referencias directas á prostitución"
+
+#~ msgid "Graphic depictions of the act of prostitution"
+#~ msgstr "Representacións gráficas do acto da prostitución"
+
+#~ msgid "Indirect references to adultery"
+#~ msgstr "Referencias indirectas ao adulterio"
+
+#~ msgid "Direct references to adultery"
+#~ msgstr "Referencias directas ao adulterio"
+
+#~ msgid "Graphic depictions of the act of adultery"
+#~ msgstr "Representacións gráficas ao acto do adulterio"
+
+#~ msgid "Scantily clad human characters"
+#~ msgstr "Personaxes humanos escasamente vestidos"
+
+#~ msgid "Overtly sexualized human characters"
+#~ msgstr "Caracteres humanos abertamente sexualizados"
+
+#~ msgid "Depictions of or references to historical desecration"
+#~ msgstr "Representacións ou referencias á profanación histórica"
+
+#~ msgid "Depictions of modern-day human desecration"
+#~ msgstr "Representacións da profanación humana moderna"
+
+#~ msgid "Graphic depictions of modern-day desecration"
+#~ msgstr "Representacións gráficas da profanación moderna"
+
+#~ msgid "Visible dead human remains"
+#~ msgstr "Restos humanos mortos visíbeis"
+
+#~ msgid "Dead human remains that are exposed to the elements"
+#~ msgstr "Restos humanos mortos que están expostos aos elementos"
+
+#~ msgid "Graphic depictions of desecration of human bodies"
+#~ msgstr "Representacións gráficas de profanación de corpos humanos"
+
+#~ msgid "Depictions of or references to historical slavery"
+#~ msgstr "Representacións ou referencias á escravitude histórica"
+
+#~ msgid "Depictions of modern-day slavery"
+#~ msgstr "Representacións de escravitude moderna"
+
+#~ msgid "Graphic depictions of modern-day slavery"
+#~ msgstr "Representacións gráficas de escravitude moderna"
+
+#~ msgid "General"
+#~ msgstr "Xeral"
+
+#~ msgid "ALL"
+#~ msgstr "TODO"
+
+#~ msgid "Teen"
+#~ msgstr "Adolescentes"
+
+#~ msgid "Everyone 10+"
+#~ msgstr "Con máis de 10 anos"
+
+#~ msgid "Everyone"
+#~ msgstr "Calquera"
+
+#~ msgid "Early Childhood"
+#~ msgstr "Nenos pequenos"
+
+#~ msgctxt "version"
+#~ msgid "Unknown"
+#~ msgstr "Descoñecido"
+
+#~ msgid "Released"
+#~ msgstr "Publicada"
+
+#~ msgid "Format"
+#~ msgstr "Formato"
+
+#~ msgid "%R"
+#~ msgstr "%R"
+
+#~ msgid "%l:%M %p"
+#~ msgstr "%l:%M %p"
+
+#~ msgid "Yesterday, %R"
+#~ msgstr "Onte, %R"
+
+#~ msgid "Yesterday, %l:%M %p"
+#~ msgstr "Onte ás %l:%M %p"
+
+#~ msgid "Three days ago"
+#~ msgstr "Hai tres días"
+
+#~ msgid "Four days ago"
+#~ msgstr "Hai catro días"
+
+#~ msgid "Five days ago"
+#~ msgstr "Hai cinco días"
+
+#~ msgid "Six days ago"
+#~ msgstr "Hai seis días"
+
+#~ msgid "Two weeks ago"
+#~ msgstr "Hai dúas semanas"
+
+#~ msgid "_Let’s Go Shopping"
+#~ msgstr "_Imos mercar"
+
+#~ msgctxt "app status"
+#~ msgid "Removed"
+#~ msgstr "Retirado"
+
+#~ msgid "Security Updates Pending"
+#~ msgstr "Hai actualizacións de seguranza pendentes"
+
+#~ msgid "It is recommended that you install important updates now"
+#~ msgstr "Recoméndase instalar as actualizacións importantes agora mesmo"
+
+#~ msgid "Restart & Install"
+#~ msgstr "Reiniciar e instalar"
+
+#~ msgid "Important OS and application updates are ready to be installed"
+#~ msgstr ""
+#~ "Hai actualizacións do sistema operativo e de aplicacións listas para "
+#~ "instalarse"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "Enable GNOME Shell extensions repository"
+#~ msgstr "Activar o repositorio de extensións da Shell de GNOME"
+
+#~ msgid "this website"
+#~ msgstr "este sitio web"
+
+#~ msgid "This application needs to be restarted to use new plugins."
+#~ msgstr "Débese reiniciar esta aplicación para usar os novos engadidos."
+
+#~ msgid "About %s"
+#~ msgstr "Sobre %s"
+
+#~ msgid "%s ME"
+#~ msgstr "%s ME"
+
+#~ msgid "Extension Settings"
+#~ msgstr "Preferencias da extensión"
+
+#~ msgid ""
+#~ "Extensions are used at your own risk. If you have any system problems, it "
+#~ "is recommended to disable them."
+#~ msgstr ""
+#~ "Use os engadidos baixo o seu propio risco. Se ten calquera problema no "
+#~ "sistema é recomendábel desactivalos."
+
+#~ msgid "Spacing"
+#~ msgstr "Espaciado"
+
+#~ msgid "The amount of space between children"
+#~ msgstr "A cantidade de espacio entre os fillos"
+
+#~ msgctxt "Menu of Add-ons"
+#~ msgid "Shell Extensions"
+#~ msgstr "Extensións da Shell"
+
+#~ msgid "GNOME Shell Extensions Repository"
+#~ msgstr "Repositorio de Extensións da Shell de GNOME"
+
+#~ msgid "Downloading shell extension metadata…"
+#~ msgstr "Descargando os metadatos da extensión da Shell…"
+
+#~ msgid "GNOME Shell Extension"
+#~ msgstr "Extensións da Shell de GNOME"
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..0ddcfea
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,6842 @@
+# gnome-software Hebrew translation
+# Copyright (C) 2013 Richard Hughes
+# This file is distributed under the same license as the gnome-software package.
+# Elad Alfassa <elad@fedoraproject.org>, 2013.
+# Yosef Or Boczko <yoseforb@gmail.com>, 2014-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: 2022-11-23 16:17+0000\n"
+"PO-Revision-Date: 2022-12-12 16:21+0200\n"
+"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\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: Gtranslator 42.0\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:2076
+#: src/gs-application.c:256
+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 ""
+"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 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 last timestamp when the system was online and got any updates"
+msgstr "The last timestamp when the system was online and got any updates"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "The server to use for application reviews"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "The minimum karma score for reviews"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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: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 ""
+"A list of official repositories that should be considered free software"
+
+#: data/org.gnome.software.gschema.xml:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Allow access to the Software Repositories dialog"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Offer upgrades for pre-releases"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "The URI that explains nonfree and proprietary software"
+
+#: 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 ""
+"A list of URLs pointing to appstream files that will be downloaded into an "
+"swcatalog folder"
+
+#: 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 ""
+"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: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 ""
+"סדר עדיפות תצורות חבילות לפי העדפה, כאשר התצורות החשובות יותר בהתחלה. מערך "
+"ריק משמעו סדר בררת מחדל. תצורות שלא תיכללנה תיחשב כאילו הן מופיעות בסוף. "
+"דוגמאות לתצורות חבילות הן: deb, flatpak, rpm, snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "‫%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:1027
+#, 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:1031
+#, 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 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 מתאים לנוער"
+
+#. 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 מתאים למבוגרים"
+
+#. 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 מתאים ל%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 "דירוג גיל מומלץ"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "‏%s ‏(%s)"
+
+#: lib/gs-app.c:6274
+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 "ניתן לגשת לשירות D-Bus על ערוץ המערכת"
+
+#: 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 "ניתן לגשת לשירות D-Bus על ערוץ הפעלה"
+
+#: 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 "חדש בגרסה %s"
+
+#: 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 "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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "הצגת קובצי metainfo או appdata מקומיים"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Show verbose debugging information"
+
+#: 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 update preferences"
+msgstr "Show update 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: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 ""
+"Elad Alfassa <elad@fedoraproject.org>\n"
+"ירון שהרבני <sh.yaron@gmail.com>\n"
+"יוסף אור בוצ׳קו <yoseforb@gmail.com>\n"
+"מיזם תרגום GNOME לעברית https://l10n.gnome.org/teams/he/"
+
+#. 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 "על אודות תכנה"
+
+#. 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 "דורש %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: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 "מקור: %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 "שונה השם מ־%s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "סיוע בתרגום %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 מתוכנן, מפותח ומתורגם על ידי קהילה בינלאומית של מתנדבים.\n"
+"‬\n"
+"‏‫\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: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 "יש למלא מספר מ־1 עד %u: "
+
+#. 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 "סביבות פיתוח משולבות (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 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 הותקן"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s אינו <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">תכנה חופשית וקוד פתוח</a>, ומסופק על ידי „%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 מסופק על ידי „%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 "התקנה או שימוש ב־%s עשוי להיות לא חוקי בכמה מדינות."
+
+#. 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] "עדכונים הותקנו"
+msgstr[2] "עדכונים הותקנו"
+msgstr[3] "עדכונים הותקנו"
+
+#. 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] "יישומים הוסרו"
+msgstr[2] "יישומים הוסרו"
+msgstr[3] "יישומים הוסרו"
+
+#. 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] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף."
+msgstr[2] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף."
+msgstr[3] "יש להפעיל את המערכת מחדש כדי שהעדכונים יכנסו לתוקף."
+
+#. 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] "לפני שתי דקות"
+msgstr[2] "‫לפני %d דקות"
+msgstr[3] "‫‫לפני %d דקות"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "לפני שעה"
+msgstr[1] "לפני שעתיים"
+msgstr[2] "‫לפני %d שעות"
+msgstr[3] "‫לפני %d שעות"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years 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: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 "יישום"
+
+#. 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: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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "ה_תקנה"
+
+#: src/gs-details-page.c:889
+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:913
+msgid "_Install…"
+msgstr "ה_תקנה…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr "יישומים נוספים מאת %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+msgid "You need internet access to write a review"
+msgstr "נדרשת גישה לרשת אל מנת לכתוב ביקורת"
+
+#: src/gs-details-page.c:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "לא ניתן למצוא את „%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 "_עזרה בתרגום"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_כתיבת ביקורת"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] "גופנים זמינים עבור הסקריפט %s"
+msgstr[1] "‫גופנים זמינים עבור הסקריפטים %s"
+msgstr[2] "גופנים זמינים עבור הסקריפטים %s"
+msgstr[3] "‫גופנים זמינים עבור הסקריפטים %s"
+
+#. 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] "תכניות זמינות עבור %s"
+msgstr[1] "‫תכניות זמינות עבור %s"
+msgstr[2] "‫תכניות זמינות עבור %s"
+msgstr[3] "‫תכניות זמינות עבור %s"
+
+#: 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 "%s לא נמצא"
+
+#. 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 "אין יישומים זמינים המספקים את הקובץ %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 "מידע על %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 "מידע על %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"מידע על %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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"מידע על %s, כמו גם אפשרויות לקבלת התקנים התומכים במדפסת זו ניתן למצוא %s."
+
+#. 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] "לא ניתן למצוא את %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: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] "לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף."
+msgstr[1] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף."
+msgstr[2] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף."
+msgstr[3] "‫לא הצלחנו למצוא את %s שחיפשת. נא לעיין ב%s למידע נוסף."
+
+#: 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 "איתור תוצאות חיפוש נכשל: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s תבנית קובץ"
+
+#: 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 "‫%s ודאי עובד על המכשיר הזה"
+
+#. 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 עובד על המכשיר הזה"
+
+#. 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 לא יעבוד כראוי במכשיר הזה"
+
+#. 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 לא יעבוד על המכשיר הזה"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"התכנית הזאת מפותחת בגלוי על ידי קהילה של מתנדבים, וכפופה <a href=\"%s\">%s "
+"לרישיון</a>.\n"
+"‬\n"
+"‫באפשרותך לתרום ולסייע לשפר אותה."
+
+#. 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 ""
+"התכנית הזאת מפותחת בגלוי על ידי קהילה של מתנדבים והיא כפופה לרישיון ‎%s‎.\n"
+"\n"
+"‫באפשרותך לתרום ולסייע לשפר אותה."
+
+#: 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 ""
+"תכנית זו אינה מפותחת בגלוי, לכן רק המפתחים שלה יודעים איך היא עובדת. קשה "
+"יותר למצוא בה בעיות אבטחה, והיא עשויה לעבור שינויים ללא פיקוח.\n"
+"\n"
+"‫אין לך אפשרות לתרום לתכנית הזאת."
+
+#. 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 ""
+"חיבור הרשת הנוכחי מדוד. לחיבור מדוד קיימת מגבלת נתונים, או לחלופין מתקבלים "
+"חיובים נוספים על שימוש בנתונים. על מנת לחסוך במידע, העדכון האוטומטי הושהה.\n"
+"העדכון אוטומטי יחודש ברגע שחיבור רשת לא מדוד יהיה זמין. עד אז, ניתן להתקין "
+"עדכונים באופן ידני.\n"
+"לחלופין, אם החיבור הנוכחי זוהה באופן שגוי כחיבור מדוד, הגדרה זו ניתנת לשינוי."
+
+#: 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 "מספק גישה לתכניות נוספות דרך %s. יש שם גם תכניות קנייניות."
+
+#. 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:2837
+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 "להסיר את המקור %s?"
+
+#. 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 ""
+"כל היישומים מהמקור %s יוסרו, ועליך יהיה להתקין מחדש את המקור על מנת להשתמש "
+"בהם שוב."
+
+#. 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 "להסיר את %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 יוסר, ויהיה עליך להתקין אותו כדי להשתמש בו שוב."
+
+#: 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 ""
+"כמה מהתכנות המותקנות אינן תואמות עם %s. אם ברצונך להמשיך, דע כי התכנות הבאות "
+"תוסרנה אוטומטית בזמן השדרוג:"
+
+#: 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 "תכניות שהותקנו דרך „%s” תפסקנה לקבל עדכונים."
+
+#: 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 "מאגרים נוספים ממקורות צד־שלישי נבחרים — %s."
+
+#: 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 "מקור זה משלים את התכנה המסופקת על ידי %s."
+
+#. 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] "הותקנו שני יישומים"
+msgstr[2] "‫הותקנו %u יישומים"
+msgstr[3] "‫הותקנו %u יישומים"
+
+#. 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] "שני תוספים הותקנו"
+msgstr[2] "‫%u תוספים הותקנו"
+msgstr[3] "‏‫%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-repo-row.c:175
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+msgstr[0] "יישום אחד"
+msgstr[1] "‫שני יישומים"
+msgstr[2] "‫%u יישומים"
+msgstr[3] "‏‫%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-repo-row.c:181
+#, 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 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 ו%s הותקנו"
+msgstr[1] "‫%s ו%s הותקנו"
+msgstr[2] "‫%s ו%s הותקנו"
+msgstr[3] "‏‫%s ו%s הותקנו"
+
+#. 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 "שנוּא"
+
+#. 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"ניתן לראות איזה מידע נשלח ב<a href=\"https://odrs.gnome.org/"
+"privacy\">מדיניות הפרטיות</a> שלנו. השם המלא מהחשבון שלך יוצג באופן גלוי "
+"לציבור."
+
+#: 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:93
+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: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 "‫%s עשוי להזיק"
+
+#. 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 אינו בטוח"
+
+#. 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 "גרסת 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 "צילום המסך הבא"
+
+#: 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] "עוד שתי תוצאות"
+msgstr[2] "עוד %u תוצאות"
+msgstr[3] "‫עוד %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 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 "לא ניתן להוריד עדכוני קושחה מ־%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 "לא ניתן להוריד עדכונים מ־%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 "לא ניתן להוריד עדכונים"
+
+#. 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 "לא ניתן להוריד עדכונים מ־%s: אין מספיק מקום בכונן"
+
+#. 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 "לא ניתן להתקין את %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 "לא ניתן להתקין את %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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "לא ניתן להתקין את %s כיוון שהוא אינו נתמך"
+
+#. 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 "לא ניתן להתקין את %s: אין מספיק מקום בכונן"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "לא ניתן להתקין את %s: הסוללה כמעט ריקה"
+
+#. 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 "לא ניתן להקין את %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 "לא ניתן לעדכן את %s כיוון שההורדה מ־%s כשלה"
+
+#. 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 "לא ניתן לעדכן את %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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "לא ניתן להתקין עדכונים מ־%s כיוון שההורדה כשלה"
+
+#. 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 "לא ניתן לעדכן את %s: אין מספיק מקום בכונן"
+
+#. 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 "לא ניתן לעדכן את %s: נדרש אימות"
+
+#. 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 "לא ניתן לעדכן את %s: האימות לא היה תקין"
+
+#. 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 "לא ניתן לעדכן את %s: אין לך את ההרשאות לעדכון תכנה"
+
+#. 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 "לא ניתן לעדכן את %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: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 "לא ניתן לעדכן את %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: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 "לא ניתן לעדכן את %s"
+
+#. 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 "לא ניתן לשדרג אל %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 "לא ניתן לשדרג אל %s כיוון שההורדה כשלה"
+
+#. 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 "לא ניתן לשדרג אל %s: נדרשת גישה לאינטרנט אך זו אינה זמינה"
+
+#. 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 "לא ניתן לשדרג אל %s: אין מספיק מקום בכונן"
+
+#. 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 "לא ניתן לשדרג אל %s: נדרש אימות"
+
+#. 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 "לא ניתן לשדרג אל %s: האימות לא היה תקין"
+
+#. 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 "לא ניתן לשדרג אל %s: אין לך את ההרשאות לעדכון תכנה"
+
+#. 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 "לא ניתן לשדרג אל %s: יש לחבר לחשמל"
+
+#. 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 "לא ניתן לשדרג אל %s: הסוללה כמעט ריקה"
+
+#. 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 "לא ניתן לשדרג אל %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 "לא ניתן להסיר את %s: נדרש אימות"
+
+#. 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 "לא ניתן להסיר את %s: האימות לא היה תקין"
+
+#. 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 "לא ניתן להסיר את %s: אין לך את ההרשאות להסרת תכנה"
+
+#. 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 "לא ניתן להסיר את %s: יש לחבר לחשמל"
+
+#. 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 "לא ניתן להסיר את %s: הסוללה כמעט ריקה"
+
+#. 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 "לא ניתן להסיר את %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 "לא ניתן להפעיל את %s: ‏%s לא מותקן"
+
+#. 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 "משהו לא עבד, עמך הסליחה"
+
+#. 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 "אין מספיק מקום פנוי בכונן - יש לפנות קצת מקום ולנסות שוב"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "התקנת הקובץ נכשלה: לא נתמך"
+
+#. 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 "ההתקנה נכשלה: כשל באימות"
+
+#. 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 "לא ניתן ליצור קשר עם %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 "הסוללה כמעט ריקה"
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"נתונים ששמורים במטמון ניתן לפנות דרך <a href=\"dummy\">ה_גדרות היישום</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "‏%s (הותקן)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "‏%s (בהתקנה)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "‏%s (בהסרה)"
+
+#. 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 "מותקן על %s"
+
+#: 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] "שני יישומים עודכנו - נדרשת הפעלה מחדש"
+msgstr[2] "‫‏%u יישומים עודכנו - נדרשת הפעלה מחדש"
+msgstr[3] "‫‏%u יישומים עודכנו - נדרשת הפעלה מחדש"
+
+#. 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] "שני יישומים עודכנו"
+msgstr[2] "‫‏%u יישומים עודכנו"
+msgstr[3] "‫‏%u יישומים עודכנו"
+
+#. 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 "‏%s ו־%s עודכנו."
+
+#. 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] "שני יישומים דורשים הפעלה מחדש."
+msgstr[2] "‫%u יישומים דורשים הפעלה מחדש."
+msgstr[3] "‫%u יישומים דורשים הפעלה מחדש."
+
+#. 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 "גרסה חדשה של %s זמינה להתקנה"
+
+#. 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 "ברוך בואך אל %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] "הותקנו עדכוני תכנה"
+msgstr[2] "הותקנו עדכוני תכנה"
+msgstr[3] "הותקנו עדכוני תכנה"
+
+#. 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] "הותקנו עדכונים חשובים למערכת הפעלה."
+msgstr[2] "הותקנו עדכונים חשובים למערכת הפעלה."
+msgstr[3] "הותקנו עדכונים חשובים למערכת הפעלה."
+
+#. 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 "בדיקה אחרונה: %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 לא נתמך עוד."
+
+#: 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 "‫%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:95
+#, c-format
+msgid "%s Available"
+msgstr "‫%s זמינה"
+
+#: 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 "התקבלו %s מתוך %s"
+
+#. 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%% התקבלו"
+
+#: 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 "עדכון עבור %s, עם תכונות חדשות ותיקונים נוספים."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "שירות העדכון של EOS לא הצליח לקבל ולהחיל את העדכון."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "דפדפן GNOME"
+
+#: 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 "‏Flatpak זוהי מסגרת עבור יישומים שולחניים על לינוקס"
+
+#. 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 "תיקיית מערכת %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "תת־תיקיית הבית %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "תיקיות מערכת אירוח"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "הגדרות מערכת מארחת מ־‎/etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "תיקיית שולחן עבודה"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "תת־תיקיית שולחן עבודה %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "תיקיית מסמכים"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "תת־תיקיית מסמכים %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "תיקיית מוזיקה"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "תת־תיקיית מוזיקה %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "תיקיית תמונות"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "תת־תיקיית תמונות %s"
+
+#: 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 "תת־תיקיית שיתוף ציבורית %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "תיקיית וידאו"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "תת־תיקיית וידאו %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "תיקיית תבניות"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "תת־תיקיית תבניות %s"
+
+#: 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 "תת־תיקיית מטמון משתמש %s"
+
+#: 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 "תת־תיקיית הגדרות משתמש %s"
+
+#: 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 "תת־תיקיית נתוני משתמש %s"
+
+#: 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 "תת־תיקיית זמן ריצת משתמש %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "גישה למערכת הקבצים אל %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "מקבל מידע Flatpak עבור %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "‫הוספה להתקנה של התוסף ‚%s’ נכשלה: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "‫הוספה להסרה של התוסף ‚%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 ""
+"‏„%s” המרוחקת אינה מאפשרת התקנה של „%s”, יתכן בגלל המסנן שלה. יש להסיר את "
+"המסן ולחזור על ההתקנה. פרטי שגיאה: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "עדכון לבקר Thunderbolt ל־%s"
+
+#. 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"
+
+#. 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"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "עדכון מצלמה ל־%s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "עדכון TPM‏ ל־%s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "עדכון משטח מגע ל־%s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "עדכון עכבר ל־%s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "עדכון מקלדת ל־%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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "עדכון ל־‏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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "עדכון להתקן USB ‏%s"
+
+#: 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:2696
+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 זו חבילה שנתמכת במגוון הפצות לינוקס"
+
+#~ 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 "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 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Remove"
+#~ msgstr "הסרה"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "אין מקורות נוספים"
+
+#~ msgid "_Enable"
+#~ msgstr "ל_אפשר"
+
+#~ msgid "_Remove…"
+#~ msgstr "ה_סרה…"
+
+#~ msgid "_Disable…"
+#~ msgstr "ה_שבתה…"
+
+#~ msgid "Disabling"
+#~ msgstr "משבית"
+
+#~ msgid "Enabled"
+#~ msgstr "מאופשר"
+
+#~ msgid "Disabled"
+#~ msgstr "מושבת"
+
+#~ msgid "ratings in total"
+#~ msgstr "סך כל הביקורות"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "סרגל צד לניווט"
+
+#~ msgid "%s (needs attention)"
+#~ msgstr "‫%s (דרושה התייחסות)"
+
+#~ msgid "_Remove All"
+#~ msgstr "ה_סרת הכול"
+
+#~ msgid "Setting Up Updates…"
+#~ msgstr "העדכונים מתגבשים…"
+
+#~ msgid "Looking for New Updates…"
+#~ msgstr "מתבצע חיפוש אחר עדכונים חדשים…"
+
+#~ msgid "_Restart Now"
+#~ 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 "Select All"
+#~ msgstr "בחירה בהכול"
+
+#~ msgid "Select None"
+#~ msgstr "ביטול הבחירה"
+
+#~ msgid "_Installed"
+#~ msgstr "_מותקן"
+
+#~ msgid "_Updates"
+#~ 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, %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 "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 "I have forgotten my password"
+#~ 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 "_Install All"
+#~ 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 "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 "_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 "No sources found."
+#~ msgstr "לא נמצאו מקורות תכנה."
+
+#~ msgid "OK"
+#~ 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 "Web app"
+#~ 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..b871b64
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,3882 @@
+# 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:
+# e2f_in c7 <e2f_in_c7@outlook.com>, 2016-2018
+# Roddy Shuler <roddy@endlessm.com>, 2016-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-20 04:17+0000\n"
+"Last-Translator: Roddy Shuler <roddy@endlessm.com>\n"
+"Language-Team: Hindi (http://www.transifex.com/endless-os/gnome-software/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\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 Software में अपडेट प्रबंधित करना है या नहीं"
+
+#: 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 Software अपडेट पैनल को छिपा देगा और कोई भी स्वचालित अपडेट क्रिया नहीं करेगा."
+
+#: 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 "सक्षम होने पर, GNOME सॉफ्टवेयर स्वचालित रूप से पृष्ठभूमि में अपडेट को डाउनलोड और स्थापित करता है (कुछ ऐप प्रकार, जैसे कि पैकेज को छोड़कर, जहाँ यह तैयार होने पर स्थापित करने के लिए उपयोगकर्ता को संकेत देता है)."
+
+#: 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 "सक्षम होने पर, मीटर्ड कनेक्शन का उपयोग करने पर भी GNOME Software स्वचालित रूप से पृष्ठभूमि में रिफ़्रेश होगा (फलतः कुछ मेटाडाटा डाउनलोड करना, अपडेट के लिए जाँचना इत्यादि, जिससे हो सकता है कि उपयोगकर्ता पर शुल्क लगेे)."
+
+#: data/org.gnome.software.gschema.xml:25
+msgid "Whether it’s the very first run of GNOME Software"
+msgstr "चाहे यह GNOME Software का पहला संचालन हो"
+
+#: 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 "बड़ा मान चुनने का अर्थ होगा कि रिमोट सर्वर के लिए कम राउंड-ट्रिप्स लेकिन उपयोगकर्ताओं को स्क्रीनशॉट्स के अपडेट दिखाने में अधिक समय लग सकता है. 0 मान का अर्थ है कि अगर छवि पहले से ही कैशे में मौजूद है तो सर्वर की कभी जाँच नहीं की जाएगी."
+
+#: 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 "आधिकारिक स्रोतों की सूची जिन्हें 3रा पक्ष नहीं माना जाना चाहिए"
+
+#: 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 "ऐपस्ट्रीम फ़ाइलों का संकेत कर रहेे URL की सूची जिसे एक ऐप-इन्फ़ो फ़ोल्डर में डाउनलोड किया जाएगा"
+
+#: data/org.gnome.software.gschema.xml:143
+msgid "Install the AppStream files to a system-wide location for all users"
+msgstr "सभी उपयोक्ताओं के लिए पूरे सिस्टम पर AppStream फ़ाइलें स्थापित करें"
+
+#: 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 "एप्लिकेशन का विवरण दिखाएँ (एप्लिकेशन 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 "पैकेज का नाम"
+
+#: src/gs-application.c:136
+msgid "Install the application (using application ID)"
+msgstr "ऐप्लिकेशन स्थापित करें (ऐप्लिकेशन ID का उपयोग करके)"
+
+#: 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 "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 "%s के बारे में"
+
+#. 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 "पिन"
+
+#: 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 "एक USB ड्राइव में उपलब्ध है"
+
+#: 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 "1 से लेकर %u तक की कोई संख्या डालें: "
+
+#. 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 "OS अपेडट अब स्थापित कर दिए गए हैं"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by "
+"“%s”."
+msgstr "%s, <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">मुफ़्त और खुले स्रोत सॉफ़्टवेयर नहीं है</a>, और “%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 "3रें पक्षों के साथ उपयोगकर्ता जानकारी साझा करना"
+
+#. 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 "“%s” को ढूँढ़ने में असमर्थ"
+
+#. 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 "CSS की पुष्टि हुई, यह ठीक है!"
+
+#. 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 "%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 "GNOME सॉफ्टवेयर बैनर डिज़ाइनर"
+
+#: 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 "ऐप्लिकेशन ID"
+
+#: 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 "OS अपग्रेड"
+
+#. 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 "क्या आप वाकई %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 शुल्क लिया जाएगा."
+
+#. 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 "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 "हाल ही में स्थापित किए गए सॉफ़्टवेयर में से कुछ %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] "%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:890 src/gs-shell.c:895 src/gs-shell.c:910 src/gs-shell.c:914
+#, 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:942
+#, 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:948
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s से अपडेट डाउनलोड करने में असमर्थ"
+
+#. 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 "%s से अपडेट डाउनलोड करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं"
+
+#. 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 "%s से डाउनलोड विफल होने के कारण %s स्थापित करने में असमर्थ"
+
+#. 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 "डाउनलोड विफल होने के कारण %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:1063
+#, c-format
+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:1069
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "समर्थित नहीं होने के कारण %s स्थापित करने में असमर्थ"
+
+#. 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 "%s स्थापित करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1095
+#, c-format
+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:1102
+#, c-format
+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:1109
+#, c-format
+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:1122
+#, c-format
+msgid "Your %s account has been suspended."
+msgstr "आपका %s खाता निलंबित कर दिया गया है."
+
+#. 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 "अधिक जानकारी के लिए, %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:1146
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "%s स्थापित करने में असमर्थ: AC बिजली आवश्यक है"
+
+#. 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 "%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:1201
+#, c-format
+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:1207
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "डाउनलोड विफल होने के कारण %s को अपडेट करने में असमर्थ"
+
+#. 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 "%s को अपडेट करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं"
+
+#. 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 "%s को अपडेट करने में असमर्थ: प्रमाणीकरण आवश्यक था"
+
+#. 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 "%s को अपडेट करने में असमर्थ: प्रमाणीकरण अमान्य था"
+
+#. 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 "%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:1252
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "%s अपडेट करने में असमर्थ: AC बिजली आवश्यक है"
+
+#. 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 "%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:1306
+#, c-format
+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:1311
+#, 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: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 "%s में नवीनीकृत करने में असमर्थ: पर्याप्त डिस्क स्थान नहीं"
+
+#. 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 "%s में नवीनीकृत करने में असमर्थ: प्रमाणीकरण आवश्यक था"
+
+#. 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 "%s में नवीनीकृत करने में असमर्थ: प्रमाणीकरण अमान्य था"
+
+#. 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 "%s में नवीनीकृत करने में असमर्थ: आपके पास नवीनीकरण की अनुमति नहीं है"
+
+#. 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 "%s पर अपग्रेड करने में असमर्थ: AC बिजली आवश्यक है"
+
+#. 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 "%s में नवीनीकृत करने में असमर्थ"
+
+#. 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 "%s को निकालने में असमर्थ: प्रमाणीकरण आवश्यक था"
+
+#. 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 "%s को निकालने में असमर्थ: प्रमाणीकरण अमान्य था"
+
+#. 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 "%s को निकालने में असमर्थ: आपके पास सॉफ़्टवेयर को निकालने की अनुमति नहीं है"
+
+#. 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 "%s हटाने में असमर्थ: सॉफ्टवेयर"
+
+#. 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 "%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:1481
+#, 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: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 "%s से संपर्क करने में असमर्थ"
+
+#. 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 "नए प्लग-इन्स का उपयोग करने के लिए %s को पुनरारंभ किए जाने की आवश्यकता है."
+
+#. 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 "AC बिजली आवश्यक है"
+
+#. 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 "%s %s अब समर्थित नहीं है."
+
+#. TRANSLATORS: OS refers to operating system, e.g. Fedora
+#: src/gs-updates-page.c:1180
+msgid "Your OS is no longer supported."
+msgstr "आपका OS अब समर्थित नहीं है."
+
+#. 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 "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: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 "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;सॉफ्टवेयर;ऐप्लिकेशन;"
+
+#: 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 "IDEs"
+
+#: 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 "Word प्रोसेसर"
+
+#: 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 "Shell विस्तारण"
+
+#: 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 "Dev टूल"
+
+#: plugins/core/gs-desktop-common.c:346
+msgid "USB"
+msgstr "USB"
+
+#. 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 "GNOME Software AppStream सिस्टम-व्यापी इंस्टॉलर"
+
+#: 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 "अपने Fedora तंत्र को नवीनतम सुविधाओं और सुधारों पर अपग्रेड करें."
+
+#: 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 "Flatpak, Linux पर डेस्कटॉप ऐप्लिकेशन्स के लिए एक फ़्रेमवर्क है"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:871
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "%s के लिए flatpak मेटाडेटा प्राप्त कर रहा है…"
+
+#: plugins/flatpak/gs-flatpak.c:2114
+#, c-format
+msgid ""
+"The app %s is missing its runtime. Update the app to repair this problem."
+msgstr "ऐप %s में रनटाइम गायब है. इसे ठीक करने के लिए ऐप अपडेट करें."
+
+#. 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 "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 डेवलपर्स को आसानी से सॉफ़्टवेयर बंडल बनाने का एक तरीका प्रदान करता है"
+
+#. 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 ऐप्लिकेशन्स को उपयोगकर्ता समीक्षाएँ प्रदान करने वाली सेवा है"
+
+#. 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 "Snappy समर्थन"
+
+#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:7
+msgid "A snap is a universal Linux package"
+msgstr "स्नैप एक विश्वव्यापी Linux पैकेज है"
+
+#. 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 "Steam समर्थन"
+
+#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7
+msgid "The ultimate entertainment platform from Valve"
+msgstr "Valve की ओर से एक शानदार मनोरंजन प्लेटफ़ॉर्म"
diff --git a/po/hr.po b/po/hr.po
new file mode 100644
index 0000000..9c3894c
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,7404 @@
+# 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 <EMAIL@ADDRESS>, 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-09-22 16:06+0000\n"
+"PO-Revision-Date: 2022-10-01 23:17+0200\n"
+"Last-Translator: gogo <trebelnik2@gmail.com>\n"
+"Language-Team: Croatian <hr@li.org>\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:2043
+#: 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."
+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."
+
+#: 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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Softver AppStream instalacijski program za cijeli sustav"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Na čekanju"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 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:465 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:205 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
+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:516
+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:855
+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:533
+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:2149
+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:153
+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:159
+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:167 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:175 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:183
+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:188 src/gs-app-row.c:198 src/gs-details-page.ui:281
+#: 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:212
+msgid "Uninstalling"
+msgstr "Deinstalacija"
+
+#. 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 "Uređaj se ne može koristiti tijekom nadopune."
+
+#. 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 "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:523
+#, 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:294 src/gs-removal-dialog.ui:17
+#: 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nije <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">slobodan softver otvorenog kôda</a>, 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:870 src/gs-details-page.c:896
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instaliraj"
+
+#: src/gs-details-page.c:886
+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:910
+msgid "_Install…"
+msgstr "_Instaliraj…"
+
+#. 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 "Ostale aplikacije od %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+msgid "You need internet access to write a review"
+msgstr "Potreban vam je pristup internetu za pisanje recenzije"
+
+#: src/gs-details-page.c:1732 src/gs-details-page.c:1748
+#, 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:244
+msgid "_Open"
+msgstr "_Otvori"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Nadopuni"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Preuzimanje"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Dodaci"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Odabrani dodaci će biti instalirani s aplikacijom."
+
+#: src/gs-details-page.ui:567
+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:587
+msgid "Software Repository Included"
+msgstr "Softverski repozitorij je uključen"
+
+#: src/gs-details-page.ui:588
+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:605
+msgid "No Software Repository Included"
+msgstr "Nema uključenog softverskog repozitorija"
+
+#: src/gs-details-page.ui:606
+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:624
+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:641
+msgid "Software Repository Identified"
+msgstr "Softverski repozitorij otkriven"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Koristite samo repozitorije softvera kojima vjerujete."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nema metapodataka"
+
+#: src/gs-details-page.ui:717
+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:745
+msgid "Project _Website"
+msgstr "Web stranica _projekta"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donirajte"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Doprinesite _prijevodu"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Prijavite problem"
+
+#: src/gs-details-page.ui:813
+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:908
+msgid "_Write Review"
+msgstr "_Napiši recenziju"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Sve recenzije"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:244
+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 <a href=\"%s\">%s license</a>.\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 <a href=\"%s\">%s licencom</a>.\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:2825
+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: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 ""
+"Pojedini trenutno instalirani softver nije kompatibilan sa %s. Ako "
+"nastavite, sljedeći paketi će biti automatski uklonjeni tijekom nadogradnje:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Nekompatibilan softver"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Nastavi"
+
+#. 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Saznajte koji se podaci šalju u <a href=\"https://odrs.gnome.org/"
+"privacy\">pravilima privatnosti</a>. 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: 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 ""
+"Nema dovoljno slobodnog diskovnog prostora — oslobodite nešto prostora i "
+"pokušajte ponovno"
+
+#. 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 "Nažalost, nešto je pošlo po krivu"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+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:1884
+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:1919
+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:1922
+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:1963
+#, 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:1973
+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:1977
+msgid "AC power is required"
+msgstr "Potrebno je priključiti napajanje"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Predmemorija podataka može se ukloniti iz <a href=\"dummy\">_postavke "
+"aplikacije</a>."
+
+#: 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
+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
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6
+msgid "Web Apps Support"
+msgstr "Web Apps podrška"
+
+#: 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:1037
+#, 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:1051
+#, 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: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 ""
+"Udaljeni “%s” ne dopušta instalaciju “%s”, vjerojatno zbog njegovog filtra. "
+"Uklonite filter i ponovite instalaciju. Pojedinosti greške: %s"
+
+#. 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s nadopuna kamere"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM nadopuna"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s nadopuna touchpada"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s nadopuna USB prijemnika"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+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 "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 "OS Upgrade"
+#~ msgstr "Nadogradnja operativnog sustava"
+
+#~ 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..18f8ddc
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,5330 @@
+# Hungarian translation for gnome-software.
+# Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnome-software package.
+#
+# Balázs Úr <ur.balazs at fsf dot hu>, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2013, 2014, 2015, 2016, 2017, 2018.
+# Balázs Meskó <mesko.balazs at fsf dot hu>, 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: 2022-11-10 08:29+0000\n"
+"PO-Revision-Date: 2022-09-02 23:05+0200\n"
+"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
+"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\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 19.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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "A GNOME projekt"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"Az utolsó időbélyeg, amikor a rendszer kapcsolatban volt és frissítéseket "
+"kapott"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "A vélemények minimális karma pontszáma"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Frissítések ajánlása előzetes kiadásokhoz"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+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:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "Az URI, amely elmagyarázza a nem szabad és a tulajdonosi szoftvereket"
+
+#: 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 ""
+"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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "Ö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 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 "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:1027
+#, 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:1031
+#, 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 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 "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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Korhatár-besorolás"
+
+#: 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 "Hogyan adhatók hozzá a hiányzó információk"
+
+#: lib/gs-app.c:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+msgid "Package"
+msgstr "Csomag"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Függőben"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Függőben lévő telepítés"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Függőben lévő eltávolítás"
+
+#: 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 "Telepítve"
+
+#. 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 "Telepítés"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Eltávolítás"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Eltávolítás"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Hálózat"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Kommunikálhat a hálózaton keresztül"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Rendszerszolgáltatások"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Munkamenet-szolgáltatások"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Eszközök"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Hozzáférhet a rendszereszköz fájljaihoz"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Saját mappa"
+
+#: 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 "Megtekinthet, szerkeszthet és létrehozhat fájlokat"
+
+#: 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 "Megtekinthet fájlokat"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Letöltések mappa"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Beállítások"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Megtekinthet és megváltoztathat bármilyen beállítást"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Örökölt megjelenítési rendszer"
+
+#: src/gs-app-details-page.c:80
+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:81
+msgid "Sandbox escape"
+msgstr "Biztonságos környezet elhagyása"
+
+#: src/gs-app-details-page.c:81
+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"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "A frissítés részletei"
+
+#. 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 "Nem áll rendelkezésre frissítési leírás."
+
+#: 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 "Vissza"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "További jogosultságokat igényel"
+
+#. 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 "Vélemények"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Nem találhatók vélemények ehhez az alkalmazáshoz."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Nincsenek vélemények"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Verziótörténet"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Újdonság a(z) %s verzióban"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "%s verzió"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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: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 "Show verbose debugging information"
+msgstr "Részletes hibakeresési információk megjelenítése"
+
+#: 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 update preferences"
+msgstr "Frissítési 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 A GNOME Szoftver közreműködői"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Kelemen Gábor <kelemeng at gnome dot hu>\n"
+"Úr Balázs <ur dot balazs at fsf dot hu>\n"
+"Meskó Balázs <mesko dot balazs at fsf dot hu>"
+
+#. 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 "A Szoftver névjegye"
+
+#. 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 "A rendszerén található szoftverek kezelése elegánsan."
+
+#. 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 "Elnézést, nincsenek részletek ahhoz az alkalmazáshoz."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Hardverszereszközökhöz férhet hozzá"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Tetszőleges fájlokhoz férhet hozzá"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Tetszőleges jogosultságokat szerezhet"
+
+#. 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 "Felülvizsgálva a disztribúció által"
+
+#. 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 "Harmadik fél által biztosított"
+
+#. 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 "Tulajdonosi (zárt) 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 "Auditálható kód"
+
+#. 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 "A szoftverfejlesztő megerősített"
+
+#. 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 "A szoftver már nem támogatott"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Nem biztonságos"
+
+#: 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 "Csak mobilos"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Csak kis képernyőn működik"
+
+#: 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 "Csak asztali"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Csak nagy képernyőn működik"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Képernyőméret-eltérés"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Nem támogatja a jelenlegi kijelzőméretét"
+
+#: 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 "Érintőképernyőt igényel"
+
+#: 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 "Billentyűzetet igényel"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Egeret igényel"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Játékvezérlő szükséges"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Alkalmazkodó"
+
+#: src/gs-app-context-bar.c:644
+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:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Valószínűleg billentyűzetet és egeret igényel"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Nem tartalmaz korhatáros tartalmat"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Honlap felkeresése"
+
+#. 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 "Telepítés…"
+
+#. 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 "Mégse"
+
+#. 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 "Telepítés"
+
+#. 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 "Frissítés"
+
+#. 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 "Eltávolítás"
+
+#. 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 "Eltávolítás"
+
+#. 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 "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:337 src/gs-shell-search-provider.c:264
+#, 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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Átnevezve erről: %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Segítsen a %s fordításában"
+
+#. 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 ""
+"A %st egy önkéntesekbő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:5
+msgid "Translations"
+msgstr "Fordítások"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Fordítási weboldal"
+
+#. 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 "Bejelentkezés szükséges távoli %s (tartomány: %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Bejelentkezés szükséges"
+
+#: 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 "Mé_gse"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Bejelentkezés"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Felhasználó"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Jelszó"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Új és frissített"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Egyéb szoftverek"
+
+#. 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 "Adjon meg egy számot 1 és %u között: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Válasszon alkalmazást:"
+
+#: 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 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 "A(z) %s telepítve lett"
+
+#. 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 "A változtatások érvénybe léptetéséhez újraindítás szükséges."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "A rendszer frissítései telepítve"
+
+#. 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 "A nemrég telepített frissítések megtekinthetőek"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Újraindítás"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Indítás"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Telepíti a harmadik féltől származó szoftvereket?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+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. Application name, e.g. "Firefox"
+#. * 2. Software repository name, e.g. fedora-optional
+#.
+#: src/gs-common.c:240
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"A(z) %s nem <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">szabad és nyílt forrású szoftver</a>, és a következő "
+"biztosítja: „%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 "A(z) %s alkalmazást ez biztosítja: „%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Ne figyelmeztessen többé"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+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:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Részletek"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Elfogadás"
+
+#. 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] "Egy frissítés lett telepítve"
+msgstr[1] "Frissítések lettek telepítve"
+
+#. 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] "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:766
+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 a változtatás érvénybe léptetéséhez."
+msgstr[1] "Újraindítás szükséges a változtatások érvénybe léptetéséhez."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Most nem"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Épp most"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d évvel ezelőtt"
+msgstr[1] "%d évvel 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: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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Több"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Kevesebb"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Eltávolítás…"
+
+#: src/gs-details-page.c:367
+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:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Függőben lévő frissítés…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Előkészítés…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Eltávolítás…"
+
+#. 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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Telepítés"
+
+#: src/gs-details-page.c:889
+msgid "_Restart"
+msgstr "Új_raindítá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:913
+msgid "_Install…"
+msgstr "_Telepítés…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Egyéb alkalmazások a következőtől: %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+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:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nem található: „%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Részletek oldal"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Alkalmazás részleteinek betöltése…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Ez a szoftver nem érhető el az Ön nyelvén, így angolul (amerikai) fog "
+"megjelenni."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Segítsen a _fordításban"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Megnyitás"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Frissítés"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Letöltés"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Kiegészítők"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "A kijelölt kiegészítők telepítve lesznek az alkalmazással."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Szoftvertárolót tartalmaz"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Nem tartalmaz szoftvertárolót"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Szoftvertároló azonosítva"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Csak olyan szoftvertárolókat használjon, amelyekben megbízik."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nincsenek metaadatok"
+
+#: src/gs-details-page.ui:717
+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, kódtárolóhoz vagy a "
+"hibakövetőhöz."
+
+#: src/gs-details-page.ui:745
+msgid "Project _Website"
+msgstr "Projekt _webhelye"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Adományozás"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Közreműködés a _fordításban"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Hiba jelentése"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Súgó"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:907
+msgid "_Write Review"
+msgstr "_Vélemény írása"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+msgid "All Reviews"
+msgstr "Összes vélemény"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:272
+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: 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] "Elérhető betűkészletek a(z) %s írásrendszerhez"
+msgstr[1] "Elérhető betűkészletek a(z) %s írásrendszerekhez"
+
+#. 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] "Elérhető szoftverek ehhez: %s"
+msgstr[1] "Elérhető szoftverek ehhez: %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "A kért szoftver nem található"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "„%s” nem található"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "ezen a weblapon"
+
+#. 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 "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: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 ""
+"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 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 "Nem érhetők el alkalmazások a következő támogatásához: %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:376
+#, 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: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 ""
+"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 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 ""
+"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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"A(z) %2$s által kért %1$s kodek nem található. További információkért nézze "
+"meg %3$s."
+msgstr[1] ""
+"A(z) %2$s által kért %1$s kodek nem található. 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: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] ""
+"A keresett %s kodek nem található. További információkért nézze meg %s."
+msgstr[1] ""
+"A keresett %s kodek nem található. További információkért nézze meg %s."
+
+#: 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 "Semmilyen keresési találatokat sem sikerült találni: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s fájlformátum"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Nem találhatók a kért szoftverek"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kodekek oldal"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Asztali támogatás"
+
+#: 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 "Támogatja a nagy képernyőn történő használatot"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Asztali támogatás ismeretlen"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Nagy képernyő szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Az asztali számítógépek nem támogatottak"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Nem használható nagy képernyőn"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobilos támogatás"
+
+#: 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 "Támogatja a kis képernyőn történő használatot"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobilos támogatás ismeretlen"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Kis képernyő szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "A mobilok nem támogatottak"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Nem használható kis képernyőn"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Billentyűzettámogatás"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Billentyűzettámogatás ismeretlen"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Billentyűzet szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Támogatja a billentyűzeteket"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "A billentyűzet nem támogatott"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Nem használható billentyűzettel"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Egértámogatá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 "Egér vagy mutatóeszköz szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Egértámogatás ismeretlen"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Egér szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Támogatja az egereket és mutatóeszközöket"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Az egerek nem támogattok"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Érintőképernyő-támogatás"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Érintőképernyő-támogatás ismeretlen"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Érintőképernyő szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Támogatja az érintőképernyőket"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Az érintőképernyők nem támogatottak"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Nem használható érintőképernyővel"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Játékvezérlő szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Játékvezérlő szükséges"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Játékvezérlő-támogatás"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "A(z) %s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hardvertámogatás"
+
+#. 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 "Telepítve"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Telepítettek oldal"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Alkalmazások"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Webalkalmazások"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Rendszeralkalmazások"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Közösségileg készítve"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Ezt a szoftvert önkéntesek közössége fejleszti nyilvánosan, és a(z) <a href="
+"\"%s\">%s licenc</a> alatt adja közre.\n"
+"\n"
+"Közreműködhet, és segíthet még jobbá tenni."
+
+#. 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 ""
+"Ezt a szoftvert önkéntesek közössége fejleszti nyilvánosan, és a(z) %s "
+"licenc alatt adja közre.\n"
+"\n"
+"Közreműködhet, és segíthet még jobbá tenni."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Tulajdonosi (zárt)"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Tudjon meg többet"
+
+#: 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 ""
+"Ezt a szoftver 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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Szoftverkatalógus letöltése"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Betöltési oldal"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Indítás…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatikus frissítések szüneteltetve"
+
+#: 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 ""
+"A jelenlegi hálózat forgalomdíjas. A forgalomdíjas kapcsolatok adatkorláttal "
+"rendelkeznek vagy folyamatos költségeket számítanak fel. Az adatmennyiséggel "
+"spórolás érdekében a frissítések szüneteltetve lettek.\n"
+"\n"
+"Az automatikus frissítések akkor lesznek folytatva, ha elérhetővé válik egy "
+"nem forgalomdíjas hálózat. Addig is, kézzel továbbra is telepíthet "
+"frissítéseket.\n"
+"\n"
+"Egyéb esetben, ha a jelenlegi hálózat hibásan lett forgalomdíjasként "
+"azonosítva, akkor a beállítás módosítható."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Hálózati _beállítások megnyitása"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderálás oldal"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Nincs több moderálandó vélemény"
+
+#: 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:108
+msgid "Beta"
+msgstr "Béta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+msgid "User"
+msgstr "Felhasználó"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Telepítendők"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+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:258
+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:262
+msgid "Downgrades"
+msgstr "Visszafejlesztendők"
+
+#. 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 "kiválasztott külső források"
+
+#. 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 ""
+"Hozzáférést biztosít további, innen származó szoftverekhez: %s. Tulajdonosi "
+"(zárt) szoftvereket is tartalmazhat."
+
+#. 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 "Engedélyezés"
+
+#. 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 "Felfedezés"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Áttekintés oldal"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Engedélyezi a harmadik féltől származó szoftvertárolókat?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Egyéb kategóriák"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nem találhatók alkalmazásadatok"
+
+#: lib/gs-plugin-loader.c:2829
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "A felhasználó elutasította a telepítést"
+
+#. 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 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:518
+#, 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
+#: 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Biztosan el szeretné távolítani a következőt: „%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 ""
+"A(z) %s eltávolításra kerül, és telepíteni kell az újra történő használathoz."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Frissítési beállítások"
+
+#: 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 ""
+"A lehetséges díjak és hálózati korlátozások miatt a szoftverfrissítések nem "
+"töltődnek le automatikusan, ha mobil vagy forgalomkorlátos kapcsolatokat "
+"használ."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatikus frissítések"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Letölti és telepíti a szoftverfrissítéseket a háttérben, ha lehetséges."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Automatikus frissítés értesítései"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Értesítések megjelenítése, amikor a frissítések automatikusan telepítve "
+"lettek."
+
+#. 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 ""
+"Néhány jelenleg telepített szoftver nem összeférhető ezzel: %s. Ha "
+"folytatja, akkor a frissítés során automatikusan el lesz távolítva a "
+"következő:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Összeférhetetlen szoftverek"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Folytatás"
+
+#. 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 ""
+"A(z) „%s” helyről telepített szoftverek nem fognak további frissítéseket "
+"kapni."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Letiltja a tárolót?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Eltávolítás"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Új tárolók engedélyezése"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Szoftvertárolók"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nincsenek tárolók"
+
+#. 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 alkalmazás telepítve"
+msgstr[1] "%u alkalmazás telepítve"
+
+#. 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 kiegészítő telepítve"
+msgstr[1] "%u kiegészítő telepítve"
+
+#. 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 alkalmazás"
+msgstr[1] "%u alkalmazás"
+
+#. 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 kiegészítő"
+msgstr[1] "%u kiegészítő"
+
+#. 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 és %s telepítve"
+msgstr[1] "%s és %s telepítve"
+
+#. 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 "Utálom"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Nem kedvelem"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Rendben van"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Kedvelem"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Imádom"
+
+#. 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 "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:122
+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:126
+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:130
+msgid "The summary is too long"
+msgstr "Az összegzés túl hosszú"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+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:138
+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:10
+msgid "Post Review"
+msgstr "Vélemény közzététele"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Közzététel"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Értékelés"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Összegzés"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Adja meg a véleménye rövid összegzését, például: „Nagyszerű alkalmazás, "
+"ajánlanám”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Vélemény"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Mit gondol az alkalmazásról? Próbálja megindokolni véleményét."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Keresse meg az <a href=\"https://odrs.gnome.org/privacy\">adatvédelmi "
+"irányelveinkben</a>, 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Jelenti a véleményt?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Jelentés"
+
+#. 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 "Hasznos volt ez a vélemény?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Igen"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nem"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Nem igazán"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Jelentés…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Eltávolítás…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Ellenőrizze, hogy megbízik-e a gyártóban, mivel az alkalmazás nem "
+"biztonságos környezetben fut"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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ú"
+
+#. 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 "Nincsenek jogosultságok"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Hálózati hozzáférés"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Nincs hálózati hozzáférés"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Rendszerszolgáltatásokat használ"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Munkamenet-szolgáltatásokat használ"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Eszközhozzáférés"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Nincs eszközhozzáférés"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Saját mappa olvasási/írási hozzáférése"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Teljes fájlrendszer olvasási hozzáférése"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Saját mappa olvasási hozzáférése"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+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:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Letöltési mappa olvasási hozzáférése"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Nincs fájlrendszer-hozzáférés"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Egyáltalán nem érheti el a fájlrendszert"
+
+#. 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 "Tulajdonosi (zárt) 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 ""
+"A forráskód nem nyilvános, így nem lehet függetlenül auditálni, és lehet, "
+"hogy nem biztonságos"
+
+#. 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 "Auditálható kód"
+
+#: 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 ""
+"A forráskód nyilvános, és függetlenül auditálható, emiatt az alkalmazás "
+"valószínűbb, hogy biztonságos"
+
+#. 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 "Az alkalmazásfejlesztő megerősített"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Nem biztonságos függőségek"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 "A(z) %s 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:383
+#, 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "A(z) %s nem biztonságos"
+
+#. 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 "Biztonság"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Forrás"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Elavult SDK verzió"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Nincs képernyőkép megadva"
+
+#. 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 "Nem található képernyőkép"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+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:797
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Keresés az oldalon"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Alkalmazások keresése"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "A firmware frissítések nem tölthetőek le 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:1281
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "A frissítések nem tölthetőek le innen: %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 "A frissítések nem tölthetőek le"
+
+#. 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 ""
+"A frissítések nem tölthetőek le: internet-hozzáférés szükséges, de nem "
+"érhető el"
+
+#. 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 "A frissítések nem tölthetőek le innen: %s, nincs elég lemezterület"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "A frissítések nem tölthetőek le: nincs elég lemezterület"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "A frissítések nem tölthetőek le: hitelesítés szükséges"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "A frissítések nem tölthetőek le: a hitelesítés érvénytelen"
+
+#. 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 "A frissítések nem tölthetőek le: nincs joga szoftvereket telepíteni"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "A frissítések listája nem kérhető le"
+
+#. 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 "A(z) %s nem telepíthető, mert a letöltés meghiúsult innen: %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 "A(z) %s nem telepíthető, mert a letöltés meghiúsult"
+
+#. 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 "A(z) %s nem telepíthető, mert a(z) %s futtatókörnyezet nem érhető el"
+
+#. 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 "A(z) %s nem telepíthető, mert nem támogatott"
+
+#. 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 "Nem telepíthető: internet-hozzáférés szükséges, de nem érhető el"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nem telepíthető: az alkalmazás formátuma érvénytelen"
+
+#. 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 "A(z) %s nem telepíthető: nincs elég lemezterület"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "A(z) %s nem telepíthető: hitelesítés szükséges"
+
+#. 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 "A(z) %s nem telepíthető: a hitelesítés érvénytelen"
+
+#. 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 "A(z) %s nem telepíthető: nincs joga szoftvereket telepíteni"
+
+#. 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 "A(z) %s nem telepíthető: elektromos hálózat szükséges"
+
+#. 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 "A(z) %s nem telepíthető: az akkumulátorszint túl alacsony"
+
+#. 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 "A(z) %s nem telepíthető"
+
+#. 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 "A(z) %s nem frissíthető %s használatakor, mert a letöltés meghiúsult"
+
+#. 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 "A(z) %s nem frissíthető, mert a letöltés meghiúsult"
+
+#. 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 ""
+"Nem lehet telepíteni a frissítéseket %s használatakor, mert a letöltés "
+"meghiúsult"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nem lehet telepíteni a frissítéseket, mert a letöltés meghiúsult"
+
+#. 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 "Nem lehet frissíteni: internetelérés szükséges, de nem érhető el"
+
+#. 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 "A(z) %s nem frissíthető: nincs elég lemezterület"
+
+#. 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 "Nem lehet telepíteni a frissítéseket: nincs elég szabad hely"
+
+#. 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 "A(z) %s nem frissíthető: hitelesítés szükséges"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nem lehet telepíteni a frissítéseket: hitelesítés szükséges"
+
+#. 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 "A(z) %s nem frissíthető: a hitelesítés érvénytelen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Nem lehet telepíteni a frissítéseket: a hitelesítés érvénytelen"
+
+#. 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 "A(z) %s nem frissíthető: nincs joga szoftvereket frissíteni"
+
+#. 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 ""
+"Nem lehet telepíteni a frissítéseket: nincs joga szoftvereket frissíteni"
+
+#. 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 "A(z) %s nem frissíthető: elektromos hálózat szükséges"
+
+#. 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 "Nem lehet telepíteni a frissítéseket: elektromos hálózat szükséges"
+
+#. 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 "A(z) %s nem frissíthető: az akkumulátorszint túl alacsony"
+
+#. 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 "Nem lehet telepíteni a frissítéseket: az akkumulátorszint túl alacsony"
+
+#. 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 "A(z) %s nem frissíthető"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nem lehet telepíteni a frissítéseket"
+
+#. 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 "Nem lehet frissíteni erre: %s, erről: %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 "Nem lehet frissíteni erre: %s, mert a letöltés meghiúsult"
+
+#. 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 ""
+"Nem lehet frissíteni erre: %s: internet-hozzáférés szükséges, de nem érhető "
+"el"
+
+#. 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 "Nem lehet frissíteni erre: %s, 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nem lehet frissíteni erre: %s, 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Nem lehet frissíteni erre: %s, a hitelesítés érvénytelen"
+
+#. 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 "Nem lehet frissíteni erre: %s, nincs joga frissíteni"
+
+#. 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 "Nem lehet frissíteni erre: %s, elektromos hálózat 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:1712
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Nem lehet frissíteni erre: %s, az akkumulátorszint túl alacsony"
+
+#. 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 "Nem lehet frissíteni erre: %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 "A(z) %s nem távolítható el: hitelesítés szükséges"
+
+#. 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 "A(z) %s nem távolítható el: a hitelesítés érvénytelen"
+
+#. 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 "A(z) %s nem távolítható el: nincs joga szoftvereket eltávolítani"
+
+#. 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 "A(z) %s nem távolítható el: elektromos hálózat szükséges"
+
+#. 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 "A(z) %s nem távolítható el: az akkumulátorszint túl alacsony"
+
+#. 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 "A(z) %s nem távolítható el"
+
+#. 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 "A(z) %s nem indítható el: a(z) %s nincs telepítve"
+
+#. 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 "Elnézést, hiba történt"
+
+#. 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 ""
+"Nincs elég lemezterület – szabadítson fel egy kis helyet, és próbálja újra"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Nem sikerült telepíteni a fájlt: nem támogatott"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1891
+msgid "Failed to install file: authentication failed"
+msgstr "Nem sikerült telepíteni a fájlt: a hitelesítés sikertelen"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1926
+msgid "Failed to install: not supported"
+msgstr "Nem sikerült telepíteni: nem támogatott"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1929
+msgid "Failed to install: authentication failed"
+msgstr "Nem sikerült telepíteni: a hitelesítés sikertelen"
+
+#. 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 "Nem vehető fel a kapcsolat ezzel: %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 "A Szoftver újraindítása szükséges az új bővítmények használatához."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1984
+msgid "AC power is required"
+msgstr "Elektromos hálózat szükséges"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "Az akkumulátorszint túl alacsony"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "S_zoftvertárolók"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Frissítési beállítások"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Lemez vizsgálata"
+
+#. 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 "Hálózati beállítások"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Újraindítás most"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "További információk"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Keresés"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Elsődleges menü"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Tudjon meg _többet"
+
+#. 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 "Frissítések"
+
+#. 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 "Application Data"
+msgstr "Alkalmazásadatok"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Tárhely"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"A gyorsítótárazott adatok törölhetők az <a href=\"dummy"
+"\">_alkalmazásbeállításokban</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (telepítve)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (telepítés)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (eltávolítás)"
+
+#. 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 "Telepített frissítések"
+
+#. 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 "Telepítve ekkor: %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Nem lett frissítés telepítve"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "A szoftverfrissítések elavultak"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Ellenőrizze a szoftverfrissítéseket."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritikus szoftverfrissítés áll telepítésre készen"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Egy fontos szoftverfrissítés készen áll a telepítésre."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritikus szoftverfrissítések érhetők el letöltésre"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Fontos: kritikus szoftverfrissítések várakoznak."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Szoftverfrissítések állnak telepítésre készen"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Szoftverfrissítések várakoznak, és telepítése készen állnak."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Szoftverfrissítések érhetők el letöltésre"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Töltse le a várakozó szoftverfrissítéseket."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u alkalmazás frissítve"
+msgstr[1] "%u alkalmazás frissítve"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "A(z) %s frissítve lett."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Indítsa újra az alkalmazást."
+
+#. 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 "A(z) %s és a(z) %s frissítve lett."
+
+#. 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 alkalmazás újraindítást igényel."
+msgstr[1] "%u alkalmazás újraindítást igényel."
+
+#. 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 "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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Nem érhetők el operációs rendszer frissítések"
+
+#. 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 ""
+"Frissítse rendszerét, hogy továbbra is kaphasson biztonsági frissítéseket."
+
+#. 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 "A(z) %s egy új verziója érhető el telepítésre"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+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:1137
+msgid "Software Updates Failed"
+msgstr "A szoftverfrissítések meghiúsultak"
+
+#. 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 "Egy fontos operációs rendszer frissítés telepítése sikertelen volt."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Részletek megjelenítése"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Vélemény"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Utolsó ellenőrzés: %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 "A(z) %s %s már nem támogatott."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Az operációs rendszere már nem támogatott."
+
+#. 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 "Ez azt jelenti, hogy nem fog biztonsági frissítéseket kapni."
+
+#. 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 "Ajánlott, hogy frissítsen egy frissebb verzióra."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+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:853
+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:857
+msgid "Check _Anyway"
+msgstr "Keresés _mindenképp"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nincs hálózat"
+
+#. 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 "A frissítések kereséséhez internetkapcsolat szükséges."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Frissítések keresése"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Frissítések"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Frissítések oldal"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Frissítések betöltése…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Naprakész"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Mobil adatkapcsolat használata?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Keresés mindenképp"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Nincs kapcsolat"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Csatlakozzon az internetre a frissítések kereséséhez."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Hálózati beállítások"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Hiba"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "A frissítések automatikusan kezeltek."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Újraindítás és frissítés"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Összes frissítése"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+msgid "Integrated Firmware"
+msgstr "Beépített 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 "Ú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:460
+msgid "Application Updates"
+msgstr "Alkalmazásfrissítések"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Eszköz firmware"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "A(z) %s már elérhető"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Tudjon meg többet az új verzióról"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Letöltés…"
+
+#. 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 / %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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% letöltve"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Új_raindítás és frissítés"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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 ""
+"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: 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 "Rendszerfrissítések"
+
+#. 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 ""
+"Általános rendszerfrissítések, például biztonsági vagy hibajavítások, "
+"valamint teljesítménybeli fejlesztések."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Kiemelt képek letöltése…"
+
+#. 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 "Egy %s-frissítés új funkciókkal és javításokkal."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Frissítési információk letöltése…"
+
+#. 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 ""
+"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 applications on Linux"
+msgstr "A Flatpak egy keretrendszer Linuxos asztali alkalmazásokhoz"
+
+#. 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 "%s rendszermappa"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Saját mappa %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Gazdarendszer mappái"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Gazdarendszer konfigurációja az /etc mappából"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Asztal mappa"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Asztal %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumentumok mappa"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumentumok %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Zenék mappa"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Zenék %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Képek mappa"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Képek %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Nyilvános megosztás mappa"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Nyilvános megosztás %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videók mappa"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videók %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Sablonok mappa"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Sablonok %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Felhasználói gyorsítótár mappa"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Felhasználói gyorsítótár %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Felhasználói beállítás mappa"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Felhasználói beállítás %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Felhasználói adatok mappa"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Felhasználói adatok %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Felhasználói futtatókörnyezet mappa"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Felhasználói futtatókörnyezet %s almappája"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Flatpak metaadatok lekérése ehhez: %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, c-format
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr "Nem sikerült a(z) „%s” bővítmény finomítása: %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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB-vevő frissítése"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Firmware"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Firmware frissítés támogatás"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7
+msgid "Provides support for firmware upgrades"
+msgstr "Támogatást biztosít a firmware frissítésekhez"
+
+#: plugins/packagekit/gs-packagekit-task.c:148
+msgid "Install Unsigned Software?"
+msgstr "Telepíti a nem aláírt szoftvert?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Letölti a nem aláírt szoftvert?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Frissíti a nem aláírt szoftvert?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Csomagok"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2696
+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"
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..c907eef
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,5323 @@
+# 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 <andika@gmail.com>, 2013-2015, 2017, 2018, 2021, 2022.
+# Dirgita <dirgitadevina@gmail.com>, 2015.
+# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2022.
+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: 2022-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-08-31 16:01+0700\n"
+"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
+"Language-Team: Indonesian <gnome@i15n.org>\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.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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Proyek GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"Stempel waktu terakhir ketika sistem daring dan mendapat pemutakhiran apa pun"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Peladen yang dipakai untuk ulasan aplikasi"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Nilai karma minimum bagi ulasan"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Izinkan akses ke dialog Repositori Perangkat Lunak"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Tawarkan peningkatan bagi prarilis"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"Urutan prioritas format pemaketan untuk disukai, dengan format yang lebih "
+"penting tercantum terlebih dahulu. Array kosong berarti urutan default. "
+"Format yang dihilangkan diasumsikan terdaftar terakhir. Contoh format "
+"pemaketan adalah: deb, flatpak, rpm, snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Installer seluruh sistem GNOME Software AppStream"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Peringkat Umur"
+
+#: 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 "Cara menyumbangkan informasi yang hilang"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Paket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Tertunda"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Pemasangan tertunda"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Penghapusan tertunda"
+
+#: 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 "Terpasang"
+
+#. 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 "Memasang"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Menghapus"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "Hap_us pemasangan"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Jaringan"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Dapat berkomunikasi melalui jaringan"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Layanan Sistem"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Layanan Sesi"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Perangkat"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Dapat mengakses berkas perangkat sistem"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Folder rumah"
+
+#: 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 "Dapat melihat, menyunting, dan membuat berkas"
+
+#: 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 "Dapat melihat berkas"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Folder unduhan"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Pengaturan"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Dapat melihat dan mengubah pengaturan apa pun"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistem tampilan lama"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Menggunakan sistem tampilan yang lama dan tidak aman"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Sandbox escape"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Dapat menghindari sandbox dan menghindari pembatasan lainnya"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detail Pemutakhiran"
+
+#. 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 "Deskripsi pemutakhiran tak tersedia."
+
+#: 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 "Kembali"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Membutuhkan izin tambahan"
+
+#. 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 "Ulasan"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Tidak ada ulasan yang ditemukan untuk aplikasi ini."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Tidak Ada Ulasan"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Riwayat Versi"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Baru dalam Versi %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versi %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Tampilkan berkas metainfo atau appdata lokal"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Tampilkan informasi pengawakutuan cerewet"
+
+#: 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 update preferences"
+msgstr "Tampilkan preferensi pemutakhiran"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Hak Cipta © 2016–2022 Kontributor Perangkat Lunak GNOME"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Andika Triwidada <andika@gmail.com>, 2013-2015, 2017, 2018, 2021, 2022.\n"
+"Dirgita <dirgitadevina@gmail.com>, 2015.\n"
+"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-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:2147
+msgid "About Software"
+msgstr "Tentang Perangkat Lunak"
+
+#. 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 ""
+"Suatu cara yang manis untuk mengelola perangkat lunak pada sistem Anda."
+
+#. 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 "Maaf! Tidak ada detail untuk aplikasi itu."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Dapat mengakses perangkat keras"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Dapat mengakses berkas arbitrer"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Dapat memperoleh izin sewenang-wenang"
+
+#. 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 "Ditinjau oleh distribusi Anda"
+
+#. 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 "Disediakan oleh pihak ketiga"
+
+#. 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 "Kode proprietari"
+
+#. 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 "Kode yang dapat diaudit"
+
+#. 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 "Pengembang perangkat lunak terverifikasi"
+
+#. 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 "Perangkat lunak tidak lagi didukung"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Tidak Aman"
+
+#: 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 "Hanya Seluler"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Hanya berfungsi pada layar kecil"
+
+#: 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 "Hanya Destop"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Hanya berfungsi pada layar besar"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Ketidakcocokan Ukuran Layar"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Tidak mendukung ukuran layar Anda saat ini"
+
+#: 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 "Membutuhkan layar sentuh"
+
+#: 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 "Membutuhkan papan tik"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Membutuhkan tetikus"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Gamepad Dibutuhkan"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptif"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Bekerja pada ponsel, tablet, dan destop"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Mungkin membutuhkan papan tik atau tetikus"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Berisi konten yang tidak sesuai dengan usia"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Kunjungi Situs 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:159
+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:167 src/gs-updates-section.ui:62
+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:175 src/gs-common.c:286 src/gs-page.c:374
+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:183
+msgid "Update"
+msgstr "Mutakhiran"
+
+#. 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 "Hapus pemasangan"
+
+#. 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 "Menghapus pemasangan"
+
+#. 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 "Perangkat tidak dapat dipakai selama pemutakhiran."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Ganti nama dari %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Bantu Terjemahkan %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 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:5
+msgid "Translations"
+msgstr "Terjemahan"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Situs Web _Terjemahan"
+
+#. 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 "Diperlukan log masuk jarak jauh %s (bidang %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Log Masuk Diperlukan"
+
+#: 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 "_Batal"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Log Masuk"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Pengg_una"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Kata _Sandi"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Baru & Dimutakhirkan"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Perangkat Lunak Lain"
+
+#. 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 "Masukkan nomor dari 1 sampai %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Pilih aplikasi:"
+
+#: 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 "Buat"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:287
+msgid "Work"
+msgstr "Kerja"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:289
+msgid "Play"
+msgstr "Putar"
+
+#. 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 "Pelajari"
+
+#. 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 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 kini telah terpasang"
+
+#. 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 "Mulai ulang diperlukan agar perubahan diterapkan."
+
+#. 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 "Aplikasi siap untuk digunakan."
+
+#. 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 "Pemutakhiran sistem sekarang dipasang"
+
+#. 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 "Pemutakhiran yang baru dipasang tersedia untuk ditinjau"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Mulai Ulang"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Luncurkan"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Pasang Perangkat Lunak Pihak Ketiga?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Fungsikan Repositori Perangkat Lunak 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:240
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s bukanlah <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">perangkat lunak bebas dan terbuka</a>, 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:250
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s disediakan oleh “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Jangan Peringatkan Lagi"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+msgid "Enable and Install"
+msgstr "Aktifkan 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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Rincian galat dari manajer paket adalah:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Rincian"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "Terim_a"
+
+#. 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] "Pemutakhiran telah dipasang"
+
+#. 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] "Sebuah aplikasi telah dihapus"
+
+#. 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] "Mulai ulang diperlukan agar berdampak."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Jangan Sekarang"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Baru saja"
+
+#: src/gs-common.c:871
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] "%d menit yang lalu"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d jam yang lalu"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d hari yang lalu"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d minggu yang lalu"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d bulan yang lalu"
+
+#: src/gs-common.c:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d tahun 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Cari dalam Perangkat Lunak"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Tampilkan _Rinciannya"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Tampilkan Lebih Sedikit"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Menghapus…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Membutuhkan nyala ulang untuk menyelesaikan pemasangan"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Pemutakhiran tertunda…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Mempersiapkan…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Menghapus pemasangan…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Pasang"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "Mu_lai ulang"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Pasang…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Aplikasi Lain oleh %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Anda perlu akses internet untuk menulis ulasan"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Tak bisa temukan \"%s\""
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Halaman rincian"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Memuat detail aplikasi…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Perangkat lunak ini tidak tersedia dalam bahasa Anda dan akan muncul dalam "
+"bahasa Inggris AS."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Bantu Terjemahkan"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Buka"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "M_utakhirkan"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Mengunduh"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Tambahan"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Tambahan yang dipilih akan dipasang dengan aplikasi."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Repositori Perangkat Lunak Yang Disertakan"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Tak Ada Repositori Perangkat Lunak Yang Disertakan"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Repositori Perangkat Lunak Teridentifikasi"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Hanya pakai repositori perangkat lunak yang Anda percayai."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Tidak Ada Metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Situs _Web Proyek"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donasi"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Kontribusi _Terjemahan"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "Lapo_rkan Masalah"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Bantuan"
+
+#. 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 "_Tulis Ulasan"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Semua Ulasan"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Fonta yang 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: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:242
+msgid "Requested software not found"
+msgstr "Perangkat lunak yang diminta tak ditemukan"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s tak ditemukan"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "pada laman situs"
+
+#. 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 "Tak satupun 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: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 ""
+"Informasi tentang %s, maupun opsi tentang bagaimana mendapatkan aplikasi "
+"yang kurang mungkin dapat ditemukan %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 "Tak satupun aplikasi yang ada untuk dukungan %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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"Tak 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: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] ""
+"Tak bisa menemukan %s yang Anda cari. Silakan lihat %s informasi lebih "
+"lanjut."
+
+#: 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 "Gagal menemukan hasil pencarian: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Format berkas %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Tak Menemukan Perangkat Lunak yang Dicari"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Halaman kodek"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Dukungan Destop"
+
+#: 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 "Mendukung digunakan pada layar besar"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Dukungan Destop Tidak Diketahui"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Membutuhkan layar besar"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Destop Tidak Didukung"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Tidak dapat digunakan pada layar besar"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Dukungan Seluler"
+
+#: 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 "Mendukung digunakan pada layar kecil"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Dukungan Seluler Tidak Diketahui"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Membutuhkan layar kecil"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Seluler Tidak Didukung"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Tidak dapat digunakan pada layar kecil"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Dukungan Papan Tik"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Dukungan Papan Tik Tidak Diketahui"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Papan Tik Diperlukan"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Mendukung papan tik"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Papan Tik Tidak Didukung"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Tidak dapat digunakan dengan papan tik"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Dukungan Tetikus"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Membutuhkan tetikus atau perangkat penunjuk"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Dukungan Tetikus Tidak Diketahui"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Tetikus Diperlukan"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Mendukung tetikus dan perangkat penunjuk"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Tetikus Tidak Didukung"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Dukungan Layar Sentuh"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Dukungan Layar Sentuh Tidak Diketahui"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Layar Sentuh Diperlukan"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Mendukung layar sentuh"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Layar Sentuh Tidak Didukung"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Tidak dapat digunakan dengan layar sentuh"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad Diperlukan"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Membutuhkan gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Dukungan Gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Dukungan Perangkat Keras"
+
+#. 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 "Terpasang"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Halaman terpasang"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplikasi"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplikasi Web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplikasi Sistem"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Komunitas Dibangun"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Perangkat lunak ini dikembangkan secara terbuka oleh komunitas sukarelawan, "
+"dan dirilis di bawah the <a href=\"%s\">lisensi %s</a>.\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: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 ""
+"Perangkat lunak ini dikembangkan secara terbuka oleh komunitas sukarelawan, "
+"dan dirilis di bawah lisensi %s.\n"
+"\n"
+"Anda dapat berkontribusi dan membantu membuatnya lebih baik."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietari"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "Pelajari _Lebih Jauh"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Mengunduh katalog perangkat lunak"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Memuat halaman"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Memulai…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Pemutakhiran Otomatis Ditunda"
+
+#: 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 ""
+"Jaringan saat ini menggunakan kuota. Koneksi menggunakan kuota memiliki "
+"batas data atau biaya yang terkait dengannya. Untuk menyimpan data, "
+"pemutakhiran otomatis telah dijeda.\n"
+"\n"
+"Pemutakhiran otomatis akan dilanjutkan ketika jaringan yang tidak "
+"menggunakan kuota tersedia. Sampai saat itu, masih dimungkinkan untuk "
+"memasang pemutakhiran secara manual.\n"
+"\n"
+"Atau, jika jaringan saat ini telah diidentifikasi secara tidak benar "
+"menggunakan kuota, pengaturan ini dapat diubah."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Buka Pengaturan _Jaringan"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Halaman moderasi"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Tidak ada ulasan yang akan dimoderasi"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Pengguna"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Penambahan"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Penghapusan"
+
+#. 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 "Pemutakhiran"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Penurunan"
+
+#. 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 "sumber eksternal yang dipilih"
+
+#. 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 ""
+"Menyediakan akses ke perangkat lunak tambahan dari %s. Beberapa perangkat "
+"lunak proprietari disertakan."
+
+#. 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 "Fungsikan"
+
+#. 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 "Jelajahi"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Halaman ringkasan"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Fungsikan Repositori Perangkat Lunak Pihak Ketiga?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Kategori Lain"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Tak Ada Data Aplikasi Yang Ditemukan"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Tak diketahui"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Pengguna menolak pemasangan"
+
+#. 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 "Persiapkan %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 "Anda yakin ingin menghapus repositori %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Apakah Anda yakin ingin menghapus pemasangan %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 akan dihapus pemasangannya, dan Anda perlu memasangnya untuk memakainya "
+"lagi."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferensi Pemutakhiran"
+
+#: 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 ""
+"Untuk menghindari biaya dan batasan jaringan, pemutakhiran perangkat lunak "
+"tidak secara otomatis diunduh pada koneksi seluler atau kuota."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Pemutakhiran Otomatis"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Unduh dan pasang pemutakhiran perangkat lunak di latar belakang, jika "
+"memungkinkan."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Pemberitahuan Pemutakhiran Otomatis"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Tampilkan pemberitahuan ketika pemutakhiran telah dipasang secara otomatis."
+
+#. 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 ""
+"Beberapa perangkat lunak yang kini terpasang tidak kompatibel dengan %s. "
+"Bila Anda melanjutkan, yang berikut akan secara otomatis dihapus saat "
+"peningkatan:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Perangkat Lunak Tak Kompatibel"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Lanjut"
+
+#. 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 ""
+"Perangkat lunak yang telah dipasang dari “%s” akan berhenti menerima "
+"pembaruan."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Nonaktifkan Repositori?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Hapus"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Aktifkan Repositori Baru"
+
+#: src/gs-repos-dialog.c:509
+msgid "Turn on new repositories when they are added."
+msgstr "Aktifkan repositori baru saat ditambahkan."
+
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-repos-dialog.c:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Repositori tambahan dari pihak ketiga yang dipilih — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Repositori-repositori ini melengkapi perangkat lunak baku yang disediakan "
+"oleh %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repositori Perangkat Lunak"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Tidak Ada Repositori"
+
+#. 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 aplikasi terpasang"
+
+#. 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 tambahan terpasang"
+
+#. 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 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-repo-row.c:181
+#, c-format
+msgid "%u add-on"
+msgid_plural "%u add-ons"
+msgstr[0] "%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-repo-row.c:188
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "%s dan %s terpasang"
+
+#. 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 "Benci"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Tidak suka"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Suka"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Cinta"
+
+#. 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 "Harap sisihkan lebih banyak waktu saat menulis ulasan"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Harap pilih nilai bintang"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Ringkasan terlalu pendek"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Ringkasan terlalu panjang"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Keterangan terlalu pendek"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Kirim Ulasan"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Kirim"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Peringkat"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Ringkasan"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Berikan ringkasan ulasan Anda, sebagai contoh: \"App bagus, akan menyarankan"
+"\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Ulasan"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+"Apa pendapat Anda tentang app? Cobalah memberi alasan tentang pandangan Anda."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Temukan data apa yang dikirim di <a href=\"https://odrs.gnome.org/privacy"
+"\">kebijakan privasi</a> 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Laporkan Ulasan?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Lapor"
+
+#. 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 "Apakah ulasan ini berguna bagi Anda?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ya"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Tidak"
+
+#. 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 "Laporan…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Hapus…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Periksa apakah Anda memercayai vendornya, karena aplikasinya tidak di-sandbox"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Tidak Ada Izin"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Akses Jaringan"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Tidak Ada Akses Jaringan"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Gunakan Layanan Sistem"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Gunakan Layanan Sesi"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Akses Perangkat"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Tidak Ada Akses Perangkat"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Akses Baca/Tulis Sistem Berkas Lengkap"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Akses Baca/Tulis Folder Rumah"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Akses Baca Sistem Berkas Lengkap"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Akses Baca Folder Rumah"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Unduh Akses Baca/Tulis Folder"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Unduh Akses Baca Folder"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Dapat membaca semua data di direktori unduhan Anda"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Tidak Ada Akses Sistem Berkas"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Tidak dapat mengakses sistem berkas sama sekali"
+
+#. 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 "Kode Proprietari"
+
+#: 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 ""
+"Kode sumber tidak bersifat publik, sehingga tidak dapat diaudit secara "
+"independen dan mungkin tidak aman"
+
+#. 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 "Kode yang Dapat Diaudit"
+
+#: 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 ""
+"Kode sumber bersifat publik dan dapat diaudit secara independen, yang "
+"membuat aplikasi lebih mungkin aman"
+
+#. 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 "Pengembang aplikasi diverifikasi"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependensi yang Tidak Aman"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 aman"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s tidak aman"
+
+#. 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 "Keamanan"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Sumber"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versi SDK usang"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Tidak disediakan cuplikan layar"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Cuplikan layar tak ditemukan"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+msgid "Could not create cache"
+msgstr "Tak bisa membuat singgahan"
+
+#. TRANSLATORS: this is when we try to download a screenshot
+#. * that was not a valid URL
+#: src/gs-screenshot-image.c:746
+msgid "Screenshot not valid"
+msgstr "Cuplikan layar tak valid"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "%u lagi yang cocok"
+
+#: src/gs-search-page.ui:6
+msgid "Search page"
+msgstr "Halaman pencarian"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Mencari Aplikasi"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Tidak bisa mengunduh pemutakhiran perangkat tegar 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Tidak bisa mengunduh pemutakhiran"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Tidak bisa mengunduh pemutakhiran: akses internet diperlukan tapi tak "
+"tersedia"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Tidak bisa mengunduh pemutakhiran: ruang disk tidak cukup"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Tidak bisa mengunduh pemutakhiran: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Tidak bisa mengunduh pemutakhiran: autentikasi tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Tidak bisa mendapat daftar pemutakhiran"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Tidak bisa memasang %s karena pengunduhan gagal dari %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Tidak bisa memasang %s karena pengunduhan 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Tidak bisa memasang %s karena runtime %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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Tidak bisa memasang %s karena tidak didukung"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr "Tidak bisa memasang: akses internet diperlukan tapi tidak tersedia"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Tidak bisa memasang: aplikasi memiliki format yang tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Tidak bisa memasang %s: ruang disk tidak cukup"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Tidak bisa memasang %s: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Tidak bisa memasang %s: autentikasi tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install software"
+msgstr ""
+"Tidak bisa memasang %s: Anda tidak punya hak untuk memasang perangkat lunak"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Tidak bisa memasang %s: perlu daya AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Tidak bisa memasang %s: Level baterai terlalu rendah"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Tidak bisa 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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Tidak bisa memutakhirkan %s dari %s karena pengunduhan gagal"
+
+#. 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 update %s as download failed"
+msgstr "Tidak bisa memutakhirkan %s karena 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Tidak bisa memasang pemutakhiran dari %s karena pengunduhan gagal"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Tidak bisa memasang pemutakhiran karena pengunduhan gagal"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr "Tidak bisa mutakhirkan: akses internet diperlukan tapi tidak tersedia"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Tidak bisa memasang pemutakhiran: ruang diska tidak cukup"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Tidak bisa memutakhirkan %s: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Tidak bisa memasang pemutakhiran: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Tidak bisa memutakhirkan %s: autentikasi tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Tidak bisa memasang pemutakhiran: autentikasi tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr ""
+"Tidak bisa memutakhirkan %s: Anda tidak punya hak untuk memutakhirkan "
+"perangkat lunak"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, c-format
+msgid ""
+"Unable to install updates: you do not have permission to update software"
+msgstr ""
+"Tidak bisa memasang pemutakhiran: Anda tidak punya hak untuk memutakhirkan "
+"perangkat lunak"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Tidak bisa memutakhirkan %s: perlu daya AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Tidak bisa memasang pemutakhiran: perlu daya AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Tidak bisa memutakhirkan %s: Level baterai 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:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Tidak bisa memasang pemutakhiran: Level baterai terlalu rendah"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Tidak bisa memutakhirkan %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Tidak bisa memasang pemutakhiran"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Tidak bisa meningkatkan ke %s karena pengunduhan gagal"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+msgstr ""
+"Tidak bisa meningkatkan ke %s: akses internet diperlukan tapi tidak tersedia"
+
+#. 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: not enough disk space"
+msgstr "Tidak bisa meningkatkan ke %s: ruang disk 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Tidak bisa meningkatkan ke %s: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Tidak bisa meningkatkan ke %s: 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:1698
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr "Tidak bisa meningkatkan ke %s: Anda tidak punya hak untuk meningkatkan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Tidak bisa meningkatkan ke %s: perlu daya AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Tidak bisa meningkatkan ke %s: Level baterai 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:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Tidak bisa meningkatkan ke %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Tidak bisa menghapus %s: perlu autentikasi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Tidak bisa menghapus %s: autentikasi tidak valid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, c-format
+msgid "Unable to remove %s: you do not have permission to remove software"
+msgstr ""
+"Tidak bisa menghapus %s: Anda tidak punya hak untuk menghapus perangkat lunak"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Tidak bisa menghapus %s: perlu daya AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Tidak bisa menghapus %s: Level baterai terlalu rendah"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Tidak bisa menghapus %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Ruang disk tidak cukup — kosongkan sebagian dan coba lagi"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Maaf, ada yang tidak beres"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Gagal memasang berkas: tidak didukung"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Gagal memasang berkas: autentikasi gagal"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Gagal memasang: tidak didukung"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Gagal memasang: autentikasi gagal"
+
+#. 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 "Tidak bisa mengontak %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Perangkat lunak perlu dimulai ulang untuk menggunakan pengaya baru."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Daya AC diperlukan"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Level baterai terlalu rendah"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Repo_sitori Perangkat Lunak"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferensi Pem_utakhiran"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Periksa 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 "Pengaturan Jaringan"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Mulai Ulang Sekarang"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Informasi lebih lanjut"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Pencarian"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu Utama"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Te_mukan Lebih Jauh"
+
+#. 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 "Pemutakhiran"
+
+#. 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 "Application Data"
+msgstr "Data Aplikasi"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Penyimpanan"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Data yang disinggahkan dapat dibersihkan dari <a href=\"dummy\">pengaturan "
+"_aplikasi</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Terpasang)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Memasang)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s( Menghapus)"
+
+#. 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 "Pemutakhiran Terpasang"
+
+#. 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 "Dipasang pada %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Tidak Ada Pemutakhiran yang Dipasang"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Pemutakhiran Perangkat Lunak Sudah Kedaluwarsa"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Silakan periksa pemutakhiran perangkat lunak."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Pemutakhiran Perangkat Lunak Penting Siap Dipasang"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Pemutakhiran perangkat lunak penting siap dipasang."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Pemutakhiran Perangkat Lunak Penting Tersedia untuk Diunduh"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Penting: pemutakhiran perangkat lunak penting sedang menunggu."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Pemutakhiran Perangkat Lunak Siap Dipasang"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Pemutakhiran perangkat lunak sedang menunggu dan siap dipasang."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Pemutakhiran Perangkat Lunak Tersedia untuk Diunduh"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Silakan unduh pemutakhiran perangkat lunak yang menunggu."
+
+#. 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 Aplikasi Dimutakhirkan — Mulai Ulang Diperlukan"
+
+#. 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 Aplikasi Dimutakhirkan"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s telah dimutakhirkan."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Mohon memulai ulang aplikasi."
+
+#. 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 dan %s telah dimutakhirkan."
+
+#. 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 aplikasi memerlukan mulai ulang."
+
+#. 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 "Termasuk %s, %s dan %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 "Pemutakhiran Sistem Operasi Tidak Tersedia"
+
+#. 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 "Tingkatkan versi untuk terus menerima pemutakhiran keamanan."
+
+#. 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 "Sebuah versi baru %s telah tersedia untuk dipasang"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Pemutakhiran Perangkat Lunak Tersedia"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Pemutakhiran Perangkat Lunak Gagal"
+
+#. 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 "Pemutakhiran sistem operasi penting gagal dipasang."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Tampilkan Rincian"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Ulasan"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Gagal Memutakhirkan"
+
+#. 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 "Sistem sudah pada kondisi terbaru."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, 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:559
+#, c-format
+msgid "%s %s is no longer supported."
+msgstr "%s %s tidak lagi didukung."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Sistem operasi Anda tidak lagi didukung."
+
+#. 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 "Ini berarti tidak menerima pemutakhiran keamanan."
+
+#. 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 "Anda sangat disarankan untuk meningkatkan ke versi yang lebih baru."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Mungkin Ada Biaya"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Periksa S_aja"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Tak Ada Jaringan"
+
+#. 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 "Akses internet diperlukan untuk memeriksa pemutakhiran."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Periksa pemutakhiran"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Pemutakhiran"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Halaman pemutakhiran"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Memuat Pemutakhiran…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Mutakhir"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Gunakan Data Seluler?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Periksa Saja"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Tidak Ada Koneksi"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Pergi daring untuk memeriksa pemutakhiran."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Pe_ngaturan Jaringan"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Kesalahan"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Pemutakhiran dikelola secara otomatis."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Mulai Ulang & Mutakhirkan"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Mutakhirkan Semua"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Pemutakhiran Aplikasi"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Perangkat Tegar"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s Tersedia"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Pelajari tentang versi baru"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Mengunduh…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% terunduh"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Mulai Ulang & Mutakhi_rkan"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Ingatlah untuk mencadangkan data dan berkas sebelum memutakhirkan."
+
+#: 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 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 ""
+"Pemutakhiran;Peningkatan;Sumber;Repositori;Preferensi;Pasang;Copot;Program;"
+"Perangkat Lunak;App;Toko;"
+
+#. 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 "Pemutakhiran Sistem"
+
+#. 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 ""
+"Pemutakhiran sistem umum, seperti keamanan atau perbaikan kutu, dan "
+"peningkatan kinerja."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Mengunduh gambar pilihan…"
+
+#. 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 memutakhirkan dengan fitur dan perbaikan baru."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Mengunduh informasi peningkatan…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications on Linux"
+msgstr "Flatpak adalah kerangka kerja untuk aplikasi destop di Linux"
+
+#. 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 "Folder sistem %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subfolder rumah %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Folder sistem host"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Konfigurasi sistem host dari /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Folder destop"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subfolder destop %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Folder dokumen"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subfolder dokumen %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Folder Musik"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subfolder Musik %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Folder Gambar"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subfolder Gambar %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Folder Berbagi Publik"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subfolder Berbagi Publik %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Folder Video"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subfolder Video %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Folder Templat"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Subfolder Templat %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Folder singgahan pengguna"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subfolder singgahan pengguna %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Folder konfigurasi pengguna"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subfolder konfigurasi pengguna %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Folder data pengguna"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subfolder data pengguna %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Folder runtime pengguna"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subfolder runtime pengguna %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Mendapatkan metadata flatpak untuk %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Remote \"%s\" tidak mengizinkan pemasangan \"%s\", mungkin karena filternya. "
+"Lepaskan filter dan ulangi pemasangan. Detail galat: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Pemutakhiran Konfigurasi %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Pemutakhiran Kamera %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Pemutakhiran TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Pemutakhiran Touchpad %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Pemutakhiran Penerima USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Perangkat Tegar (Firmware)"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Pasang Perangkat Lunak yang Tidak Ditandatangani?"
+
+#: 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 ""
+"Perangkat lunak yang akan dipasang tidak ditandatangani. Tidak mungkin "
+"memverifikasi asal pembaruan perangkat lunak ini, atau apakah pemutakhiran "
+"telah diubah."
+
+#: plugins/packagekit/gs-packagekit-task.c:153
+msgid "Download Unsigned Software?"
+msgstr "Unduh Perangkat Lunak yang Tidak Ditandatangani?"
+
+#: 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 ""
+"Pemutakhiran yang tidak ditandatangani tersedia. Tanpa tanda tangan, tidak "
+"mungkin untuk memverifikasi asal pembaruan, atau apakah itu telah diubah."
+
+#: plugins/packagekit/gs-packagekit-task.c:158
+msgid "Update Unsigned Software?"
+msgstr "Mutakhirkan Perangkat Lunak yang Tidak Ditandatangani?"
+
+#: 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 ""
+"Pemutakhiran yang tidak ditandatangani tersedia. Tanpa tanda tangan, tidak "
+"mungkin untuk memverifikasi asal pembaruan, atau apakah itu telah diubah. "
+"Pemutakhiran perangkat lunak akan dinonaktifkan hingga pemutakhiran yang "
+"tidak ditandatangani dihapus atau diperbarui."
+
+#: plugins/packagekit/gs-plugin-packagekit.c:367
+msgid "Packages"
+msgstr "Paket"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ msgid "No updates have been installed on this system."
+#~ msgstr "Tak ada pemutakhiran yang telah dipasang pada sistem ini."
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Manajer aplikasi bagi GNOME"
+
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Name"
+#~ msgstr "Nama"
+
+#~ msgid "system"
+#~ msgstr "sistem"
+
+#~ msgid "user"
+#~ msgstr "pengguna"
+
+#~ msgid "Channel"
+#~ msgstr "Kanal"
+
+#~ msgid "Branch"
+#~ msgstr "Cabang"
+
+#~ msgid "URL"
+#~ msgstr "URL"
+
+#~ msgid "Installation"
+#~ msgstr "Pemasangan"
+
+#~ msgid "Version"
+#~ msgstr "Versi"
+
+#~ msgid "Software catalog is being downloaded"
+#~ msgstr "Katalog perangkat lunak sedang diunduh"
+
+#~ msgid "A list of popular applications"
+#~ msgstr "Daftar aplikasi populer"
+
+#~ msgid "A list of applications to use, overriding the system defined ones."
+#~ msgstr ""
+#~ "Suatu daftar aplikasi yang akan dipakai, menimpa yang didefinisikan oleh "
+#~ "sistem."
+
+#~ msgid "Checking…"
+#~ msgstr "Memeriksa…"
+
+#~ msgid "Endless OS"
+#~ msgstr "Endless OS"
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 <EMAIL@ADDRESS>, 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 <mistresssilvara@hotmail.com>\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 <mistresssilvara@hotmail.com>, 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <sv1@fellsnet.is>, 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 <sv1@fellsnet.is>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <a href=\"%s\">%s license</a>.\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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. 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 <a href=\"dummy\">_application settings</"
+"a>."
+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..ee5591e
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,5436 @@
+# 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 <milo@milo.name>, 2020.
+# Gianvito Cavasoli <gianvito@gmx.it>, 2013-2022.
+#
+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: 2022-10-10 16:35+0000\n"
+"PO-Revision-Date: 2022-10-17 11:24+0200\n"
+"Last-Translator: Gianvito Cavasoli <gianvito@gmx.it>\n"
+"Language-Team: Italian <gnome-it-list@gnome.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 40.0\n"
+"X-Poedit-SourceCharset: UTF-8\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 "Software"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+#| msgid "Installed Updates"
+msgid "Install and update apps"
+msgstr "Installa e aggiorna le applicazione"
+
+#: 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 ""
+"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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2043
+#: src/gs-application.c:256
+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 last timestamp when the system was online and got any updates"
+msgstr ""
+"La data dell'ultima volta che il sistema è stato in rete e ha ricevuto degli "
+"aggiornamenti"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Il server da usare per le recensioni delle applicazioni"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Il punteggio minimo di karma per le recensioni"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Consente l'accesso alla finestra di dialogo Repository software"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Propone gli avanzamenti di pre-rilascio"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://it.wikipedia.org/wiki/Software_proprietario'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"Ordine di priorità dei formati di pacchetti preferiti, 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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Installatore globale di sistema GNOME Software AppStream"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 è 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:1027
+#, 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:1031
+#, c-format
+msgid "%s is suitable for young 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:1039
+#, 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:1043
+#, 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:1048
+#, 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:211
+msgid "Age Rating"
+msgstr "Fasce di età"
+
+#: 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 "Come contribuire con le informazioni mancanti"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Pacchetto"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "In attesa"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Installazione in attesa"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Rimozione in attesa"
+
+#: 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 "Installata"
+
+#. 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 "Installazione"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Rimozione"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Disinstalla"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Rete"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Può comunicare attraverso la rete"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Servizi di sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Servizi di sessione"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositivi"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Può accedere ai file di sistema del dispositivo"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Cartella home"
+
+#: 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 "Può visualizzare, modificare e creare file"
+
+#: 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 "Può visualizzare file"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Cartella degli scaricamenti"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Può visualizzare e modificare qualsiasi impostazione"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema di visualizzazione obsoleto"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa un vecchio sistema di visualizzazione non sicuro"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Evita ambiente di prova"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Può evitare l'ambiente di prova ed aggirare ogni altra restrizione"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+#| msgid "The update details"
+msgid "Update Details"
+msgstr "Dettagli aggiornamento"
+
+#. 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 "Nessuna descrizione dell'aggiornamento disponibile."
+
+#: 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 "Vai indietro"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+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:6 src/gs-details-page.ui:855
+msgid "Reviews"
+msgstr "Recensioni"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Non è stata trovata nessuna recensione per questa applicazione."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Nessuna recensione"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Cronologia versioni"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novità della versione %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versione %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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 "Install the application (using application ID)"
+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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Mostra un file locale di metainfo o appdata"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Mostra informazioni dettagliate di debug"
+
+#: 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 update preferences"
+msgstr "Mostra le preferenze di aggiornamento"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 contributori di GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Gianvito Cavasoli <gianvito@gmx.it>\n"
+"\n"
+"...e un ringraziamento ai revisori del Translation Project."
+
+#. 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 "Informazioni su Software"
+
+#. 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 "Un piacevole modo per gestire il software sul sistema."
+
+#. 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 "Non ci sono dettagli per questa applicazione."
+
+#. 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 "Dimensione installata"
+
+#: src/gs-app-context-bar.c:165
+#, c-format
+msgid "Includes %s of data and %s of cache"
+msgstr "Include %s di dati e %s di cache"
+
+#: src/gs-app-context-bar.c:168
+#, c-format
+msgid "Includes %s of data"
+msgstr "Include %s di dati"
+
+#: src/gs-app-context-bar.c:171
+#, c-format
+msgid "Includes %s of cache"
+msgstr "Include %s di cache"
+
+#: src/gs-app-context-bar.c:174
+msgid "Cache and data usage unknown"
+msgstr "Uso di cache e dati sconosciuto"
+
+#. 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 "Dimensione scaricamento"
+
+#: src/gs-app-context-bar.c:191
+msgid "Needs no additional system downloads"
+msgstr "Non richiede ulteriori scaricamenti di sistema"
+
+#: src/gs-app-context-bar.c:193
+msgid "Needs an unknown size of additional system downloads"
+msgstr "Richiede ulteriori scaricamenti di sistema di dimensioni sconosciute"
+
+#. 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 "Richiede ulteriori %s di scaricamenti di 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 "Dimensione sconosciuta"
+
+#. 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 "Nessun permesso"
+
+#. 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 "Ha accesso alla rete"
+
+#. 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 "Usa servizi di 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:307
+msgid "Uses session services"
+msgstr "Usa servizi di sessione"
+
+#. 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 "Può accedere ai dispositivi hardware"
+
+#. 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 "Può leggere/scrivere tutti i vostri dati"
+
+#. 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 "Può leggere tutti i vostri dati"
+
+#. 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 "Può leggere/scrivere i vostri scaricamenti"
+
+#. 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 "Può leggere i vostri scaricamenti"
+
+#. 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 "Può accedere ai file arbitrari"
+
+#. 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 "Può accedere e modificare le impostazioni utente"
+
+#. 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 "Usa un sistema di gestione delle finestre obsoleto"
+
+#. 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 "Può acquisire permessi arbitrari"
+
+#. 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 "Revisionata dalla distribuzione in uso"
+
+#. 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 "Fornita da terze parti"
+
+#. 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 "Codice proprietario"
+
+#. 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 "Codice ispezionabile"
+
+#. 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 sviluppatore del software è verificato"
+
+#. 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 "Il software non è più supportato"
+
+#. 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 "Sicura"
+
+#. 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 "Potenzialmente non sicura"
+
+#. 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 "Non sicura"
+
+#: 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 "Solo mobile"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Funziona solo su schermi piccoli"
+
+#: 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 "Solo desktop"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Funziona solo su schermi grandi"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Dimensione dello schermo non corrispondente"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Non supporta la dimensione attuale del vostro schermo"
+
+#: 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 "Richiede uno schermo a tocco"
+
+#: 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 "Richiede una tastiera"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Richiede un mouse"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Necessita una pulsantiera"
+
+#: src/gs-app-context-bar.c:619
+msgid "Requires a gamepad to play"
+msgstr "Richiede una pulsantiera da gioco per giocarci"
+
+#. 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 "Adattiva"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funziona su telefoni, tablet e desktop"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probabilmente richiede una tastiera o un mouse"
+
+#: src/gs-app-context-bar.c:662
+msgid "Works on desktops and laptops"
+msgstr "Funziona su desktop e portatili"
+
+#. 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 "Non ha contenuti non appropriati per l'età"
+
+#: src/gs-app-context-bar.c:753
+msgid "No age rating information available"
+msgstr "Nessuna informazione disponibile sulla valutazione in base all'età"
+
+#. 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 "Visita sito 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:159
+msgid "Install…"
+msgstr "Installa…"
+
+#. 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 "Annulla"
+
+#. 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 "Installa"
+
+#. 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 "Aggiorna"
+
+#. 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 "Disinstalla"
+
+#. 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 "Disinstallazione"
+
+#. 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 "Il dispositivo non può essere usato durante l'aggiornamento."
+
+#. 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 "Sorgente: %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 "Rinominata da %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Aiuta a tradurre %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 è progettata, sviluppata e tradotta da una comunità internazionale di "
+"volontari.\n"
+"\n"
+"Questo significa che anche se non è ancora disponibile nella vostra lingua, "
+"si può essere coinvolti e aiutare a tradurla."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "Traduzioni"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Sito web _traduzione"
+
+#. 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 "L'accesso richiede %s remoto (%s realm)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Accesso richiesto"
+
+#: 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 "_Annulla"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "A_ccedi"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Utente"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Pass_word"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:209
+msgid "Other"
+msgstr "Altro"
+
+#. 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 "Tutte"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: lib/gs-category.c:218
+msgid "Featured"
+msgstr "In evidenza"
+
+#. 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 "Scelte dalla distribuzione"
+
+#. 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 "Nuove e aggiornate"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+msgid "Picks from the Web"
+msgstr "Prese dal web"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:125
+msgid "Other Software"
+msgstr "Altro software"
+
+#. 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 "Immettere un numero da 1 a %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Scegli un'applicazione:"
+
+#: lib/gs-desktop-data.c:16
+msgctxt "Menu of Graphics & Photography"
+msgid "All"
+msgstr "Tutte"
+
+#: lib/gs-desktop-data.c:20
+msgctxt "Menu of Graphics & Photography"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: lib/gs-desktop-data.c:24
+msgctxt "Menu of Graphics & Photography"
+msgid "3D Graphics"
+msgstr "Grafica 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 "Acquisizione"
+
+#: lib/gs-desktop-data.c:33
+msgctxt "Menu of Graphics & Photography"
+msgid "Vector Graphics"
+msgstr "Grafica vettoriale"
+
+#: lib/gs-desktop-data.c:36
+msgctxt "Menu of Graphics & Photography"
+msgid "Viewers"
+msgstr "Visualizzatori"
+
+#: lib/gs-desktop-data.c:39
+msgctxt "Menu of Audio & Video"
+msgid "Audio Creation & Editing"
+msgstr "Creazione e modifica audio"
+
+#: lib/gs-desktop-data.c:45
+msgctxt "Menu of Audio & Video"
+msgid "Music Players"
+msgstr "Riproduttori musicali"
+
+#: lib/gs-desktop-data.c:53
+msgctxt "Menu of Productivity"
+msgid "All"
+msgstr "Tutte"
+
+#: lib/gs-desktop-data.c:58
+msgctxt "Menu of Productivity"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: 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 "Database"
+
+#: lib/gs-desktop-data.c:69
+msgctxt "Menu of Productivity"
+msgid "Finance"
+msgstr "Finanza"
+
+#: lib/gs-desktop-data.c:73
+msgctxt "Menu of Productivity"
+msgid "Word Processor"
+msgstr "Elaboratore di testo"
+
+#: lib/gs-desktop-data.c:77
+msgctxt "Menu of Utilities"
+msgid "Text Editors"
+msgstr "Editor di testo"
+
+#: lib/gs-desktop-data.c:80
+msgctxt "Menu of Communication & News"
+msgid "Web Browsers"
+msgstr "Browser web"
+
+#: lib/gs-desktop-data.c:87
+msgctxt "Menu of Audio & Video"
+msgid "All"
+msgstr "Tutte"
+
+#: lib/gs-desktop-data.c:90
+msgctxt "Menu of Audio & Video"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: lib/gs-desktop-data.c:93
+msgctxt "Menu of Games"
+msgid "Action"
+msgstr "Azione"
+
+#: lib/gs-desktop-data.c:96
+msgctxt "Menu of Games"
+msgid "Adventure"
+msgstr "Avventura"
+
+#: 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 "Blocchi"
+
+#: lib/gs-desktop-data.c:105
+msgctxt "Menu of Games"
+msgid "Board"
+msgstr "Tavolo"
+
+#: lib/gs-desktop-data.c:108
+msgctxt "Menu of Games"
+msgid "Card"
+msgstr "Carte"
+
+#: 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 "Bambini"
+
+#: 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 "Gioco di ruolo"
+
+#: 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 "Strategia"
+
+#: lib/gs-desktop-data.c:134
+msgctxt "Menu of Communication & News"
+msgid "All"
+msgstr "Tutte"
+
+#: lib/gs-desktop-data.c:137
+msgctxt "Menu of Communication & News"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: 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 "Tutte"
+
+#: lib/gs-desktop-data.c:158
+msgctxt "Menu of Education & Science"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: lib/gs-desktop-data.c:163
+msgctxt "Menu of Education & Science"
+msgid "Artificial Intelligence"
+msgstr "Intelligenza artificiale"
+
+#: 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 "Chimica"
+
+#: lib/gs-desktop-data.c:174
+msgctxt "Menu of Education & Science"
+msgid "Languages"
+msgstr "Lingue"
+
+#: lib/gs-desktop-data.c:178
+msgctxt "Menu of Education & Science"
+msgid "Math"
+msgstr "Matematica"
+
+#: lib/gs-desktop-data.c:185
+msgctxt "Menu of Communication & News"
+msgid "News"
+msgstr "Notizie"
+
+#: 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 "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 "Fumetti"
+
+#: lib/gs-desktop-data.c:201
+msgctxt "Menu of Reference"
+msgid "Fiction"
+msgstr "Finzione"
+
+#: lib/gs-desktop-data.c:204
+msgctxt "Menu of Reference"
+msgid "Health"
+msgstr "Salute"
+
+#: lib/gs-desktop-data.c:207
+msgctxt "Menu of Reference"
+msgid "History"
+msgstr "Storia"
+
+#: lib/gs-desktop-data.c:210
+msgctxt "Menu of Reference"
+msgid "Lifestyle"
+msgstr "Stile di vita"
+
+#: 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 "Sport"
+
+#: lib/gs-desktop-data.c:223
+msgctxt "Menu of Developer Tools"
+msgid "All"
+msgstr "Tutte"
+
+#: lib/gs-desktop-data.c:226
+msgctxt "Menu of Developer Tools"
+msgid "Featured"
+msgstr "In evidenza"
+
+#: 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 "Caratteri"
+
+#: lib/gs-desktop-data.c:261
+msgctxt "Menu of Add-ons"
+msgid "Input Sources"
+msgstr "Sorgenti di input"
+
+#: lib/gs-desktop-data.c:268
+msgctxt "Menu of Add-ons"
+msgid "Language Packs"
+msgstr "Pacchetti delle lingue"
+
+#: lib/gs-desktop-data.c:275
+msgctxt "Menu of Add-ons"
+msgid "Localization"
+msgstr "Localizzazione"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:285
+msgid "Create"
+msgstr "Crea"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:287
+msgid "Work"
+msgstr "Lavora"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:289
+msgid "Play"
+msgstr "Gioca"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:291
+msgid "Socialize"
+msgstr "Socializza"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:293
+msgid "Learn"
+msgstr "Impara"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:295
+msgid "Develop"
+msgstr "Sviluppa"
+
+#. 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 hardware"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:302
+msgid "Fonts"
+msgstr "Tipi di caratteri"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:304
+msgid "Input Sources"
+msgstr "Sorgenti di input"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:306
+msgid "Language Packs"
+msgstr "Pacchetti delle lingue"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:308
+msgid "Localization"
+msgstr "Localizzazione"
+
+#. 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 è ora installato"
+
+#. 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 "È richiesto un riavvio per rendere effettive le modifiche."
+
+#. 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 "L'applicazione è pronta per essere usata."
+
+#. 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 "Gli aggiornamenti del sistema sono ora installati"
+
+#. 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 ""
+"Gli aggiornamenti recentemente installati sono disponibili per essere "
+"esaminati"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Riavvia"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Avvia"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Installare software di terze parti?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Abilitare repository software di terze parti?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s non è <a href=\"https://it.wikipedia.org/wiki/"
+"Free_and_Open_Source_Software\">software libero e open source</a>, ed è "
+"fornito da «%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 è fornito da «%s»."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Non avvisare più"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Seguono gli errori dettagliati del gestore dei pacchetti:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Dettagli"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Accetta"
+
+#. 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] "Un aggiornamento è stato installato"
+msgstr[1] "Degli aggiornamenti sono stati installati"
+
+#. 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] "L'applicazione è stata rimossa"
+msgstr[1] "Le applicazioni sono state rimosse"
+
+#. 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] "È richiesto un riavvio finché abbia effetto."
+msgstr[1] "È richiesto un riavvio finché abbiano effetto."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Non ora"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Proprio ora"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostra altro"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostra meno"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Rimozione…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Richiede il riavvio per terminare l'installazione"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Aggiornamento in attesa…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparazione…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Disinstallazione…"
+
+#. 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 "_Installa"
+
+#: src/gs-details-page.c:886
+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:910
+msgid "_Install…"
+msgstr "_Installa…"
+
+#. 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 "Altre applicazioni di %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+msgid "You need internet access to write a review"
+msgstr "È necessario un accesso Internet per scrivere una recensione"
+
+#: src/gs-details-page.c:1732 src/gs-details-page.c:1748
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Impossibile trovare «%s»"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Pagina dettagli"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Caricamento dettagli dell'applicazione…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Questo software non è disponibile nella vostra lingua e apparirà in inglese "
+"americano."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Aiuta a _tradurlo"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Apri"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Aggiorna"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Scaricamento"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Estensioni"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "L'estensione selezionata sarà installata con l'applicazione."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Repository software incluso"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Nessun repository software incluso"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Repository software identificato"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Usare solo repository software di cui si ha fiducia."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nessun metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Sito _web del progetto"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "Fai una _donazione"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribuisci alle _traduzioni"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Segnala un problema"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Documentazione"
+
+#. 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 "Scri_vi una recensione"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Tutte le recensioni"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:244
+msgid "Downloading extra metadata files…"
+msgstr "Scaricamento file metadati aggiuntivi…"
+
+#. 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: 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] "Tipi di carattere disponibili per la scrittura %s"
+msgstr[1] "Tipi di carattere disponibili per le scritture %s"
+
+#. 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] "Software disponibile per %s"
+msgstr[1] "Software disponibili per %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Software richiesto non trovato"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s non trovato"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "sul sito 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"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 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 "Non è disponibile alcuna applicazione per il supporto 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:376
+#, 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: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 ""
+"Le informazioni su %s, così come le opzioni su come ottenere l'applicazione "
+"mancante che può supportare questo formato potrebbero essere trovate su %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 ""
+"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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Impossibile trovare alcun risultato della ricerca: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Formato di file %s"
+
+#: src/gs-extras-page.c:1254
+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-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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Supporto desktop"
+
+#: 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 "Supporta l'uso su uno schermo grande"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Supporto desktop sconosciuto"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Richiede uno schermo grande"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Desktop non supportato"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Non è possibile usarla su uno schermo grande"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Supporto mobile"
+
+#: 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 "Supporta l'uso su uno schermo piccolo"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Supporto mobile sconosciuto"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Richiede uno schermo piccolo"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobile non supportato"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Non è possibile usarla su uno schermo piccolo"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Supporto tastiera"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Supporto tastiera sconosciuto"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Richiede tastiera"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Supporta le tastiere"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tastiera non supportata"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Non è possibile usarla con una tastiera"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Supporto mouse"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Richiede un mouse o un dispositivo di puntamento"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Supporto mouse sconosciuto"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Richiesto mouse"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Supporta i mouse e i dispositivi di puntamento"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mouse non supportato"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Supporto schermo a tocco"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Supporto schermo a tocco sconosciuto"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Richiesto schermo a tocco"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Supporta gli schermi a tocco"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Schermo a tocco non supportato"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Non è possibile usarla con uno schermo a tocco"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Richiesta pulsantiera da gioco"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Richiede una pulsantiera da gioco"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Supporto pulsantiera da gioco"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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"
+
+#. 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 "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 "Applications"
+msgstr "Applicazioni"
+
+#: src/gs-installed-page.ui:95
+#| msgid "Applications"
+msgid "Web Applications"
+msgstr "Applicazioni web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Applicazioni di sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Costruito dalla comunità"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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: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."
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Questo software è sviluppato liberamente da una comunità di volontari e "
+"rilasciato sotto la <a href=\"%s\">licenza %s</a>.\n"
+"\n"
+"Puoi contribuire e aiutare a renderlo ancora migliore."
+
+#. 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 ""
+"Questo software è sviluppato liberamente da una comunità di volontari e "
+"rilasciato sotto la licenza %s.\n"
+"\n"
+"Puoi contribuire e aiutare a renderlo ancora migliore."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietaria"
+
+#: src/gs-license-tile.c:133
+#| msgid "Learn"
+msgid "_Learn More"
+msgstr "Maggiori in_formazioni"
+
+#: src/gs-license-tile.c:135
+#| 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+#| msgid "Downloading featured images…"
+msgid "Downloading software catalog"
+msgstr "Scaricamento catalogo software"
+
+#: 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-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Aggiornamenti automatici in pausa"
+
+#: 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 ""
+"L'attuale rete è a consumo. Le connessioni a consumo hanno limiti di dati o "
+"addebiti associati. Di conseguenza, per risparmiare dati, gli aggiornamenti "
+"automatici sono stati messi in pausa.\n"
+"\n"
+"Gli aggiornamenti automatici saranno ripresi quando sarà disponibile di "
+"nuovo una rete non a consumo. Fino ad allora, è ancora possibile installare "
+"manualmente gli aggiornamenti.\n"
+"\n"
+"In alternativa, se l'attuale rete è stata erroneamente identificata come a "
+"consumo, questa impostazione può essere modificata."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Apri imposta_zioni di rete"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Pagina moderata"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Non ci sono recensioni da moderare"
+
+#: src/gs-origin-popover-row.c:105
+#| msgctxt "Distribution name"
+#| msgid "Unknown"
+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:108
+msgid "Beta"
+msgstr "Beta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+#| msgid "_User"
+msgid "User"
+msgstr "Utente"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Aggiuntivi"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Rimozioni"
+
+#. 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 "Aggiornamenti"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Retrocessioni"
+
+#. 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 "sorgenti esterne selezionate"
+
+#. 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 ""
+"Fornisce accesso a software aggiuntivo da %s. Sono inclusi alcuni software "
+"proprietari."
+
+#. 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 "Abilita"
+
+#. 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 "Esplora"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Pagina panoramica"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Abilitare repository software di terze parti?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Altre categorie"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Dati dell'applicazione non trovati"
+
+#: lib/gs-plugin-loader.c:2829
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Sconosciuta"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "L'utente ha rifiutato l'installazione"
+
+#. 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 "Preparazione %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 "Rimuovere il repository %s?"
+
+#. 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 ""
+"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
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Disinstallare %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 verrà disinstallata, dovrà essere installata di nuovo per poterla "
+"riutilizzare."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferenze di aggiornamento"
+
+#: 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 ""
+"Per evitare addebiti e limiti di rete gli aggiornamenti software non saranno "
+"scaricati automaticamente su connessioni mobili o a consumo."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Aggiornamenti automatici"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Quando possibile, scarica e installa gli aggiornamenti software in "
+"background."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notifiche aggiornamenti automatici"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostra le notifiche quando gli aggiornamenti sono stati installati "
+"automaticamente."
+
+#. 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 ""
+"Alcuni dei software attualmente installati non sono compatibili con %s. Se "
+"si continua, i seguenti software saranno rimossi automaticamente durante "
+"l'avanzamento:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software incompatibile"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continua"
+
+#. 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 ""
+"Il software che è stato installato da «%s» cesserà di ricevere aggiornamenti."
+
+#: 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:254
+msgid "_Disable"
+msgstr "_Disabilita"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Rimuovi"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Abilitare nuovi repository"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Questi repository integrano il software predefinito fornito da %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repository software"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nessun repository"
+
+#. 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 applicazione installata"
+msgstr[1] "%u applicazioni installate"
+
+#. 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 estensione installata"
+msgstr[1] "%u estensioni installate"
+
+#. 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 applicazione"
+msgstr[1] "%u applicazioni"
+
+#. 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 estensione"
+msgstr[1] "%u estensioni"
+
+#. 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 e %s installate"
+msgstr[1] "%s e %s installate"
+
+#. 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 "La detesto"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Non mi piace"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Va bene"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Mi piace"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "La adoro"
+
+#. 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 "Prenditi più tempo per scrivere la recensione"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Scegliere una stella come valutazione"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Il riassunto è troppo corto"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Il riassunto è troppo lungo"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La descrizione è troppo corta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Inserisci recensione"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Inserisci"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Valutazione"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Riassunto"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Dare un breve riassunto della recensione, per esempio: «Ottima applicazione, "
+"consigliata»."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Recensione"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+"Cosa si pensa dell'applicazione? Provare a dare delle motivazioni alle "
+"vostre opinioni."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Trova quali dati sono inviati nella <a href=\"https://odrs.gnome.org/"
+"privacy\">politica di riservatezza</a>. Il nome completo collegato al vostro "
+"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:93
+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:56
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#. 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 ""
+"È 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:225
+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:239
+msgid "Report Review?"
+msgstr "Segnala recensione?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+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"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Indifferente"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Segnala…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Rimuovi…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Verificare se fidarsi del fornitore, poiché l'applicazione non è in modalità "
+"sandbox"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Nessun permesso"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Accesso alla rete"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Nessun accesso alla rete"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa servizi di sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa servizi di sessione"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Accesso ai dispositivi"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Nessun accesso ai dispositivi"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Accesso completo al file system in lettura/scrittura"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Accesso alla cartella Home in lettura/scrittura"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Accesso completo in lettura al file system"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Accesso in lettura alla cartella Home"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Accesso in lettura/scrittura alla cartella scaricamenti"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Accesso in lettura alla cartella scaricamenti"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+#| msgid "Can read and write all data in your home directory"
+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:310
+#| msgid "Can read all data in your home directory"
+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:326
+msgid "No File System Access"
+msgstr "Nessun accesso al file system"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Non può accedere del tutto al file system"
+
+#. 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 "Codice proprietario"
+
+#: 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 ""
+"Il codice sorgente non è pubblico, quindi non è possibile ispezionarlo in "
+"modo indipendente e potrebbe essere non sicuro"
+
+#. 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 "Codice ispezionabile"
+
+#: 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 ""
+"Il codice sorgente è pubblico e può essere ispezionato in modo indipendente, "
+"il che rende l'applicazione probabilmente più sicura"
+
+#. 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 "Lo sviluppatore dell'applicazione è verificato"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dipendenze non sicure"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 è sicura"
+
+#. 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 è 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s non è sicura"
+
+#. 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:101
+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:141
+msgid "Source"
+msgstr "Sorgente"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versione SDK obsoleta"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Nessuna schermata fornita"
+
+#. 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 "Schermata non trovata"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+msgid "Screenshot not valid"
+msgstr "Schermata non valida"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:797
+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:180
+#, 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 Application 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: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 "Impossibile scaricare gli aggiornamenti firmware da %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 "Impossibile scaricare gli aggiornamenti da %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 "Impossibile scaricare gli aggiornamenti"
+
+#. 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 ""
+"Impossibile scaricare gli aggiornamenti: è stato richiesto l'accesso a "
+"Internet ma non era disponibile"
+
+#. 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 ""
+"Impossibile scaricare gli aggiornamenti da %s: non c'è abbastanza spazio sul "
+"disco"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+"Impossibile scaricare gli aggiornamenti: non c'è abbastanza spazio sul disco"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Impossibile scaricare gli aggiornamenti: è richiesta l'autenticazione"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Impossibile scaricare gli aggiornamenti: l'autenticazione non è valida"
+
+#. 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 ""
+"Impossibile scaricare gli aggiornamenti: non si hanno i permessi per "
+"installare il software"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Impossibile ottenere l'elenco degli aggiornamenti"
+
+#. 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 "Impossibile installare %s poiché lo scaricamento non è riuscito da %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 "Impossibile installare %s poiché lo scaricamento non è riuscito"
+
+#. 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 "Impossibile installare %s poiché le librerie %s non sono disponibili"
+
+#. 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 "Impossibile installare %s poiché non supportato"
+
+#. 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 ""
+"Impossibile installare: è stato richiesto l'accesso a Internet ma non era "
+"disponibile"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Impossibile installare: l'applicazione ha un formato non valido"
+
+#. 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 "Impossibile installare %s: non c'è abbastanza spazio sul disco"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Impossibile installare %s: è richiesta l'autenticazione"
+
+#. 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 "Impossibile installare %s: l'autenticazione non è valida"
+
+#. 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 ""
+"Impossibile installare %s: non si hanno i permessi per installare il software"
+
+#. 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 "Impossibile installare %s: è richiesta l'alimentazione di rete"
+
+#. 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 "Impossibile installare %s: il livello della batteria è troppo basso"
+
+#. 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 "Impossibile installare %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 "Impossibile aggiornare %s da %s poiché lo scaricamento non è riuscito"
+
+#. 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 "Impossibile aggiornare %s poiché lo 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Impossibile installare gli aggiornamenti da %s poiché lo scaricamento non è "
+"riuscito"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Impossibile installare gli aggiornamenti poiché lo scaricamento non è "
+"riuscito"
+
+#. 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 ""
+"Impossibile aggiornare: è stato richiesto l'accesso a Internet ma non era "
+"disponibile"
+
+#. 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 "Impossibile aggiornare %s: non c'è abbastanza spazio sul disco"
+
+#. 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 ""
+"Impossibile installare gli aggiornamenti: non c'è abbastanza spazio sul disco"
+
+#. 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 "Impossibile aggiornare %s: è richiesta l'autenticazione"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Impossibile installare gli aggiornamenti: è richiesta l'autenticazione"
+
+#. 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 "Impossibile aggiornare %s: l'autenticazione non è valida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Impossibile installare gli aggiornamenti: l'autenticazione non è valida"
+
+#. 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 ""
+"Impossibile aggiornare %s: non si hanno i permessi per aggiornare il software"
+
+#. 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 ""
+"Impossibile installare gli aggiornamenti: non si hanno i permessi per "
+"aggiornare il software"
+
+#. 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 "Impossibile aggiornare %s: è richiesta l'alimentazione da rete"
+
+#. 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 ""
+"Impossibile installare gli aggiornamenti: è richiesta l'alimentazione di rete"
+
+#. 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 "Impossibile aggiornare %s: il livello della batteria è troppo basso"
+
+#. 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 ""
+"Impossibile installare gli aggiornamenti: il livello della batteria è troppo "
+"basso"
+
+#. 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 "Impossibile aggiornare %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Impossibile installare gli aggiornamenti"
+
+#. 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 "Impossibile avanzare a %s da %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 "Impossibile avanzare a %s poiché lo scaricamento non è riuscito"
+
+#. 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 ""
+"Impossibile avanzare a %s: è stato richiesto l'accesso a Internet ma non era "
+"disponibile"
+
+#. 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 "Impossibile avanzare a %s: non c'è abbastanza spazio sul disco"
+
+#. 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 "Impossibile avanzare a %s: è 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Impossibile avanzare a %s: l'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:1700
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr "Impossibile avanzare a %s: non si hanno i permessi per avanzare"
+
+#. 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 "Impossibile avanzare a %s: è richiesta l'alimentazione da rete"
+
+#. 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 "Impossibile avanzare a %s: il livello della batteria è troppo basso"
+
+#. 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 "Impossibile avanzare a %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 "Impossibile rimuovere %s: è richiesta l'autenticazione"
+
+#. 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 "Impossibile rimuovere %s: l'autenticazione non è valida"
+
+#. 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 ""
+"Impossibile rimuovere %s: non si hanno i permessi per rimuovere il software"
+
+#. 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 "Impossibile rimuovere %s: è richiesta l'alimentazione da rete"
+
+#. 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 "Impossibile rimuovere %s: il livello della batteria è troppo basso"
+
+#. 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 "Impossibile rimuovere %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 "Impossibile lanciare %s: %s non è installato"
+
+#. 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 "Qualcosa è andato storto"
+
+#. 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 ""
+"Non c'è abbastanza spazio libero sul disco — liberare dello spazio e "
+"riprovare"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Installazione del file non riuscita: non supportato"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1891
+msgid "Failed to install file: authentication failed"
+msgstr "Installazione del file non riuscita: autenticazione non riuscita"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1926
+msgid "Failed to install: not supported"
+msgstr "Installazione non riuscita: non supportato"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1929
+msgid "Failed to install: authentication failed"
+msgstr "Installazione non riuscita: autenticazione non riuscita"
+
+#. 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 "Impossibile contattare %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 "L'applicazione deve essere riavviata per usare i nuovi plugin."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1984
+msgid "AC power is required"
+msgstr "È richiesta l'alimentazione da rete"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "Il livello della batteria è troppo basso"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Repository _software"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Preferenze di aggiornamento"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Esamina disco"
+
+#. 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 "Impostazioni rete"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Riavvia ora"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Maggiori informazioni"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Cerca"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menù principale"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Scopri di _più"
+
+#. 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 "Aggiornamenti"
+
+#. 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 "Application Data"
+msgstr "Dati applicazione"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+msgstr "Dati creati dai voi stessi 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 application 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 application"
+msgstr "Componenti di sistema condivisi richiesti da questa applicazione"
+
+#: src/gs-storage-context-dialog.c:188
+#| msgctxt "Distribution name"
+#| msgid "Unknown"
+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:69
+msgid ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"I dati memorizzati possono essere ripuliti nelle <a "
+"href=\"dummy\">impostazioni dell'_applicazione</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Installato)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Installazione)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Rimozione)"
+
+#. 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 "Aggiornamenti installati"
+
+#. 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 "Installato il %s"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "No Updates Installed"
+msgstr "Nessun aggiornamento installato"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Aggiornamenti software scaduti"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Controllare gli aggiornamenti software."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Aggiornamento software critico pronto per l'installazione"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Un aggiornamento software importante è pronto per essere installato."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Aggiornamenti software critici disponibili per lo scaricamento"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Importante: degli aggiornamenti software critici sono in attesa."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Aggiornamenti software pronti per l'installazione"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr ""
+"Gli aggiornamenti software sono in attesa e pronti per essere installati."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Aggiornamenti software disponibili per lo scaricamento"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Scaricare gli aggiornamenti software in attesa."
+
+#. 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 applicazione aggiornata — Richiesto riavvio"
+msgstr[1] "%u applicazioni aggiornate — Richiesto riavvio"
+
+#. 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 applicazione aggiornata"
+msgstr[1] "%u applicazioni aggiornate"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s è stata aggiornata."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Riavviare l'applicazione."
+
+#. 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 e %s sono state aggiornate."
+
+#. 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 applicazione richiede il riavvio."
+msgstr[1] "%u applicazioni richiedono il riavvio."
+
+#. 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 "Include %s, %s e %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 "Aggiornamenti del sistema operativo non disponibili"
+
+#. 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 "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:728
+#, 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:732
+msgid "Software Upgrade Available"
+msgstr "Avanzamento software disponibile"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Aggiornamenti software non riusciti"
+
+#. 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 ""
+"Non è riuscita l'installazione di un aggiornamento importante del sistema "
+"operativo."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostra dettagli"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, c-format
+msgid "Welcome to %s %s!"
+msgstr "Benvenuti su %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] "Aggiornamento software installato"
+msgstr[1] "Aggiornamenti software installati"
+
+#. 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] ""
+"È 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 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 "Esamina"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Ultimo controllo: %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 non è più supportata."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Il sistema operativo non è più supportato."
+
+#. 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 ""
+"Questo significa che non si riceveranno più aggiornamenti di sicurezza."
+
+#. 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 "È consigliato avanzare a una versione più recente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Potrebbero esserci dei costi"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Controlla _comunque"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nessuna rete"
+
+#. 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 "L'accesso alla rete è richiesto per controllare gli aggiornamenti."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Controllo aggiornamenti"
+
+#: src/gs-updates-page.c:1286
+#| msgid "Updates"
+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:82
+msgid "Loading Updates…"
+msgstr "Caricamento aggiornamenti…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Aggiornato"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Usare dati mobili?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Controlla comunque"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Nessuna connessione"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Vai in linea per controllare gli aggiornamenti."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Impostazioni della _rete"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Errore"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Gli aggiornamenti sono gestiti automaticamente."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Riavvia e aggiorna"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Aggiorna tutto"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Aggiornamenti applicazioni"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware dispositivo"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "È disponibile %s"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Maggiori informazioni sulla nuova versione"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Scaricamento…"
+
+#. 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 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:189
+#, 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:201
+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."
+
+#: 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 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 ""
+"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:67
+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:72
+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: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Scaricamento immagini in evidenza…"
+
+#. Translators: The '%s' is replaced with the OS name, like "Endless OS"
+#: plugins/eos-updater/gs-plugin-eos-updater.c:637
+#, c-format
+#| msgid "An Endless OS update with new features and fixes."
+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:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6
+#| msgid "Desktop Support"
+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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Scaricamento informazioni d'avanzamento…"
+
+#. 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 ""
+"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 applications 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:313
+#, c-format
+#| msgid "System Updates"
+msgid "System folder %s"
+msgstr "Cartella sistema %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+#| msgid "Home folder"
+msgid "Home subfolder %s"
+msgstr "Sotto cartella home %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+#| msgid "Home folder"
+msgid "Host system folders"
+msgstr "Cartelle sistema ospite"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configurazione sistema ospite da /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#| msgid "Desktop Only"
+msgid "Desktop folder"
+msgstr "Cartella Scrivania"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+#| msgid "Desktop Support"
+msgid "Desktop subfolder %s"
+msgstr "Sotto cartella Scrivania %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#| msgid "Home folder"
+msgid "Documents folder"
+msgstr "Cartella Documenti"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+#| msgid "Home folder"
+msgid "Documents subfolder %s"
+msgstr "Sotto cartella Documenti %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music folder"
+msgstr "Cartella Musica"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music subfolder %s"
+msgstr "Sotto cartella Musica %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#| msgid "Home folder"
+msgid "Pictures folder"
+msgstr "Cartella Immagini"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Sotto cartella Immagini %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Cartella Pubblici"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Sotto cartella Pubblici %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#| msgid "Home folder"
+msgid "Videos folder"
+msgstr "Cartella Video"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+#| msgid "%s is suitable for %s"
+msgid "Videos subfolder %s"
+msgstr "Sotto cartella Video %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#| msgid "Home folder"
+msgid "Templates folder"
+msgstr "Cartella Modelli"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Sotto cartella Modelli %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Cartella cache utente"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Sotto cartella cache utente %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#| msgid "%s Configuration Update"
+msgid "User configuration folder"
+msgstr "Cartella configurazione utente"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+#| msgid "%s Configuration Update"
+msgid "User configuration subfolder %s"
+msgstr "Sotto cartella configurazione utente %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#| msgid "User Data"
+msgid "User data folder"
+msgstr "Cartella dati utente"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Sotto cartella dati utente %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#| msgid "Home folder"
+msgid "User runtime folder"
+msgstr "Cartella runtime utente"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Sotto cartella runtime utente %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+#| msgid "No File System Access"
+msgid "Filesystem access to %s"
+msgstr "Accesso file system a %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Recupero metadati flatpak di %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"«%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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Aggiornamento configurazione %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Aggiornamento videocamera %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Aggiornamento TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Aggiornamento schermo a tocco %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+#| msgid "%s Device Update"
+msgid "%s USB Receiver Update"
+msgstr "Aggiornamento del ricevitore USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+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 dei firmware"
+
+#: plugins/packagekit/gs-packagekit-task.c:148
+msgid "Install Unsigned Software?"
+msgstr "Installare software non firmato?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Scaricare software non firmato?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Aggiornare software non firmato?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pacchetti"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..9e3d8d7
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,5434 @@
+# Japanese translation for gnome-software.
+# Copyright (C) 2013-2022 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+# Jiro Matsuzawa <jmatsuzawa@gnome.org>, 2013-2018.
+# Hajime Taira <htaira@redhat.com>, 2015.
+# Kentaro KAZUHAMA <kazken3@gmail.com>, 2015.
+# Rockworld <sumoisrock@gmail.com>, 2016.
+# Takashi Oshie <>, 2016.
+# sujiniku <sujinikusityuu@gmail.com>, 2018, 2020-2021.
+# Shinichirou Yamada <yamada_strong_yamada_nice_64bit@yahoo.co.jp>, 2018.
+# sicklylife <translation@sicklylife.jp>, 2019-2020, 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: 2021-09-28 14:50+0000\n"
+"PO-Revision-Date: 2022-03-14 20:30+0900\n"
+"Last-Translator: sicklylife <translation@sicklylife.jp>\n"
+"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\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/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 ""
+"GNOME ソフトウェアでは、新しいアプリケーションやシステム拡張の検索、インス"
+"トールができます。また、インストール済みアプリケーションの削除も可能です。"
+
+#: data/appdata/org.gnome.Software.appdata.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/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "概要パネル"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Details panel"
+msgstr "詳細パネル"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Installed panel"
+msgstr "インストール済みパネル"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+#: data/appdata/org.gnome.Software.appdata.xml.in:45
+msgid "Updates panel"
+msgstr "アップデートパネル"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:49
+msgid "The update details"
+msgstr "アップデートの詳細"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1862
+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 "これは 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 ""
+
+#: 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 ""
+
+#: 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 "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 "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 last update notification timestamp"
+msgstr "最終アップデート通知のタイムスタンプ"
+
+#: data/org.gnome.software.gschema.xml:64
+msgid "The timestamp of the first security update, cleared after update"
+msgstr ""
+"セキュリティアップデートのタイムスタンプ (アップデート後にクリアされる)"
+
+#: data/org.gnome.software.gschema.xml:68
+msgid "The last update timestamp"
+msgstr "最終アップデートのタイムスタンプ"
+
+#: data/org.gnome.software.gschema.xml:72
+msgid "The last timestamp when the system was online and got any updates"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:76
+msgid "The age in seconds to verify the upstream screenshot is still valid"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:77
+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:86
+msgid "The server to use for application reviews"
+msgstr "アプリケーションのレビューに使用されるサーバー"
+
+#: data/org.gnome.software.gschema.xml:90
+msgid "The minimum karma score for reviews"
+msgstr "レビューを表示する最低カルマスコア"
+
+#: data/org.gnome.software.gschema.xml:91
+msgid "Reviews with karma less than this number will not be shown."
+msgstr "カルマがこの数値に達しないレビューは表示されません。"
+
+#: data/org.gnome.software.gschema.xml:95
+msgid "A list of official repositories that should not be considered 3rd party"
+msgstr "サードパーティーのものとして扱うべきでない公式リポジトリの一覧"
+
+#: data/org.gnome.software.gschema.xml:99
+msgid "A list of official repositories that should be considered free software"
+msgstr "自由ソフトウェアとして扱うべき公式リポジトリの一覧"
+
+#: data/org.gnome.software.gschema.xml:103
+msgid ""
+"The licence URL to use when an application should be considered free software"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:107
+msgid "Install bundled applications for all users on the system where possible"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:111
+msgid "Allow access to the Software Repositories dialog"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:115
+msgid "Offer upgrades for pre-releases"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:119
+msgid "Show some UI elements informing the user that an app is non-free"
+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://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD"
+"%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A8%E3%82%BF%E3%83%AA%E3%83%BB%E3%82%BD"
+"%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2'"
+
+#: 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 ""
+"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."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:145
+msgid "The URI that references the background for an upgrade banner."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:146
+msgid ""
+"The URI can contain up to three '%u', which will be replaced by the upgrade "
+"version."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:152
+msgid "A string storing the gnome-online-account id used to login"
+msgstr ""
+
+#. TRANSLATORS: tool that is used when copying profiles system-wide
+#: gs-install-appstream/gs-install-appstream.c:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Software AppStream システムワイドインストーラー"
+
+#: 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 "このプログラムは root ユーザーのみ実行可能です"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, c-format
+msgid "Failed to validate content type: %s"
+msgstr "コンテンツタイプの検証に失敗しました: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, c-format
+msgid "Failed to copy: %s"
+msgstr "コピーに失敗しました: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, c-format
+msgid "Failed to move: %s"
+msgstr "移動に失敗しました: %s"
+
+#: 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: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:78
+msgid "Cartoon Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:85
+msgid "Fantasy Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:92
+msgid "Realistic Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:99
+msgid "Violence Depicting Bloodshed"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:106
+msgid "Sexual Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:113
+msgid "Alcohol"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:120
+msgid "Narcotics"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:127
+msgid "Tobacco"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:134
+msgid "Nudity"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:141
+msgid "Sexual Themes"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:148
+msgid "Profanity"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:155
+msgid "Inappropriate Humor"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:162
+msgid "Discrimination"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:169
+msgid "Advertising"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:176
+msgid "Gambling"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:183
+msgid "Purchasing"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:190
+msgid "Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:197
+msgid "Audio Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:204
+msgid "Contact Details"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:211
+msgid "Identifying Information"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:218
+msgid "Location Sharing"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:241
+msgid "Homosexuality"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:248
+msgid "Prostitution"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:255
+msgid "Adultery"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:262
+msgid "Sexualized Characters"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:269
+msgid "Desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:276
+msgid "Human Remains"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:283
+msgid "Slavery"
+msgstr ""
+
+#. Translators: This refers to a content rating attribute which
+#. * has an unknown value. For example, the amount of violence in
+#. * an app is ‘Unknown’.
+#: src/gs-age-rating-context-dialog.c:338
+msgid "Unknown"
+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.
+#. TRANSLATORS: this is a subcategory matching all the
+#. * different apps in the parent category, e.g. "Games"
+#: src/gs-age-rating-context-dialog.c:605 lib/gs-category.c:214
+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:618 src/gs-app-context-bar.c:187
+#: src/gs-storage-context-dialog.c:87
+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:684
+#, 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:688
+#, 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:692
+#, 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:700
+#, 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:704
+#, 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:709
+#, 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:9 src/gs-app-context-bar.ui:302
+msgid "Age Rating"
+msgstr "推奨年齢レーティング"
+
+#: src/gs-age-rating-context-dialog.ui:116
+#: src/gs-hardware-support-context-dialog.ui:115
+#: src/gs-safety-context-dialog.ui:264
+msgid "How to add missing information"
+msgstr "足りない情報を追加するには"
+
+#: lib/gs-app.c:5607
+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:5623 src/gs-safety-context-dialog.c:391
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:5699
+msgid "Package"
+msgstr "パッケージ"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:435
+msgid "Pending"
+msgstr "保留"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:439 src/gs-details-page.c:381
+msgid "Pending install"
+msgstr "インストール保留"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:443 src/gs-details-page.c:388
+msgid "Pending remove"
+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-app-addon-row.c:111 src/gs-app-row.ui:167 src/gs-app-tile.ui:51
+#: src/gs-feature-tile.c:381 src/gs-installed-page.c:592 src/gs-shell.ui:319
+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:195 src/gs-details-page.c:374
+msgid "Installing"
+msgstr "インストール中"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "削除中"
+
+#: src/gs-app-addon-row.ui:70
+msgid "_Uninstall"
+msgstr "アンインストール(_U)"
+
+#: src/gs-app-details-page.c:70
+msgid "Network"
+msgstr "ネットワーク"
+
+#: src/gs-app-details-page.c:70
+msgid "Can communicate over the network"
+msgstr "ネットワークを介して通信できます"
+
+#: src/gs-app-details-page.c:71
+msgid "System Services"
+msgstr "システムサービス"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access D-Bus services on the system bus"
+msgstr "システムバスの D-Bus サービスにアクセスできます"
+
+#: src/gs-app-details-page.c:72
+msgid "Session Services"
+msgstr "セッションサービス"
+
+#: src/gs-app-details-page.c:72
+msgid "Can access D-Bus services on the session bus"
+msgstr "セッションバスの D-Bus サービスにアクセスできます"
+
+#: src/gs-app-details-page.c:73
+msgid "Devices"
+msgstr "デバイス"
+
+#: src/gs-app-details-page.c:73
+msgid "Can access system device files"
+msgstr "システムのデバイスファイルにアクセスできます"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+msgid "Home folder"
+msgstr "ホームフォルダー"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:76
+#: src/gs-app-details-page.c:78
+msgid "Can view, edit and create files"
+msgstr "ファイルを作成、表示、編集できます"
+
+#: src/gs-app-details-page.c:75 src/gs-app-details-page.c:77
+#: src/gs-app-details-page.c:79
+msgid "Can view files"
+msgstr "ファイルを表示できます"
+
+#: src/gs-app-details-page.c:76 src/gs-app-details-page.c:77
+msgid "File system"
+msgstr "ファイルシステム"
+
+#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:79
+msgid "Downloads folder"
+msgstr "ダウンロードフォルダー"
+
+#: src/gs-app-details-page.c:80
+msgid "Settings"
+msgstr "設定"
+
+#: src/gs-app-details-page.c:80
+msgid "Can view and change any settings"
+msgstr "設定を表示、変更できます"
+
+#: src/gs-app-details-page.c:81
+msgid "Legacy display system"
+msgstr "レガシーなディスプレイシステム"
+
+#: src/gs-app-details-page.c:81
+msgid "Uses an old, insecure display system"
+msgstr "古くてセキュアではないディスプレイシステムを使用します"
+
+#: src/gs-app-details-page.c:82
+msgid "Sandbox escape"
+msgstr "サンドボックス回避"
+
+#: src/gs-app-details-page.c:82
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "サンドボックスから抜け出して色々な制限を回避できます"
+
+#. Translators: This is the source and upgrade version of an
+#. * application, shown to the user when they view more detailed
+#. * information about pending updates. The source is of the form
+#. * ‘deja-dup’ (a package name) or
+#. * ‘app/org.gnome.Builder/x86_64/main’ (a flatpak ID), and the
+#. * version is of the form ‘40.4-1.fc34’ (a version number).
+#: src/gs-app-details-page.c:159
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-app-details-page.c:177
+msgid "No update description available."
+msgstr "アップデートの説明がありません。"
+
+#: src/gs-app-details-page.ui:22 src/gs-shell.ui:374 src/gs-shell.ui:462
+msgid "Go back"
+msgstr "戻る"
+
+#: src/gs-app-details-page.ui:109 src/gs-app-row.c:504
+msgid "Requires additional permissions"
+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:61
+#, c-format
+msgid "New in Version %s"
+msgstr "バージョン %s の更新内容"
+
+#: src/gs-app-version-history-row.c:68
+#, c-format
+msgid "Version %s"
+msgstr "バージョン %s"
+
+#: src/gs-app-version-history-row.c:70
+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:84 src/gs-review-row.c:65
+msgid "%e %B %Y"
+msgstr "%Y年%B%-e日"
+
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:139
+msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"
+msgstr ""
+"起動モード (指定可能な値): ‘updates’, ‘updated’, ‘installed’, ‘overview’"
+
+#: src/gs-application.c:139
+msgid "MODE"
+msgstr "MODE"
+
+#: src/gs-application.c:141
+msgid "Search for applications"
+msgstr "アプリケーションを検索する"
+
+#: src/gs-application.c:141
+msgid "SEARCH"
+msgstr "SEARCH"
+
+#: src/gs-application.c:143
+msgid "Show application details (using application ID)"
+msgstr "アプリケーションの詳細を表示する (アプリケーション ID を指定)"
+
+#: src/gs-application.c:143 src/gs-application.c:147
+msgid "ID"
+msgstr "ID"
+
+#: src/gs-application.c:145
+msgid "Show application details (using package name)"
+msgstr "アプリケーションの詳細を表示する (パッケージ名を指定)"
+
+#: src/gs-application.c:145
+msgid "PKGNAME"
+msgstr "PKGNAME"
+
+#: src/gs-application.c:147
+msgid "Install the application (using application ID)"
+msgstr "アプリケーションをインストールする (アプリケーション ID を指定)"
+
+#: src/gs-application.c:149
+msgid "Open a local package file"
+msgstr "ローカルのパッケージファイルを開く"
+
+#: src/gs-application.c:149
+msgid "FILENAME"
+msgstr "FILENAME"
+
+#: src/gs-application.c:151
+msgid ""
+"The kind of interaction expected for this action: either ‘none’, ‘notify’, "
+"or ‘full’"
+msgstr ""
+
+#: src/gs-application.c:143
+msgid "Show a local metainfo or appdata file"
+msgstr ""
+
+#: src/gs-application.c:154
+msgid "Show verbose debugging information"
+msgstr "詳細なデバッグ情報を表示する"
+
+#: src/gs-application.c:156
+msgid "Installs any pending updates in the background"
+msgstr "保留中のアップデートをバックグラウンドでインストールする"
+
+#: src/gs-application.c:158
+msgid "Show update preferences"
+msgstr "アップデート設定を表示する"
+
+#: src/gs-application.c:160
+msgid "Quit the running instance"
+msgstr "実行中のインスタンスを終了する"
+
+#: src/gs-application.c:162
+msgid "Prefer local file sources to AppStream"
+msgstr "AppStream よりローカルのファイルソースを優先させる"
+
+#: src/gs-application.c:164
+msgid "Show version number"
+msgstr "バージョン情報を表示する"
+
+#: src/gs-application.c:358
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 GNOME Software contributors"
+
+#: src/gs-application.c:361
+msgid "translator-credits"
+msgstr ""
+"松澤 二郎 <jmatsuzawa@gnome.org>\n"
+"Hajime Taira <htaira@redhat.com>\n"
+"Kentaro KAZUHAMA <kazken3@gmail.com>\n"
+"Rockworld <sumoisrock@gmail.com>\n"
+"Shinichirou Yamada <yamada_strong_yamada_nice_64bit@yahoo.co.jp >\n"
+"sicklylife <translation@sicklylife.jp>\n"
+"sujiniku <sujinikusityuu@gmail.com>\n"
+"Takashi Oshie <>"
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:374 src/gs-shell.c:2141
+msgid "About Software"
+msgstr "“ソフトウェア”について"
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:377
+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:566
+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:148 src/gs-storage-context-dialog.c:128
+msgid "Installed Size"
+msgstr "インストールサイズ"
+
+#: src/gs-app-context-bar.c:151
+#, c-format
+msgid "Includes %s of data and %s of cache"
+msgstr "%s のデータと %s のキャッシュを含む"
+
+#: src/gs-app-context-bar.c:154
+#, c-format
+msgid "Includes %s of data"
+msgstr "%s のデータを含む"
+
+#: src/gs-app-context-bar.c:157
+#, c-format
+msgid "Includes %s of cache"
+msgstr "%s のキャッシュを含む"
+
+#: src/gs-app-context-bar.c:160
+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:169 src/gs-storage-context-dialog.c:156
+msgid "Download Size"
+msgstr "ダウンロードサイズ"
+
+#: src/gs-app-context-bar.c:172
+msgid "Needs no additional system downloads"
+msgstr "追加のシステムダウンロードは不要"
+
+#: src/gs-app-context-bar.c:174
+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:179
+#, 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:193
+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:257
+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:268
+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:275
+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:282
+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:289
+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:301
+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:313
+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:320
+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:327
+msgid "Can read your downloads"
+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:334 src/gs-safety-context-dialog.c:217
+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:341 src/gs-safety-context-dialog.c:201
+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:348 src/gs-safety-context-dialog.c:209
+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:374 src/gs-safety-context-dialog.c:142
+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:381 src/gs-safety-context-dialog.c:139
+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:393
+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:399
+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:406
+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:422
+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:418 src/gs-app-context-bar.c:679
+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:426
+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:433
+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:440
+msgid "Unsafe"
+msgstr "安全でない"
+
+#: src/gs-app-context-bar.c:519 src/gs-app-context-bar.c:551
+#: src/gs-hardware-support-context-dialog.c:587
+msgid "Mobile Only"
+msgstr "モバイルのみ"
+
+#: src/gs-app-context-bar.c:520
+msgid "Only works on a small screen"
+msgstr "小さな画面でのみ動作"
+
+#: src/gs-app-context-bar.c:525 src/gs-app-context-bar.c:558
+#: src/gs-app-context-bar.c:565 src/gs-app-context-bar.c:605
+#: src/gs-app-context-bar.c:610 src/gs-hardware-support-context-dialog.c:567
+msgid "Desktop Only"
+msgstr "デスクトップのみ"
+
+#: src/gs-app-context-bar.c:526
+msgid "Only works on a large screen"
+msgstr "大きな画面でのみ動作"
+
+#: src/gs-app-context-bar.c:530 src/gs-hardware-support-context-dialog.c:605
+msgid "Screen Size Mismatch"
+msgstr "画面サイズ不一致"
+
+#: src/gs-app-context-bar.c:531 src/gs-hardware-support-context-dialog.c:606
+msgid "Doesn’t support your current screen size"
+msgstr "現在のスクリーンサイズはサポートしていません"
+
+#: src/gs-app-context-bar.c:552 src/gs-hardware-support-context-dialog.c:658
+#: src/gs-hardware-support-context-dialog.c:664
+msgid "Requires a touchscreen"
+msgstr "タッチスクリーンが必要"
+
+#: src/gs-app-context-bar.c:559 src/gs-hardware-support-context-dialog.c:618
+#: src/gs-hardware-support-context-dialog.c:624
+msgid "Requires a keyboard"
+msgstr "キーボードが必要"
+
+#: src/gs-app-context-bar.c:566
+msgid "Requires a mouse"
+msgstr "マウスが必要"
+
+#: src/gs-app-context-bar.c:577
+msgid "Gamepad Needed"
+msgstr "ゲームパッドが必要"
+
+#: src/gs-app-context-bar.c:578
+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:592
+msgid "Adaptive"
+msgstr "適応"
+
+#: src/gs-app-context-bar.c:593
+msgid "Works on phones, tablets and desktops"
+msgstr "スマートフォン、タブレット、デスクトップで動作"
+
+#: src/gs-app-context-bar.c:606
+msgid "Probably requires a keyboard or mouse"
+msgstr "おそらくキーボードかマウスが必要"
+
+#: src/gs-app-context-bar.c:611
+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:654
+msgid "Contains no age-inappropriate content"
+msgstr ""
+
+#: src/gs-app-context-bar.c:703
+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:143
+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:149
+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:157 src/gs-updates-section.ui:61
+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:165 src/gs-common.c:297 src/gs-page.c:368
+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:173
+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:178 src/gs-app-row.c:188 src/gs-details-page.ui:296
+#: src/gs-page.c:529
+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:202
+msgid "Uninstalling"
+msgstr "アンインストール中"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:312
+msgid "Device cannot be used during update."
+msgstr "更新中はデバイスを使用できません。"
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-app-row.c:322 src/gs-shell-search-provider.c:264
+#, 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:511
+#, c-format
+msgid "Renamed from %s"
+msgstr "%s から名前が変更されました"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "%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 はボランティアによる国際コミュニティによってデザイン、開発、翻訳されてい"
+"ます。\n"
+"\n"
+"まだあなたの言語には翻訳されていませんが、あなた自身がコミュニティに参加して"
+"翻訳することが可能です。"
+
+#: src/gs-app-translation-dialog.ui:9
+msgid "Translations"
+msgstr "翻訳"
+
+#: src/gs-app-translation-dialog.ui:133
+msgid "_Translation Website"
+msgstr "翻訳サイト(_T)"
+
+#. 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:10
+msgid "Login Required"
+msgstr "ログインが必要です"
+
+#: src/gs-basic-auth-dialog.ui:19 src/gs-details-page.ui:311
+#: src/gs-removal-dialog.ui:29 src/gs-review-dialog.ui:22
+msgid "_Cancel"
+msgstr "キャンセル(_C)"
+
+#: src/gs-basic-auth-dialog.ui:39
+msgid "_Login"
+msgstr "ログイン(_L)"
+
+#: src/gs-basic-auth-dialog.ui:99
+msgid "_User"
+msgstr "ユーザー(_U)"
+
+#: src/gs-basic-auth-dialog.ui:119
+msgid "_Password"
+msgstr "パスワード(_P)"
+
+#. 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 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:46 src/gs-overview-page.ui:118
+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:74 src/gs-overview-page.ui:146
+msgid "New & Updated"
+msgstr "新規 & アップデート"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:102
+msgid "Other Software"
+msgstr "その他のソフトウェア"
+
+#. TRANSLATORS: the user isn't reading the question
+#: lib/gs-cmd.c:193
+#, 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:256
+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 "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 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:130 src/gs-common.c:153
+#, c-format
+msgid "%s is now installed"
+msgstr "%s をインストールしました"
+
+#. TRANSLATORS: an application has been installed, but
+#. * needs a reboot to complete the installation
+#: src/gs-common.c:134 src/gs-common.c:157
+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:138
+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:146
+msgid "System updates are now installed"
+msgstr "システムアップデートをインストールしました"
+
+#. TRANSLATORS: this is the summary of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:146
+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:149
+msgid "Recently installed updates are available to review"
+msgstr "最近インストールしたアップデートの内容を確認できます"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:168 src/gs-common.c:720
+msgid "Restart"
+msgstr "再起動"
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:172
+msgid "Launch"
+msgstr "起動"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:231
+msgid "Install Third-Party Software?"
+msgstr "サードパーティーのソフトウェアをインストールしますか?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:235 src/gs-repos-dialog.c:193
+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:251
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s は<a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">"
+"自由でオープンソースのソフトウェア</a>ではなく、“%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:261
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s は“%s”によって提供されています。"
+
+#: src/gs-common.c:270
+msgid "This software repository must be enabled to continue installation."
+msgstr ""
+"インストールを続行するには、このソフトウェアリポジトリを有効にする必要があり"
+"ます。"
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:280
+#, 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:286
+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:293
+msgid "Don’t Warn Again"
+msgstr "今後警告しない"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:302
+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:494
+msgid "Detailed errors from the package manager follow:"
+msgstr "パッケージマネージャーからのエラーの詳細:"
+
+#: src/gs-common.c:513 src/gs-safety-context-dialog.ui:116
+msgid "Details"
+msgstr "詳細"
+
+# 署名なしソフトウェアのインストール/アップデート時に表示されるボタンだと思われる。gnome-bluetooth と同じように「承認」と訳しておく。
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:655
+msgid "_Accept"
+msgstr "承認(_A)"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-common.c:695
+msgid "An update has been installed"
+msgid_plural "Updates have been installed"
+msgstr[0] "アップデートをインストールしました"
+
+#. TRANSLATORS: we've just removed some apps
+#: src/gs-common.c:705
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "アプリケーションを削除しました"
+
+#. TRANSLATORS: the new apps will not be run until we restart
+#: src/gs-common.c:711
+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:718
+msgid "Not Now"
+msgstr "あとで"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:810
+msgid "Just now"
+msgstr "たった今"
+
+#: src/gs-common.c:812
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] "%d 分前"
+
+#: src/gs-common.c:816
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d 時間前"
+
+#: src/gs-common.c:820
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d 日前"
+
+#: src/gs-common.c:824
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d 週間前"
+
+#: src/gs-common.c:828
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d ヶ月前"
+
+#: src/gs-common.c:832
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d 年前"
+
+#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown
+#: src/gs-dbus-helper.c:283
+msgid "An application"
+msgstr "アプリケーション"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types.
+#: src/gs-dbus-helper.c:289
+#, c-format
+msgid "%s is requesting additional file format support."
+msgstr "%s には追加のファイルフォーマットサポートが必要です。"
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:291
+msgid "Additional MIME Types Required"
+msgstr "追加の MIME タイプが必要です"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional fonts.
+#: src/gs-dbus-helper.c:295
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr "%s には追加のフォントが必要です。"
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:297
+msgid "Additional Fonts Required"
+msgstr "追加のフォントが必要です"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional codecs.
+#: src/gs-dbus-helper.c:301
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr "%s には追加のマルチメディアコーデックが必要です。"
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:303
+msgid "Additional Multimedia Codecs Required"
+msgstr "追加のマルチメディアコーデックが必要です"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers.
+#: src/gs-dbus-helper.c:307
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr "%s には追加のプリンタードライバーが必要です。"
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:309
+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:313
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "%s には追加のパッケージが必要です。"
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:315
+msgid "Additional Packages Required"
+msgstr "追加のパッケージが必要です"
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:324
+msgid "Find in Software"
+msgstr "“ソフトウェア”で探す"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-description-box.c:65 src/gs-description-box.c:171
+#: src/gs-details-page.ui:966
+msgid "_Show More"
+msgstr "さらに表示(_S)"
+
+#: src/gs-description-box.c:65
+msgid "_Show Less"
+msgstr "表示を減らす(_S)"
+
+#: src/gs-details-page.c:369
+msgid "Removing…"
+msgstr "削除中…"
+
+#: src/gs-details-page.c:379
+msgid "Requires restart to finish install"
+msgstr "インストールの完了には再起動が必要です"
+
+#: src/gs-details-page.c:386
+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:403
+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:410
+msgid "Pending update…"
+msgstr "アップデート保留中…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:426
+msgid "Preparing…"
+msgstr "準備中…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:429
+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:833 src/gs-details-page.c:859
+#: src/gs-details-page.ui:240
+msgid "_Install"
+msgstr "インストール(_I)"
+
+#: src/gs-details-page.c:849
+msgid "_Restart"
+msgstr "再起動(_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:873
+msgid "_Install…"
+msgstr "インストール(_I)…"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1413
+msgid "You need internet access to write a review"
+msgstr "レビューを書くにはインターネットへの接続が必要です"
+
+#: src/gs-details-page.c:1559 src/gs-details-page.c:1575
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "“%s”が見つかりません"
+
+#. TRANSLATORS: This is a title for the app details page,
+#. * shown when it’s loading the details of an app.
+#: src/gs-details-page.c:2131
+msgid "Loading…"
+msgstr "読み込み中…"
+
+#: src/gs-details-page.ui:8
+msgid "Details page"
+msgstr "詳細ページ"
+
+#: src/gs-details-page.ui:40
+msgid "Loading application details…"
+msgstr "アプリケーションの詳細を読み込み中…"
+
+#: src/gs-details-page.ui:79
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"このソフトウェアはあなたの言語で利用可能ではなく、アメリカ英語で表示さ"
+"れます。"
+
+#: src/gs-details-page.ui:87
+msgid "Help _Translate"
+msgstr "翻訳を手伝う(_T)"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:257
+msgid "_Open"
+msgstr "開く(_O)"
+
+#: src/gs-details-page.ui:270
+msgid "_Update"
+msgstr "アップデート(_U)"
+
+#: src/gs-details-page.ui:336
+msgid "Downloading"
+msgstr "ダウンロード中"
+
+#. Translators: A label for a button to add a shortcut to the selected application.
+#: src/gs-details-page.ui:358
+msgid "_Add shortcut"
+msgstr "ショートカットを追加(_A)"
+
+#. Translators: A label for a button to remove a shortcut to the selected application.
+#: src/gs-details-page.ui:374
+msgid "Re_move shortcut"
+msgstr "ショートカットを削除(_M)"
+
+#: src/gs-details-page.ui:466 src/gs-installed-page.ui:120
+msgid "Add-ons"
+msgstr "アドオン"
+
+#: src/gs-details-page.ui:478
+msgid "Selected add-ons will be installed with the application."
+msgstr "選択したアドオンはこのアプリケーションと一緒にインストールされます。"
+
+#: src/gs-details-page.ui:586
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"このアプリケーションはインターネットに接続していなければ使用できません。"
+
+#: src/gs-details-page.ui:607
+msgid "Software Repository Included"
+msgstr "ソフトウェアリポジトリあり"
+
+#: src/gs-details-page.ui:608
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"このアプリケーションにはアップデートや他のソフトウェアを利用できるようになる"
+"ソフトウェアリポジトリが含まれています。"
+
+#: src/gs-details-page.ui:626
+msgid "No Software Repository Included"
+msgstr "ソフトウェアリポジトリなし"
+
+#: src/gs-details-page.ui:627
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"このアプリケーションにはソフトウェアリポジトリが含まれていません。新しいバー"
+"ジョンへのアップデートは行われません。"
+
+#: src/gs-details-page.ui:646
+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:664
+msgid "Software Repository Identified"
+msgstr "ソフトウェアリポジトリを特定"
+
+#: src/gs-details-page.ui:665
+msgid ""
+"Adding this software repository will give you access to additional software "
+"and upgrades."
+msgstr ""
+"このソフトウェアリポジトリを追加することで、追加のソフトウェアやアップグレー"
+"ドを利用できるようになります。"
+
+#: src/gs-details-page.ui:666
+msgid "Only use software repositories that you trust."
+msgstr "信頼できるソフトウェアリポジトリのみを利用しましょう。"
+
+#: src/gs-details-page.ui:731
+msgid "No Metadata"
+msgstr "メタデータなし"
+
+#: src/gs-details-page.ui:741
+msgid ""
+"This software doesn’t provide any links to a website, code repository or "
+"issue tracker."
+msgstr ""
+"このソフトウェアはウェブサイト、コードリポジトリ、課題管理システム (Issue "
+"Tracker) へのリンクを提供していません。"
+
+#: src/gs-details-page.ui:769
+msgid "Project _Website"
+msgstr "プロジェクトのウェブサイト(_W)"
+
+#: src/gs-details-page.ui:795
+msgid "_Donate"
+msgstr "寄付(_D)"
+
+#: src/gs-details-page.ui:821
+msgid "Contribute _Translations"
+msgstr "翻訳で貢献(_T)"
+
+#: src/gs-details-page.ui:847
+msgid "_Report an Issue"
+msgstr "問題を報告(_R)"
+
+#: src/gs-details-page.ui:873
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:844
+msgid "_Write Review"
+msgstr "レビューを書く(_W)"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:881
+msgid "All Reviews"
+msgstr "すべてのレビュー"
+
+#. Translators: Header of the section with other users' opinions about the app.
+#: src/gs-details-page.ui:926
+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 "レビューなし"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:944
+msgid "_Write a Review"
+msgstr "レビューを書く(_W)"
+
+#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos
+#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’).
+#: src/gs-details-page.ui:1043 src/gs-safety-context-dialog.ui:189
+msgid "Source"
+msgstr "ソース"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:226
+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: Application 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: Application 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:243
+msgid "Requested software not found"
+msgstr "要求されたソフトウェアがありません"
+
+#: src/gs-extras-page.c:245
+msgid "Failed to find requested software"
+msgstr "要求されたソフトウェアが見つかりません"
+
+#. TRANSLATORS: This string is used for codecs that weren't found
+#: src/gs-extras-page.c:341
+#, c-format
+msgid "%s not found"
+msgstr "%s は見つかりませんでした"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:345
+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:352
+#, 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:356 src/gs-extras-page.c:367 src/gs-extras-page.c:378
+#, 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:363 src/gs-extras-page.c:385
+#, 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:374
+#, 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:389
+#, 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:396
+#, 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:400
+#, 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:407
+#, 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:411
+#, 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:418
+#, 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:422
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:429
+#, 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:433
+#, 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:477
+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:483
+#, 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:492
+#, 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:562 src/gs-extras-page.c:618 src/gs-extras-page.c:657
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "何も見つかりませんでした: %s"
+
+#: src/gs-extras-page.c:848
+#, c-format
+msgid "%s file format"
+msgstr "%s ファイルフォーマット"
+
+#: src/gs-extras-page.c:1223
+msgid "Unable to Find Requested Software"
+msgstr "要求されたソフトウェアが見つかりません"
+
+#: src/gs-extras-page.ui:7
+msgid "Codecs page"
+msgstr "コーデックページ"
+
+#: src/gs-featured-carousel.ui:43
+msgid "Previous"
+msgstr "前へ"
+
+#: src/gs-featured-carousel.ui:73
+msgid "Next"
+msgstr "次へ"
+
+#: src/gs-featured-carousel.ui:100
+msgid "Featured Apps List"
+msgstr "注目のアプリ一覧"
+
+#: src/gs-first-run-dialog.ui:10
+msgid "Welcome"
+msgstr "ようこそ"
+
+#: src/gs-first-run-dialog.ui:27
+msgid "Welcome to Software"
+msgstr "“ソフトウェア”へようこそ"
+
+#: src/gs-first-run-dialog.ui:28
+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:34
+msgid "_Browse Software"
+msgstr "ソフトウェアを探す(_B)"
+
+#: src/gs-hardware-support-context-dialog.c:561
+#: src/gs-hardware-support-context-dialog.c:570
+msgid "Desktop Support"
+msgstr "デスクトップサポート"
+
+#: src/gs-hardware-support-context-dialog.c:562
+#: src/gs-hardware-support-context-dialog.c:571
+msgid "Supports being used on a large screen"
+msgstr "大きな画面での使用をサポート"
+
+#: src/gs-hardware-support-context-dialog.c:564
+msgid "Desktop Support Unknown"
+msgstr "デスクトップサポート不明"
+
+#: src/gs-hardware-support-context-dialog.c:565
+msgid "Not enough information to know if large screens are supported"
+msgstr "大きな画面をサポートしているかどうかの十分な情報なし"
+
+#: src/gs-hardware-support-context-dialog.c:568
+msgid "Requires a large screen"
+msgstr "大きな画面が必要"
+
+#: src/gs-hardware-support-context-dialog.c:573
+msgid "Desktop Not Supported"
+msgstr "デスクトップ非サポート"
+
+#: src/gs-hardware-support-context-dialog.c:574
+msgid "Cannot be used on a large screen"
+msgstr "大きな画面での使用不可"
+
+#: src/gs-hardware-support-context-dialog.c:581
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Mobile Support"
+msgstr "モバイルサポート"
+
+#: src/gs-hardware-support-context-dialog.c:582
+#: src/gs-hardware-support-context-dialog.c:591
+msgid "Supports being used on a small screen"
+msgstr "小さな画面での使用をサポート"
+
+#: src/gs-hardware-support-context-dialog.c:584
+msgid "Mobile Support Unknown"
+msgstr "モバイルサポート不明"
+
+#: src/gs-hardware-support-context-dialog.c:585
+msgid "Not enough information to know if small screens are supported"
+msgstr "小さな画面をサポートしているかどうかの十分な情報なし"
+
+#: src/gs-hardware-support-context-dialog.c:588
+msgid "Requires a small screen"
+msgstr "小さな画面が必要"
+
+#: src/gs-hardware-support-context-dialog.c:593
+msgid "Mobile Not Supported"
+msgstr "モバイル非サポート"
+
+#: src/gs-hardware-support-context-dialog.c:594
+msgid "Cannot be used on a small screen"
+msgstr "小さな画面での使用不可"
+
+#: src/gs-hardware-support-context-dialog.c:617
+#: src/gs-hardware-support-context-dialog.c:626
+msgid "Keyboard Support"
+msgstr "キーボードサポート"
+
+#: src/gs-hardware-support-context-dialog.c:620
+msgid "Keyboard Support Unknown"
+msgstr "キーボードサポート不明"
+
+#: src/gs-hardware-support-context-dialog.c:621
+msgid "Not enough information to know if keyboards are supported"
+msgstr "キーボードをサポートしているかどうかの十分な情報なし"
+
+#: src/gs-hardware-support-context-dialog.c:623
+msgid "Keyboard Required"
+msgstr "キーボードが必要"
+
+#: src/gs-hardware-support-context-dialog.c:627
+msgid "Supports keyboards"
+msgstr "キーボードをサポート"
+
+#: src/gs-hardware-support-context-dialog.c:629
+msgid "Keyboard Not Supported"
+msgstr "キーボード非サポート"
+
+#: src/gs-hardware-support-context-dialog.c:630
+msgid "Cannot be used with a keyboard"
+msgstr "キーボードの使用不可"
+
+#: src/gs-hardware-support-context-dialog.c:637
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Mouse Support"
+msgstr "マウスサポート"
+
+#: src/gs-hardware-support-context-dialog.c:638
+#: src/gs-hardware-support-context-dialog.c:644
+msgid "Requires a mouse or pointing device"
+msgstr "マウスかポインティングデバイスが必要"
+
+#: src/gs-hardware-support-context-dialog.c:640
+msgid "Mouse Support Unknown"
+msgstr "マウスサポート不明"
+
+#: src/gs-hardware-support-context-dialog.c:641
+msgid ""
+"Not enough information to know if mice or pointing devices are supported"
+msgstr ""
+"マウスかポインティングデバイスをサポートしているかどうかの十分な情報なし"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Mouse Required"
+msgstr "マウスが必要"
+
+#: src/gs-hardware-support-context-dialog.c:647
+msgid "Supports mice and pointing devices"
+msgstr "マウスとポインティングデバイスをサポート"
+
+#: src/gs-hardware-support-context-dialog.c:649
+msgid "Mouse Not Supported"
+msgstr "マウス非サポート"
+
+#: src/gs-hardware-support-context-dialog.c:650
+msgid "Cannot be used with a mouse or pointing device"
+msgstr "マウスとポインティングデバイスの使用不可"
+
+#: src/gs-hardware-support-context-dialog.c:657
+#: src/gs-hardware-support-context-dialog.c:666
+msgid "Touchscreen Support"
+msgstr "タッチスクリーンサポート"
+
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Touchscreen Support Unknown"
+msgstr "タッチスクリーンサポート不明"
+
+#: src/gs-hardware-support-context-dialog.c:661
+msgid "Not enough information to know if touchscreens are supported"
+msgstr "タッチスクリーンをサポートしているかどうかの十分な情報なし"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Touchscreen Required"
+msgstr "タッチスクリーンが必要"
+
+#: src/gs-hardware-support-context-dialog.c:667
+msgid "Supports touchscreens"
+msgstr "タッチスクリーンをサポート"
+
+#: src/gs-hardware-support-context-dialog.c:669
+msgid "Touchscreen Not Supported"
+msgstr "タッチスクリーン非サポート"
+
+#: src/gs-hardware-support-context-dialog.c:670
+msgid "Cannot be used with a touchscreen"
+msgstr "タッチスクリーンの使用不可"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Gamepad Required"
+msgstr "ゲームパッドが必要"
+
+#: src/gs-hardware-support-context-dialog.c:684
+msgid "Requires a gamepad"
+msgstr "ゲームパッドが必要"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Gamepad Support"
+msgstr "ゲームパッドサポート"
+
+#: src/gs-hardware-support-context-dialog.c:687
+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:696
+#, 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:703
+#, c-format
+msgid "%s 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:710
+#, 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:717
+#, 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:9
+msgid "Hardware Support"
+msgstr "ハードウェアサポート"
+
+#: src/gs-installed-page.ui:7
+msgid "Installed page"
+msgstr "インストールページ"
+
+#: src/gs-installed-page.ui:54
+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:106
+msgid "Applications"
+msgstr "アプリケーション"
+
+#: src/gs-installed-page.ui:98
+msgid "System Applications"
+msgstr "システムアプリケーション"
+
+#: src/gs-license-tile.c:93
+msgid "Community Built"
+msgstr "コミュニティビルド"
+
+#. Translators: The placeholder here is the name of a software license.
+#: src/gs-license-tile.c:101
+#, 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 ""
+"このソフトウェアはボランティアのコミュニティによってオープンな場で開発され"
+"、%s ライセンスの元でリリースされています。\n"
+"\n"
+"このソフトウェアがより良くなるよう貢献したりすることができます。"
+
+#: src/gs-license-tile.c:106
+msgid "Proprietary"
+msgstr "プロプライエタリ"
+
+#: src/gs-license-tile.c:113
+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."
+msgstr ""
+"このソフトウェアはオープンな場で開発されていないため、開発者だけがどのように"
+"動作するか把握しています。使用に制限がある場合や、安全なソフトウェアかどうか"
+"判断しづらい場合があるかもしれません。\n"
+"\n"
+"このソフトウェアに貢献したり開発に関わったりすることはできないかもしれません"
+"。"
+
+#: src/gs-license-tile.ui:132
+msgid "_Get Involved"
+msgstr "参加する(_G)"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:62 src/gs-loading-page.c:66
+msgid "Software catalog is being downloaded"
+msgstr "ソフトウェアカタログをダウンロードしています"
+
+#: src/gs-loading-page.ui:7
+msgid "Loading page"
+msgstr "ページを読み込み中"
+
+#: src/gs-loading-page.ui:14
+msgid "Starting up…"
+msgstr "起動中…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-metered-data-dialog.ui:17
+#: src/gs-shell.ui:264
+msgid "Automatic Updates Paused"
+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 ""
+"現在のネットワークは従量制です。従量制課金接続にはデータ量の制限があり、超過"
+"すると追加料金が発生する場合があります。データ量の消費を抑えるため、自動アッ"
+"プデートを一時的に停止しています。\n"
+"\n"
+"制限のないネットワークが利用可能になると、自動アップデートを再開します。それ"
+"までの間、手動でアップデートをインストールすることは可能です。\n"
+"\n"
+"現在のネットワークが従量制に誤認識されてしまっている場合は、設定を変更してみ"
+"てください。"
+
+#: src/gs-metered-data-dialog.ui:53
+msgid "Open Network _Settings"
+msgstr "ネットワーク設定を開く(_S)"
+
+#: src/gs-moderate-page.ui:7
+msgid "Moderate page"
+msgstr "審査ページ"
+
+#: src/gs-moderate-page.ui:87
+msgid "There are no reviews to moderate"
+msgstr "審査するレビューはありません"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-odrs-provider.c:1266
+msgid "Downloading application ratings…"
+msgstr "アプリケーションの評価をダウンロード中…"
+
+#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm"
+#: src/gs-origin-popover-row.c:55
+msgid "Name"
+msgstr "名前"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:72
+msgid "system"
+msgstr "システム"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:75
+msgid "user"
+msgstr "ユーザー"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-origin-popover-row.c:91
+msgid "Channel"
+msgstr "チャンネル"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:96 src/gs-origin-popover-row.ui:93
+msgid "Branch"
+msgstr "ブランチ"
+
+#: src/gs-origin-popover-row.ui:35
+msgid "URL"
+msgstr "URL"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:64
+msgid "Installation"
+msgstr "インストール"
+
+#. Translators: The available version of an app
+#: src/gs-origin-popover-row.ui:122
+msgid "Version"
+msgstr "バージョン"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:271
+msgid "Additions"
+msgstr "追加"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:275
+msgid "Removals"
+msgstr "削除"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gs-os-update-page.c:279 src/gs-shell.ui:339 src/gs-updates-page.c:1356
+msgid "Updates"
+msgstr "アップデート"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:283
+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:607
+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:609
+#, c-format
+msgid ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+msgstr ""
+"%s からの追加のソフトウェアへのアクセスを提供します。プロプライエタリソフト"
+"ウェアがいくつか含まれます。"
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:618 src/gs-repos-dialog.c:198
+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:673 src/gs-shell.ui:306
+msgid "Explore"
+msgstr "探す"
+
+#: src/gs-overview-page.ui:8
+msgid "Overview page"
+msgstr "概要ページ"
+
+#: src/gs-overview-page.ui:40
+msgid "Enable Third Party Software Repositories?"
+msgstr "サードパーティーのソフトウェアリポジトリを有効にしますか?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:175
+msgid "Other Categories"
+msgstr "その他のカテゴリー"
+
+#: src/gs-overview-page.ui:239
+msgid "No Application Data Found"
+msgstr "アプリケーションのデータが見つかりません"
+
+#: lib/gs-plugin-loader.c:3023
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "不明"
+
+#: src/gs-page.c:276
+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:359
+#, 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:498
+#, c-format
+msgid "Are you sure you want to remove the %s repository?"
+msgstr "本当に %s のリポジトリを削除しますか?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:502
+#, c-format
+msgid ""
+"All applications 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
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:510
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "本当に %s をアンインストールしますか?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:513
+#, c-format
+msgid ""
+"%s will be uninstalled, and you will have to install it to use it again."
+msgstr "%s はアンインストールされます。再び使用するにはインストールし直す必要"
+"があります。"
+
+#. Translators: This is the accessibility label for a screenshot.
+#: src/gs-picture.c:391
+msgid "Picture"
+msgstr "写真"
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "アップデート設定"
+
+#: src/gs-prefs-dialog.ui:18
+msgid ""
+"To avoid charges and network caps, software updates are not automatically "
+"downloaded on mobile or metered connections."
+msgstr ""
+"費用の発生や通信容量の減少を避けるため、モバイル接続や従量制課金接続では"
+"ソフトウェアアップデートの自動ダウンロードは行いません。"
+
+#: src/gs-prefs-dialog.ui:22
+msgid "Automatic Updates"
+msgstr "自動アップデート"
+
+#: src/gs-prefs-dialog.ui:23
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"可能ならソフトウェアアップデートをバックグラウンドでダウンロードしてイン"
+"ストールします。"
+
+#: src/gs-prefs-dialog.ui:37
+msgid "Automatic Update Notifications"
+msgstr "自動アップデートの通知"
+
+#: src/gs-prefs-dialog.ui:38
+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:110
+#, 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:23
+msgid "Incompatible Software"
+msgstr "非互換のソフトウェア"
+
+#: src/gs-removal-dialog.ui:36
+msgid "_Continue"
+msgstr "続行(_C)"
+
+#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64"
+#: src/gs-repos-dialog.c:265
+#, c-format
+msgid "Software that has been installed from “%s” will cease to receive updates."
+msgstr ""
+"“%s”からインストールされたソフトウェアはアップデートの受け取りを停止します。"
+
+#: src/gs-repos-dialog.c:274
+msgid "Disable Repository?"
+msgstr "リポジトリを無効にしますか?"
+
+#: src/gs-repos-dialog.c:274
+msgid "Remove Repository?"
+msgstr "リポジトリを削除しますか?"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:280
+msgid "_Disable"
+msgstr "無効(_D)"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:283
+msgid "_Remove"
+msgstr "削除(_R)"
+
+#: src/gs-repos-dialog.c:519
+msgid "Enable New Repositories"
+msgstr "新しいリポジトリを有効にする"
+
+#: src/gs-repos-dialog.c:520
+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:529
+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:534
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr ""
+"選択したサードパーティーからの追加のリポジトリです (%s)。"
+
+#: src/gs-repos-dialog.c:539
+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:676
+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:734
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"これらのリポジトリは %s のデフォルトソフトウェアに不足しているものを補いま"
+"す。"
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:10 src/gs-shell.ui:77 src/gs-update-dialog.ui:10
+msgid "Software Repositories"
+msgstr "ソフトウェアリポジトリ"
+
+#: src/gs-repos-dialog.ui:50
+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:156
+#, c-format
+msgid "%u application installed"
+msgid_plural "%u applications installed"
+msgstr[0] "%u 個のアプリケーションをインストールしました"
+
+#. TRANSLATORS: This string is used to construct the 'X add-ons
+#. installed' sentence, describing a software repository.
+#: src/gs-repo-row.c:163
+#, 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 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:171
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+msgstr[0] "%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-repo-row.c:177
+#, c-format
+msgid "%u add-on"
+msgid_plural "%u add-ons"
+msgstr[0] "%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-repo-row.c:184
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "%s と %s をインストールしました"
+
+#. 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:233
+#, 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:82
+msgid "Hate it"
+msgstr "嫌い"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:86
+msgid "Don’t like it"
+msgstr "好きではない"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:90
+msgid "It’s OK"
+msgstr "まあまあ"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:94
+msgid "Like it"
+msgstr "気に入った"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:98
+msgid "Love it"
+msgstr "とても気に入った"
+
+#. TRANSLATORS: the review can't just be copied and pasted
+#: src/gs-review-dialog.c:120
+msgid "Please take more time writing the review"
+msgstr "もう少し時間を掛けてレビューを書いてください"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:124
+msgid "Please choose a star rating"
+msgstr "評価の点数を選択してください"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:128
+msgid "The summary is too short"
+msgstr "サマリーが短すぎます"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:132
+msgid "The summary is too long"
+msgstr "サマリーが長すぎます"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:136
+msgid "The description is too short"
+msgstr "レビュー内容が短すぎます"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:140
+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:74
+msgid "Rating"
+msgstr "評価"
+
+#: src/gs-review-dialog.ui:110
+msgid "Summary"
+msgstr "サマリー"
+
+#: src/gs-review-dialog.ui:120
+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:145
+msgctxt "app review"
+msgid "Review"
+msgstr "レビュー"
+
+#: src/gs-review-dialog.ui:155
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+"このアプリケーションについてどう思いますか。できれば理由もあわせて書いてくだ"
+"さい。"
+
+#: src/gs-review-dialog.ui:187
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"どのようなデータが送信されるかは<a href=\"https://odrs.gnome.org/privacy\">プ"
+"ライバシーポリシー</a>のページで確認できます。あなたのアカウントの氏名は公開"
+"されます。"
+
+#: 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:100
+msgid "out of 5 stars"
+msgstr " "
+
+#. TRANSLATORS: this is when a user doesn't specify a name
+#: src/gs-review-row.c:58
+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:242
+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:89
+msgid "Was this review useful to you?"
+msgstr "このレビューは役に立ちましたか?"
+
+#: src/gs-review-row.ui:106
+msgid "Yes"
+msgstr "はい"
+
+#: src/gs-review-row.ui:115
+msgid "No"
+msgstr "いいえ"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:124
+msgid "Meh"
+msgstr "どうでもいい"
+
+#: src/gs-review-row.ui:135
+msgid "Report…"
+msgstr "報告する…"
+
+#: src/gs-review-row.ui:148
+msgid "Remove…"
+msgstr "削除する…"
+
+#: src/gs-safety-context-dialog.c:140
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"アプリケーションはサンドボックス化されていないため信頼できるベンダーかどうか"
+"確認が必要"
+
+#: src/gs-safety-context-dialog.c:143
+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:150
+msgid "No Permissions"
+msgstr "権限なし"
+
+#: src/gs-safety-context-dialog.c:151
+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:162
+msgid "Network Access"
+msgstr "ネットワークアクセス"
+
+#: src/gs-safety-context-dialog.c:163
+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:166
+msgid "No Network Access"
+msgstr "ネットワークアクセスなし"
+
+#: src/gs-safety-context-dialog.c:167
+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:173
+msgid "Uses System Services"
+msgstr "システムサービスの使用"
+
+#: src/gs-safety-context-dialog.c:174
+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:181
+msgid "Uses Session Services"
+msgstr "セッションサービスの使用"
+
+#: src/gs-safety-context-dialog.c:182
+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:189
+msgid "Device Access"
+msgstr "デバイスアクセス"
+
+#: src/gs-safety-context-dialog.c:190
+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:193
+msgid "No Device Access"
+msgstr "デバイスアクセスなし"
+
+#: src/gs-safety-context-dialog.c:194
+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:200
+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:208
+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:216
+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:228
+msgid "Full File System Read/Write Access"
+msgstr "ファイルシステムの完全な読み取り/書き込みアクセス"
+
+#: src/gs-safety-context-dialog.c:229
+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:237
+msgid "Home Folder Read/Write Access"
+msgstr "ホームフォルダーの読み取り/書き込みアクセス"
+
+#: src/gs-safety-context-dialog.c:238
+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:246
+msgid "Full File System Read Access"
+msgstr "ファイルシステムの完全な読み取りアクセス"
+
+#: src/gs-safety-context-dialog.c:247
+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:256
+msgid "Home Folder Read Access"
+msgstr "ホームフォルダーの読み取りアクセス"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Download Folder Read/Write Access"
+msgstr "ダウンロードフォルダーの読み取り/書き込みアクセス"
+
+#: src/gs-safety-context-dialog.c:267
+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:278
+msgid "Download Folder Read Access"
+msgstr "ダウンロードフォルダーの読み取りアクセス"
+
+#: src/gs-safety-context-dialog.c:279
+msgid "Can read 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:292
+msgid "No File System Access"
+msgstr "ファイルシステムアクセスなし"
+
+#: src/gs-safety-context-dialog.c:293
+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:307
+msgid "Proprietary Code"
+msgstr "プロプライエタリコード"
+
+#: src/gs-safety-context-dialog.c:308
+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:311
+msgid "Auditable Code"
+msgstr "監査可能コード"
+
+#: src/gs-safety-context-dialog.c:312
+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:320
+msgid "App developer is verified"
+msgstr "アプリ開発者は認証済み"
+
+#: src/gs-safety-context-dialog.c:321
+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:333
+msgid "Insecure Dependencies"
+msgstr "安全でない依存関係"
+
+#: src/gs-safety-context-dialog.c:334
+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:330
+#, 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:337
+#, 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:344
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s は安全ではありません"
+
+#. Translators: This is the title of the dialog which contains information about the permissions of an app
+#: src/gs-safety-context-dialog.ui:9
+msgid "Safety"
+msgstr "安全性"
+
+#: src/gs-safety-context-dialog.ui:146
+msgid "License"
+msgstr "ライセンス"
+
+#: src/gs-safety-context-dialog.ui:232
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:212
+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:41
+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:82
+msgid "Next Screenshot"
+msgstr "次のスクリーンショット"
+
+#: src/gs-screenshot-carousel.ui:150
+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:345
+msgid "Screenshot not found"
+msgstr "スクリーンショットが見つかりませんでした"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:362
+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:504
+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:585
+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:595
+msgid "Screenshot not valid"
+msgstr "スクリーンショットは無効です"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:615
+msgid "Screenshot not available"
+msgstr "スクリーンショットは利用できません"
+
+#: src/gs-screenshot-image.c:694
+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:172
+#, 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:17
+msgid "Search for Apps"
+msgstr "アプリを検索"
+
+#: src/gs-search-page.ui:39
+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:1155 src/gs-shell.c:1160 src/gs-shell.c:1175
+#: src/gs-shell.c:1179
+#, 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:1238
+#, 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:1225
+#, 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:1231
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s からアップデートをダウンロードできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1238 src/gs-shell.c:1283
+msgid "Unable to download updates"
+msgstr "アップデートをダウンロードできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1244
+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:1253
+#, 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:1258
+msgid "Unable to download updates: not enough disk space"
+msgstr "アップデートをダウンロードできません: 十分なディスク領域がありません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1265
+msgid "Unable to download updates: authentication was required"
+msgstr "アップデートをダウンロードできません: 認証が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1270
+msgid "Unable to download updates: authentication was invalid"
+msgstr "アップデートをダウンロードできません: 認証できませんでした"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1275
+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:1286
+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:1328
+#, c-format
+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:1334
+#, c-format
+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:1347
+#, c-format
+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:1353
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "サポートしていないため %s をインストールできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1360
+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:1366
+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:1371
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "%s をインストールできません: 十分なディスク領域がありません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1378
+#, c-format
+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:1385
+#, c-format
+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:1392
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1400
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "%s をインストールできません: AC 電源が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1407
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "%s をインストールできません: バッテリー残量に余裕がありません"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1416
+#, c-format
+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:1462
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+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:1469
+#, c-format
+msgid "Unable to update %s as 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:1476
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"%s からのダウンロードに失敗したためアップデートをインストールできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1480
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "ダウンロードに失敗したためアップデートをインストールできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1486
+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:1496
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "%s をアップデートできません: 十分なディスク領域がありません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1501
+#, 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:1511
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "%s をアップデートできません: 認証が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1516
+#, 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:1525
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "%s をアップデートできません: 認証できませんでした"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1530
+#, 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:1539
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr ""
+"%s をアップデートできません: ソフトウェアをアップデートする権限がありません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1545
+#, 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:1555
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "%s をアップデートできません: AC 電源が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "アップデートをインストールできません: AC 電源が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1570
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1576
+#, 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:1587
+#, c-format
+msgid "Unable to update %s"
+msgstr "%s をアップデートできません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1590
+#, 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:1632
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+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:1637
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1646
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1655
+#, c-format
+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:1663
+#, c-format
+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:1670
+#, c-format
+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:1677
+#, c-format
+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:1684
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "%s にアップグレードできません: AC 電源が必要です"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1691
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1700
+#, c-format
+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:1737
+#, c-format
+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:1743
+#, c-format
+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:1749
+#, c-format
+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:1756
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "%s を削除できません: AC 電源が必要です"
+
+#. 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: The battery level is too low"
+msgstr "%s を削除できません: バッテリー残量に余裕がありません"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1775
+#, c-format
+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:1817
+#, 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:1824 src/gs-shell.c:1875 src/gs-shell.c:1916
+#: src/gs-shell.c:1961
+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:1835 src/gs-shell.c:1886 src/gs-shell.c:1927
+#: src/gs-shell.c:1985
+msgid "Sorry, something went wrong"
+msgstr "問題が発生しました"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1867
+msgid "Failed to install file: not supported"
+msgstr "ファイルのインストールに失敗しました: サポートしていません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1871
+msgid "Failed to install file: authentication failed"
+msgstr "ファイルのインストールに失敗しました: 認証できませんでした"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1908
+msgid "Failed to install: not supported"
+msgstr "インストールに失敗しました: サポートしていません"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1912
+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:1955
+#, c-format
+msgid "Unable to contact %s"
+msgstr "%s に接続できません"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1967
+msgid "Software needs to be restarted to use new plugins."
+msgstr "新しいプラグインを使用するには“ソフトウェア”を再起動する必要があります。"
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1972
+msgid "AC power is required"
+msgstr "AC 電源が必要です"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1976
+msgid "The battery level is too low"
+msgstr "バッテリー残量に余裕がありません"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "ソフトウェアリポジトリ(_S)"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "アップデート設定(_U)"
+
+#: src/gs-shell.ui:21 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "ソフトウェア"
+
+#. button in the info bar
+#: src/gs-shell.ui:86
+msgid "Examine Disk"
+msgstr "ディスクを確認"
+
+#. button in the info bar
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-shell.ui:95 src/gs-updates-page.c:906
+msgid "Network Settings"
+msgstr "ネットワーク設定"
+
+#. button in the info bar
+#: src/gs-shell.ui:104
+msgid "Restart Now"
+msgstr "再起動"
+
+#. button in the info bar
+#: src/gs-shell.ui:113
+msgid "More Information"
+msgstr "詳細情報"
+
+#: src/gs-shell.ui:168
+msgid "Search"
+msgstr "検索"
+
+#: src/gs-shell.ui:194
+msgid "Primary Menu"
+msgstr "プライマリーメニュー"
+
+#: src/gs-shell.ui:284
+msgid "Find Out _More"
+msgstr "詳細を確認(_M)"
+
+#. 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:93
+msgid "None"
+msgstr "なし"
+
+#: src/gs-storage-context-dialog.c:132
+msgid "Application Data"
+msgstr "アプリケーションデータ"
+
+#: src/gs-storage-context-dialog.c:133
+msgid "Data needed for the application to run"
+msgstr "アプリケーション実行に必要なデータ"
+
+#: src/gs-storage-context-dialog.c:137
+msgid "User Data"
+msgstr "ユーザーデータ"
+
+#: src/gs-storage-context-dialog.c:138
+msgid "Data created by you in the application"
+msgstr "アプリケーションが作成したデータ"
+
+#: src/gs-storage-context-dialog.c:144
+msgid "Cache Data"
+msgstr "キャッシュデータ"
+
+#: src/gs-storage-context-dialog.c:145
+msgid "Temporary cached data"
+msgstr "一時的にキャッシュされたデータ"
+
+#: src/gs-storage-context-dialog.c:161
+msgid "The application itself"
+msgstr "アプリケーション自体"
+
+#: src/gs-storage-context-dialog.c:165
+msgid "Required Dependencies"
+msgstr "必要な依存関係"
+
+#: src/gs-storage-context-dialog.c:166
+msgid "Shared system components required by this application"
+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:9
+msgid "Storage"
+msgstr "ストレージ"
+
+#. Translators: Please do not translate the markup or link href
+#: src/gs-storage-context-dialog.ui:117
+msgid ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"キャッシュされたデータは <a href=\"dummy\">アプリケーション設定(_A)</a> から消"
+"去できます。"
+
+#: src/gs-summary-tile.c:74
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (インストール済み)"
+
+#: src/gs-summary-tile.c:79
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (インストール中)"
+
+#: src/gs-summary-tile.c:84
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (削除中)"
+
+#. 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:122
+#, c-format
+msgid "Installed on %s"
+msgstr "%s にインストール済み"
+
+#. TRANSLATORS: this is the title of the installed updates dialog window
+#: src/gs-update-dialog.c:142
+msgid "Installed Updates"
+msgstr "インストール済みのアップデート"
+
+#: src/gs-update-dialog.ui:70
+msgid "No updates have been installed on this system."
+msgstr "このシステムにインストールされたアップデートはありません。"
+
+#: src/gs-update-monitor.c:210
+msgid "Software Updates Are Out of Date"
+msgstr "ソフトウェアアップデートが古くなっています"
+
+#: src/gs-update-monitor.c:211
+msgid "Please check for software updates."
+msgstr "ソフトウェアアップデートを確認してください。"
+
+#: src/gs-update-monitor.c:217
+msgid "Critical Software Update Ready to Install"
+msgstr "重要なソフトウェアアップデートのインストール準備完了"
+
+#: src/gs-update-monitor.c:218
+msgid "An important software update is ready to be installed."
+msgstr ""
+"重要なソフトウェアアップデートをインストールする準備ができました。"
+
+#: src/gs-update-monitor.c:221
+msgid "Critical Software Updates Available to Download"
+msgstr "重要なソフトウェアアップデートがダウンロード可能"
+
+#: src/gs-update-monitor.c:222
+msgid "Important: critical software updates are waiting."
+msgstr "注意: 重要なソフトウェアアップデートが待機中です。"
+
+#: src/gs-update-monitor.c:230
+msgid "Software Updates Ready to Install"
+msgstr "ソフトウェアアップデートのインストール準備完了"
+
+#: src/gs-update-monitor.c:231
+msgid "Software updates are waiting and ready to be installed."
+msgstr "ソフトウェアアップデートをインストールする準備ができており待機中です。"
+
+#: src/gs-update-monitor.c:236
+msgid "Software Updates Available to Download"
+msgstr "ソフトウェアアップデートがダウンロード可能"
+
+#: src/gs-update-monitor.c:237
+msgid "Please download waiting software updates."
+msgstr "待機中のソフトウェアアップデートをダウンロードしてください。"
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:343
+#, c-format
+msgid "%u Application Updated — Restart Required"
+msgid_plural "%u Applications Updated — Restart Required"
+msgstr[0] "%u 個のアプリケーションをアップデートしました — 再起動が必要です"
+
+#. TRANSLATORS: apps were auto-updated
+#: src/gs-update-monitor.c:349
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u 個のアプリケーションをアップデートしました"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:360
+#, c-format
+msgid "%s has been updated."
+msgstr "%s をアップデートしました。"
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:363
+msgid "Please restart the application."
+msgstr "アプリケーションを再起動してください。"
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:371
+#, c-format
+msgid "%s and %s have been updated."
+msgstr "%s と %s をアップデートしました。"
+
+#. TRANSLATORS: at least one application needs restarting
+#: src/gs-update-monitor.c:377 src/gs-update-monitor.c:396
+#, c-format
+msgid "%u application requires a restart."
+msgid_plural "%u applications require a restart."
+msgstr[0] "%u 個のアプリケーションは再起動が必要です。"
+
+#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox
+#: src/gs-update-monitor.c:389
+#, c-format
+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:656 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:658
+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:713
+#, 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:717
+msgid "Software Upgrade Available"
+msgstr "アップグレードが利用可能です"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1114
+msgid "Software Updates Failed"
+msgstr "ソフトウェアのアップデートに失敗しました"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:1116
+msgid "An important operating system update failed to be installed."
+msgstr "重要なオペレーティングシステムアップデートのインストールに失敗しました。"
+
+#: src/gs-update-monitor.c:1117
+msgid "Show Details"
+msgstr "詳細を表示"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1140
+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:1145
+#, c-format
+msgid "Welcome to %s %s!"
+msgstr "%s %s へようこそ!"
+
+#. TRANSLATORS: title when we've done offline updates
+#: src/gs-update-monitor.c:1151
+msgid "Software Update Installed"
+msgid_plural "Software Updates Installed"
+msgstr[0] "ソフトウェアアップデートをインストールしました"
+
+#. TRANSLATORS: message when we've done offline updates
+#: src/gs-update-monitor.c:1155
+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 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:1166
+msgctxt "updates"
+msgid "Review"
+msgstr "確認"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1215
+msgid "Failed To Update"
+msgstr "アップデートに失敗しました"
+
+#. TRANSLATORS: the user must have updated manually after
+#. * the updates were prepared
+#: src/gs-update-monitor.c:1221
+msgid "The system was already up to date."
+msgstr "システムは最新です。"
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1226
+msgid "The update was cancelled."
+msgstr "このアップデートをキャンセルしました。"
+
+#. TRANSLATORS: the package manager needed to download
+#. * something with no network available
+#: src/gs-update-monitor.c:1232
+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:1238
+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:1244
+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:1249
+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:251
+#, c-format
+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:576
+#, 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:581
+msgid "Your operating system is no longer supported."
+msgstr "お使いのオペレーティングシステムはサポートが終了しています。"
+
+#. TRANSLATORS: EOL distros do not get important updates
+#: src/gs-updates-page.c:586
+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:590
+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:874
+msgid "Charges May Apply"
+msgstr "料金が掛かる可能性があります"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:878
+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:882
+msgid "Check _Anyway"
+msgstr "確認する(_A)"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:898
+msgid "No Network"
+msgstr "ネットワークがありません"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:902
+msgid "Internet access is required to check for updates."
+msgstr "アップデートを確認するにはインターネットにアクセスする必要があります。"
+
+#: src/gs-updates-page.c:1290
+msgid "Checking…"
+msgstr "確認中…"
+
+#: src/gs-updates-page.c:1313
+msgid "Check for updates"
+msgstr "アップデートを確認"
+
+#: src/gs-updates-page.ui:7
+msgid "Updates page"
+msgstr "アップデートページ"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:96
+msgid "Loading Updates…"
+msgstr "アップデート読み込み中…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:110
+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:222
+msgid "Up to Date"
+msgstr "最新です"
+
+#: src/gs-updates-page.ui:263
+msgid "Use Mobile Data?"
+msgstr "モバイルデータを使用しますか?"
+
+#: src/gs-updates-page.ui:264
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr "モバイル接続でのアップデートの確認は費用が発生する場合があります。"
+
+#: src/gs-updates-page.ui:267
+msgid "_Check Anyway"
+msgstr "とにかく確認する(_C)"
+
+#: src/gs-updates-page.ui:282
+msgid "No Connection"
+msgstr "接続なし"
+
+#: src/gs-updates-page.ui:283
+msgid "Go online to check for updates."
+msgstr "アップデートの確認のためにオンライン接続してください。"
+
+#: src/gs-updates-page.ui:286
+msgid "_Network Settings"
+msgstr "ネットワーク設定(_N)"
+
+#: src/gs-updates-page.ui:312
+msgid "Error"
+msgstr "エラー"
+
+#: src/gs-updates-page.ui:313
+msgid "Updates are automatically managed."
+msgstr "アップデートは自動的に管理されます。"
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:334
+msgid "Restart & Update"
+msgstr "再起動してアップデート"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:340
+msgid "Update All"
+msgstr "すべてアップデート"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:481
+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:486
+msgid "Requires Restart"
+msgstr "再起動が必要です"
+
+#. TRANSLATORS: This is the header for online runtime and
+#. * app updates, typically flatpaks or snaps
+#: src/gs-updates-section.c:491
+msgid "Application Updates"
+msgstr "アプリケーションのアップデート"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:496
+msgid "Device Firmware"
+msgstr "デバイスファームウェア"
+
+#: src/gs-updates-section.ui:36 src/gs-upgrade-banner.ui:78
+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:86
+#, 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:93
+#, c-format
+msgid "%s Available"
+msgstr "%s が利用可能です"
+
+#: src/gs-upgrade-banner.c:131
+msgid "Learn about the new version"
+msgstr "新しいバージョンについて確認する"
+
+#: src/gs-upgrade-banner.c:151
+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:169
+#, 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:173
+#, 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:213
+msgid "_Restart & Upgrade"
+msgstr "再起動してアップグレード(_R)"
+
+#: src/gs-upgrade-banner.ui:230
+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 ""
+"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: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: 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:56
+msgid "OS Updates"
+msgstr "OS のアップデート"
+
+#. TRANSLATORS: this is a longer description of the
+#. * "OS Updates" string
+#: plugins/core/gs-plugin-generic-updates.c:61
+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:560
+msgid "Endless OS"
+msgstr "Endless OS"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:563
+msgid "An Endless OS update with new features and fixes."
+msgstr "新機能やバグ修正を含んだ Endless OS のアップデートです。"
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:824
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS アップデートサービスのアップデート取得と適用ができませんでした。"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:195
+msgid "Downloading upgrade information…"
+msgstr "アップグレード情報をダウンロード中…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:314
+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 ""
+"Flatpak は Linux 上のデスクトップアプリケーション向けフレームワークです"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1160
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "%s の Flatpak メタデータを取得中…"
+
+#: plugins/flatpak/gs-flatpak.c:3164
+#, c-format
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr "アドオン‘%s’のリファインに失敗しました: %s"
+
+#: plugins/flatpak/gs-flatpak-utils.c:95
+msgid "User Installation"
+msgstr "ユーザーインストール"
+
+#: plugins/flatpak/gs-flatpak-utils.c:95
+msgid "System Installation"
+msgstr "システムインストール"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:821
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:835
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %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 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:140
+#, 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:145
+#, c-format
+msgid "%s Embedded Controller Update"
+msgstr "%s Embedded Controller のアップデート"
+
+#. 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 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:155
+#, c-format
+msgid "%s Corporate ME Update"
+msgstr "%s Corporate 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:160
+#, c-format
+msgid "%s Consumer ME Update"
+msgstr "%s Consumer 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:166
+#, 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:172
+#, 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:177
+#, 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:182
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s の設定のアップデート"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:186
+#, 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:191
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s カメラのアップデート"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:195
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM のアップデート"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:199
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s タッチパッドのアップデート"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:203
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s マウスのアップデート"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:207
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 ストレージコントローラーのアップデート"
+
+#. 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 ネットワークインターフェースのアップデート"
+
+#. 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 ディスプレイのアップデート"
+
+#. 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 のアップデート"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:716
+msgid "Downloading firmware update signature…"
+msgstr "ファームウェアアップデートの署名をダウンロード中…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:758
+msgid "Downloading firmware update metadata…"
+msgstr "ファームウェアアップデートのメタデータをダウンロード中…"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1180
+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:146
+msgid "Install Unsigned Software?"
+msgstr "署名なしのソフトウェアをインストールしますか?"
+
+#: plugins/packagekit/gs-packagekit-task.c:147
+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:151
+msgid "Download Unsigned Software?"
+msgstr "署名なしのソフトウェアをダウンロードしますか?"
+
+#: plugins/packagekit/gs-packagekit-task.c:152
+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:156
+msgid "Update Unsigned Software?"
+msgstr "署名なしのソフトウェアをアップデートしますか?"
+
+#: plugins/packagekit/gs-packagekit-task.c:157
+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:301
+msgid "Packages"
+msgstr "パッケージ"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2225
+msgid "Operating System (OSTree)"
+msgstr "オペレーティングシステム (OSTree)"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:239
+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 "Select All"
+#~ msgstr "すべて選択"
+
+#~ msgid "Select None"
+#~ msgstr "すべて解除"
+
+#~ msgid "_Installed"
+#~ msgstr "インストール済み(_I)"
+
+#~ msgid "_Updates"
+#~ msgstr "アップデート(_U)"
+
+#~ msgid "Remove"
+#~ 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 "Unknown Software License"
+#~ 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 "Are you sure you want to remove %s?"
+#~ msgstr "本当に %s を削除しますか?"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "“%s”を削除しますか?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "“%s”を無効にしますか?"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "追加のリポジトリはありません"
+
+#~ msgid "_Enable"
+#~ msgstr "有効(_E)"
+
+#~ 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 "Restart & Install"
+#~ 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, %R"
+#~ msgstr "昨日 %H:%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 をダウンロード中"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ 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 "Reference"
+#~ 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 "OS Upgrade"
+#~ msgstr "OS アップグレード"
+
+#~ 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 "Unable to purchase %s"
+#~ 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..456954b
--- /dev/null
+++ b/po/ka.po
@@ -0,0 +1,5118 @@
+# Georgian translation for gnome-software.
+# Copyright (C) 2022 gnome-software authors
+# This file is distributed under the same license as the gnome-software package.
+# Ekaterine Papava <papava.e@gtu.ge>, 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: 2022-12-09 22:05+0000\n"
+"PO-Revision-Date: 2022-12-26 07:58+0100\n"
+"Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\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.2.2\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:2099
+#: src/gs-application.c:256
+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 ""
+
+#: 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: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 ""
+
+#. 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: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 "%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:1027
+#, 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:1031
+#, 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 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 თინეიჯერებს შეეფერება"
+
+#. 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 ზრდასრულებს შეეფერება"
+
+#. 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 %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 "ასაკის რეიტინგი"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "სიახლე ვერსიაში %s"
+
+#: 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 "FILENAME"
+
+#: 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 ""
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "მთარგმნელის შესახებ"
+
+#. 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 "პროგრამის შესახებ"
+
+#. 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 ""
+
+#: 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 "გადმოწერის ზომა"
+
+#: 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 "წყარო: %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 "სახელი გადაერქვა %s-დან"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "დაგვეხმარეთ, ვთარგმნოთ %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 "თარგმანები"
+
+#: 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 "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 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 ახლა დაყენებულია"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 მოწოდებულია “%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 "აღარ გამაფრთხილო"
+
+#. 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] "განახლებდა დადგა"
+
+#. 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] "აპლიკაციები წაიშალა"
+
+#. 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] "ცვლილებების ძალაში შესასვლელად საჭიროა გადატვირთვა."
+
+#. 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] "%d წუთის წინ"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d საათის წინ"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d დღის წინ"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d კვირის წინ"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d თვის წინ"
+
+#: src/gs-common.c:891
+#, 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: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 "აპლიკაცია"
+
+#. 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: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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_დაყენება"
+
+#: src/gs-details-page.c:889
+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:913
+msgid "_Install…"
+msgstr "_დაყენება…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr "სხვა აპები %s-სგან"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+msgid "You need internet access to write a review"
+msgstr "მიმოხილვის დასაწერად ინტერნეტთან წვდომა გჭირდებათ"
+
+#: src/gs-details-page.c:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "\"%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 "დაგვეხმარეთ, ვთარგმნოთ"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_შეფასების დაწერა"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] ""
+
+#. 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] "%s-სთვის ხელმისაწვდომი პროგრამები"
+
+#: 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 "%s ნაპოვნი არაა"
+
+#. 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 "%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: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] ""
+
+#. 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] ""
+
+#: 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 ფაილის ფორმატი"
+
+#: 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 "%s ალბათ იმუშავებს ამ მოწყობილობაზე"
+
+#. 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 მუშაობს ამ მოწყობილობაზე"
+
+#. 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 ალბათ ამ მოწყობილობაზე სწორად არ იმუშავებს"
+
+#. 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 ამ მოწყობილობაზე არ იმუშავებს"
+
+#. 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 <a href=\"%s\">%s license</a>.\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:2837
+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 "დარწმუნებული ბრძანდებით, რომ გნებავთ, წაშალოთ %s რეპოზიტორია?"
+
+#. 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 "დარწმუნებული ბრძანდებით, რომ გნებავთ, წაშალოთ %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 "განახლების მორგება"
+
+#: 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 "მესამე პირების მიერ მოწოდებული რეპოზიტორიები 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: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] "%u პროგრამა დაყენებულია"
+
+#. 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 დამატება დაყენებულია"
+
+#. 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 აპლიკაცია"
+
+#. 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 დამატება"
+
+#. 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 და %s დაყენებულია"
+
+#. 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 "ვერ ვიტან"
+
+#. 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. 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:93
+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: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 "%s პოტენციურად სახიფათოა"
+
+#. 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 სახიფათოა"
+
+#. 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 "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 "შემდეგი ეკრანის ანაბეჭდი"
+
+#: 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] "კიდევ %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 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 "%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 "%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 "განახლებების გადმოწერის შეცდომა"
+
+#. 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 ""
+"%s-დან განახლებების გადმოწერის შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი "
+"არაა"
+
+#. 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 "%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: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 "%s-ის დაყენების შეცდომა: ის მხარდაუჭერელია"
+
+#. 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 "%s-ის დაყენების შეცდომა: დისკზე თავისუფალი ადგილი საკმარისი არაა"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "%s-ის დაყენების შეცდომა: ელემენტის მუხტი მეტისმეტად მცირეა"
+
+#. 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 "%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 ""
+
+#. 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 "%s-ის განახლების შეცდომა"
+
+#. 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: 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 ""
+
+#. 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 ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "ფაილის დაყენების შეცდომა: მხარდაუჭერელია"
+
+#. 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 "დაყენების შეცდომა: ავთენტიკაციის შეცდომა"
+
+#. 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 "%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 "ელემენტის მუხტი მეტისმეტად მცირეა"
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (დაყენებული)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (დაყენება)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (წაშლა)"
+
+#. 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 "დაყენებულია %s-ზე"
+
+#: 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] "%u აპი განახლდა -- გადატვირთვა აუცილებელია"
+
+#. 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 აპი განახლდა"
+
+#. 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] ""
+
+#. 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 "კეთილი იყოს თქვენი მობრძანება %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] "პროგრამის განახლებები დაყენებულია"
+
+#. 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] ""
+
+#. 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 "ბოლო შემოწმება: %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 ""
+
+#: 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 "%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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s ხელმისაწვდომია"
+
+#: 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 "%s/%s გადმოწერილია"
+
+#. 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%% გადმოწერილია"
+
+#: 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 "GNOME ვები"
+
+#: 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 "სისტემური საქაღალდე %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "საწყისი ქვესაქაღალდე %s"
+
+#: 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 "სამუშაო მაგიდის ქვესაქაღალდე %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "დოკუმენტების საქაღალდე"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "დოკუმენტების ქვესაქაღალდე %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "მუსიკის საქაღალდე"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "მუსიკის საქაღალდე: %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "სურთების საქაღალდე"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "სურათების ქვესაქაღალდე %s"
+
+#: 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 "საჯარო გაზიარების ქვესაქაღალდე %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "ვიდეოების საქაღალდე"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "ვიდეოების ქვესაქაღალდე %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "შაბლონების საქაღალდე"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "შაბლონების ქვესაქაღალდე %s"
+
+#: 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 "მომხმარებლის ქეშის ქვესაქაღალდე %s"
+
+#: 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 "მომხმარებლის კონფიგურაციის ქვესაქაღალდე %s"
+
+#: 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 "მომხმარებლის მონაცემების ქვესაქაღალდე %s"
+
+#: 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 "ფაილური სისტემის წვდომა %s-ზე"
+
+#. 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:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr ""
+
+#: 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 ""
+
+#. 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 მოწყობილობის განახლება"
+
+#. 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 სისტემის განახლება"
+
+#. 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 ჩადგმული კონტროლერის განახლება"
+
+#. 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-ის განახლება"
+
+#. 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-ის განახლება"
+
+#. 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-ის განახლება"
+
+#. 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 კონტროლერის განახლება"
+
+#. 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 კონტროლერის განახლება"
+
+#. 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 CPU მიკროკოდის განახლება"
+
+#. 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 კონფიგურაციის განახლება"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s კამერის განახლება"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM განახლება"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s თაჩპედის განახლება"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s თაგუნას განახლება"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 საცავის კონტროლერის განახლება"
+
+#. 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 ქსელის ინტერფეისის განახლება"
+
+#. 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 ეკრანის განახლება"
+
+#. 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 -ის განახლება"
+
+#. 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 "%s USB მიმღების განახლება"
+
+#: 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:2696
+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 ლინუქსის უნივერსალური პაკეტია"
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Name"
+#~ msgstr "სახელი"
+
+#~ msgid "system"
+#~ 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..b808d42
--- /dev/null
+++ b/po/kab.po
@@ -0,0 +1,4211 @@
+# 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 <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2020-10-01 07:23+0000\n"
+"PO-Revision-Date: 2020-11-10 14:53+0100\n"
+"Language-Team: \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.4.1\n"
+"Last-Translator: Slimane Selyan Amiri <selyan.kab@protonmail.com>\n"
+"Language: kab\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:1524
+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 "Tout sélectionner"
+
+#: 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 "Aseɣẓan"
+
+#: src/gnome-software.ui:64 src/gs-update-dialog.ui:20
+msgid "Go back"
+msgstr "Uɣal ɣer deffir"
+
+#. 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 "Rechercher"
+
+#. 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:294 src/gs-details-page.ui:886
+msgid "Source"
+msgstr "Source"
+
+#. 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 "Ikufan n useɣzan"
+
+#. 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:922
+msgid "Network Settings"
+msgstr "Iɣewwaṛen n uẓeṭṭa"
+
+#. 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 "Ugar n isallen"
+
+#: 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:4559
+msgid "Local file"
+msgstr ""
+
+#: lib/gs-app.c:4611
+msgid "Package"
+msgstr "Paquet"
+
+#: src/gs-app-addon-row.c:83 src/gs-app-row.c:401
+msgid "Pending"
+msgstr "Yegguni"
+
+#: src/gs-app-addon-row.c:89 src/gs-app-row.ui:163 src/gs-app-tile.ui:51
+#: src/gs-feature-tile.c:88
+msgid "Installed"
+msgstr "Yettwasbedd"
+
+#. 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:93 src/gs-app-row.c:172 src/gs-details-page.c:351
+#: src/gs-third-party-repo-row.c:100
+msgid "Installing"
+msgstr "Asebded"
+
+#. 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:97 src/gs-app-row.c:178 src/gs-repo-row.c:126
+#: src/gs-third-party-repo-row.c:107
+msgid "Removing"
+msgstr "Tukksa"
+
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:110
+msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"
+msgstr ""
+
+#: src/gs-application.c:110
+msgid "MODE"
+msgstr ""
+
+#: src/gs-application.c:112
+msgid "Search for applications"
+msgstr ""
+
+#: src/gs-application.c:112
+msgid "SEARCH"
+msgstr ""
+
+#: src/gs-application.c:114
+msgid "Show application details (using application ID)"
+msgstr ""
+
+#: src/gs-application.c:114 src/gs-application.c:118
+msgid "ID"
+msgstr "ID"
+
+#: src/gs-application.c:116
+msgid "Show application details (using package name)"
+msgstr ""
+
+#: src/gs-application.c:116
+msgid "PKGNAME"
+msgstr ""
+
+#: src/gs-application.c:118
+msgid "Install the application (using application ID)"
+msgstr ""
+
+#: src/gs-application.c:120
+msgid "Open a local package file"
+msgstr ""
+
+#: src/gs-application.c:120
+msgid "FILENAME"
+msgstr "ISEM N UFAYLU"
+
+#: src/gs-application.c:122
+msgid ""
+"The kind of interaction expected for this action: either ‘none’, ‘notify’, "
+"or ‘full’"
+msgstr ""
+
+#: src/gs-application.c:125
+msgid "Show verbose debugging information"
+msgstr ""
+
+#: src/gs-application.c:127
+msgid "Installs any pending updates in the background"
+msgstr ""
+
+#: src/gs-application.c:129
+msgid "Show update preferences"
+msgstr ""
+
+#: src/gs-application.c:131
+msgid "Quit the running instance"
+msgstr ""
+
+#: src/gs-application.c:133
+msgid "Prefer local file sources to AppStream"
+msgstr ""
+
+#: src/gs-application.c:135
+msgid "Show version number"
+msgstr ""
+
+#: src/gs-application.c:328
+msgid "translator-credits"
+msgstr ""
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:333 src/gs-shell.c:2123
+msgid "About Software"
+msgstr ""
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:336
+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:564
+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:127
+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:132
+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:139 src/gs-updates-section.c:479
+msgid "Cancel"
+msgstr "Sefsex"
+
+#. 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:146 src/gs-common.c:288 src/gs-page.c:334
+msgid "Install"
+msgstr "Sebdeed"
+
+#. TRANSLATORS: this is a button in the updates panel
+#. * that allows the app to be easily updated live
+#: src/gs-app-row.c:153
+msgid "Update"
+msgstr "Mettre à jour"
+
+#. 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:157 src/gs-app-row.c:166 src/gs-page.c:492
+#: src/gs-repos-dialog.c:326
+msgid "Remove"
+msgstr "Supprimer"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:284
+msgid "Device cannot be used during update."
+msgstr ""
+
+#: src/gs-app-row.c:459 src/gs-update-dialog.ui:182
+msgid "Requires additional permissions"
+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:10
+msgid "Login Required"
+msgstr ""
+
+#: src/gs-basic-auth-dialog.ui:19 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 "Sefsex (_C)"
+
+#: src/gs-basic-auth-dialog.ui:39
+msgid "_Login"
+msgstr ""
+
+#: src/gs-basic-auth-dialog.ui:99
+msgid "_User"
+msgstr ""
+
+#: src/gs-basic-auth-dialog.ui:119
+msgid "_Password"
+msgstr "_Awal uffir"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:178
+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:183
+msgid "All"
+msgstr "Tous"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: lib/gs-category.c:187
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#. 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:453
+#, c-format
+msgid "Featured %s"
+msgstr ""
+
+#. 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 "Tazmilt"
+
+#. 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:59
+msgid "Name"
+msgstr "Isem"
+
+#. 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 "Sken"
+
+#: 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 "Asmizzwer"
+
+#: src/gs-category-page.ui:175
+msgid "Subcategories sorting menu"
+msgstr ""
+
+#. TRANSLATORS: the user isn't reading the question
+#: lib/gs-cmd.c:191
+#, 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:254
+msgid "Choose an application:"
+msgstr ""
+
+#. TRANSLATORS: this is the summary of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:124
+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:127
+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:132 src/gs-common.c:146
+#, 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:136 src/gs-common.c:150
+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:140
+msgid "Application is ready to be used."
+msgstr ""
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:160 src/gs-common.c:650
+msgid "Restart"
+msgstr "Ales tanekra"
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:164
+msgid "Launch"
+msgstr "Sker"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222
+msgid "Install Third-Party Software?"
+msgstr ""
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:226 src/gs-repos-dialog.c:235
+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:242
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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:252
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr ""
+
+#: src/gs-common.c:261
+msgid "This software repository must be enabled to continue installation."
+msgstr ""
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:271
+#, 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:277
+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:284
+msgid "Don’t Warn Again"
+msgstr ""
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:293
+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:452
+msgid "Detailed errors from the package manager follow:"
+msgstr ""
+
+#: src/gs-common.c:471 src/gs-details-page.ui:447
+msgid "Details"
+msgstr "Talqayt"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-common.c:636
+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:641
+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:648 src/gs-update-monitor.c:123
+msgid "Not Now"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:61
+msgid "No cartoon violence"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:63
+msgid "Cartoon characters in unsafe situations"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:65
+msgid "Cartoon characters in aggressive conflict"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:67
+msgid "Graphic violence involving cartoon characters"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:72
+msgid "No fantasy violence"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:74
+msgid "Characters in unsafe situations easily distinguishable from reality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:76
+msgid "Characters in aggressive conflict easily distinguishable from reality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:78
+msgid "Graphic violence easily distinguishable from reality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:83
+msgid "No realistic violence"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:85
+msgid "Mildly realistic characters in unsafe situations"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:87
+msgid "Depictions of realistic characters in aggressive conflict"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:89
+msgid "Graphic violence involving realistic characters"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:94
+msgid "No bloodshed"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:96
+msgid "Unrealistic bloodshed"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:98
+msgid "Realistic bloodshed"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:100
+msgid "Depictions of bloodshed and the mutilation of body parts"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:105
+msgid "No sexual violence"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:107
+msgid "Rape or other violent sexual behavior"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:114
+msgid "No references to alcohol"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:116
+msgid "References to alcoholic beverages"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:118
+msgid "Use of alcoholic beverages"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:124
+msgid "No references to illicit drugs"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:126
+msgid "References to illicit drugs"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:128
+msgid "Use of illicit drugs"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:134
+msgid "No references to tobacco products"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:136
+msgid "References to tobacco products"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:138
+msgid "Use of tobacco products"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:144
+msgid "No nudity of any sort"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:146
+msgid "Brief artistic nudity"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:148
+msgid "Prolonged nudity"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:154
+msgid "No references to or depictions of sexual nature"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:156
+msgid "Provocative references or depictions"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:158
+msgid "Sexual references or depictions"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:160
+msgid "Graphic sexual behavior"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:165
+msgid "No profanity of any kind"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:167
+msgid "Mild or infrequent use of profanity"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:169
+msgid "Moderate use of profanity"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:171
+msgid "Strong or frequent use of profanity"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:176
+msgid "No inappropriate humor"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:178
+msgid "Slapstick humor"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:180
+msgid "Vulgar or bathroom humor"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:182
+msgid "Mature or sexual humor"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:187
+msgid "No discriminatory language of any kind"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:189
+msgid "Negativity towards a specific group of people"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:191
+msgid "Discrimination designed to cause emotional harm"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:193
+msgid "Explicit discrimination based on gender, sexuality, race or religion"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:198
+msgid "No advertising of any kind"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:200
+msgid "Product placement"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:202
+msgid "Explicit references to specific brands or trademarked products"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:204
+msgid "Users are encouraged to purchase specific real-world items"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:209
+msgid "No gambling of any kind"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:211
+msgid "Gambling on random events using tokens or credits"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:213
+msgid "Gambling using “play” money"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:215
+msgid "Gambling using real money"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:220
+msgid "No ability to spend money"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:222
+msgid "Users are encouraged to donate real money"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:225
+msgid "Ability to spend real money in-app"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:230
+msgid "No way to chat with other users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:232
+msgid "User-to-user interactions without chat functionality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:234
+msgid "Moderated chat functionality between users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:236
+msgid "Uncontrolled chat functionality between users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:241
+msgid "No way to talk with other users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:243
+msgid "Uncontrolled audio or video chat functionality between users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:250
+msgid "No sharing of social network usernames or email addresses"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:252
+msgid "Sharing social network usernames or email addresses"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:259
+msgid "No sharing of user information with third parties"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:261
+msgid "Checking for the latest application version"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:263
+msgid "Sharing diagnostic data that does not let others identify the user"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:265
+msgid "Sharing information that lets others identify the user"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:270
+msgid "No sharing of physical location with other users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:272
+msgid "Sharing physical location with other users"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:281
+msgid "No references to homosexuality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:283
+msgid "Indirect references to homosexuality"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:285
+msgid "Kissing between people of the same gender"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:287
+msgid "Graphic sexual behavior between people of the same gender"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:292
+msgid "No references to prostitution"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:294
+msgid "Indirect references to prostitution"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:296
+msgid "Direct references to prostitution"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:298
+msgid "Graphic depictions of the act of prostitution"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:303
+msgid "No references to adultery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:305
+msgid "Indirect references to adultery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:307
+msgid "Direct references to adultery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:309
+msgid "Graphic depictions of the act of adultery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:314
+msgid "No sexualized characters"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:317
+msgid "Scantily clad human characters"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:319
+msgid "Overtly sexualized human characters"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:324
+msgid "No references to desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:326
+msgid "Depictions of or references to historical desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:328
+msgid "Depictions of modern-day human desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:330
+msgid "Graphic depictions of modern-day desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:335
+msgid "No visible dead human remains"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:337
+msgid "Visible dead human remains"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:339
+msgid "Dead human remains that are exposed to the elements"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:341
+msgid "Graphic depictions of desecration of human bodies"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:346
+msgid "No references to slavery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:348
+msgid "Depictions of or references to historical slavery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:350
+msgid "Depictions of modern-day slavery"
+msgstr ""
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:352
+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:412
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: src/gs-content-rating.c:546
+msgid "General"
+msgstr "Amatu"
+
+#: src/gs-content-rating.c:555
+msgid "ALL"
+msgstr "AKK"
+
+#: src/gs-content-rating.c:559
+msgid "Adults Only"
+msgstr ""
+
+#: src/gs-content-rating.c:561
+msgid "Mature"
+msgstr "Amawaḍ"
+
+#: src/gs-content-rating.c:563
+msgid "Teen"
+msgstr ""
+
+#: src/gs-content-rating.c:565
+msgid "Everyone 10+"
+msgstr ""
+
+#: src/gs-content-rating.c:567
+msgid "Everyone"
+msgstr ""
+
+#: src/gs-content-rating.c:569
+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:282
+msgid "An application"
+msgstr ""
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types.
+#: src/gs-dbus-helper.c:288
+#, c-format
+msgid "%s is requesting additional file format support."
+msgstr ""
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:290
+msgid "Additional MIME Types Required"
+msgstr ""
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional fonts.
+#: src/gs-dbus-helper.c:294
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr ""
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:296
+msgid "Additional Fonts Required"
+msgstr ""
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional codecs.
+#: src/gs-dbus-helper.c:300
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr ""
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:302
+msgid "Additional Multimedia Codecs Required"
+msgstr ""
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers.
+#: src/gs-dbus-helper.c:306
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr ""
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:308
+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:312
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr ""
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:314
+msgid "Additional Packages Required"
+msgstr ""
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:323
+msgid "Find in Software"
+msgstr ""
+
+#: src/gs-details-page.c:346
+msgid "Removing…"
+msgstr "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:365
+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:372
+msgid "Pending update…"
+msgstr ""
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:386
+msgid "Preparing…"
+msgstr "Asewjed…"
+
+#. TRANSLATORS: this is the warning box
+#: src/gs-details-page.c:745
+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:890 src/gs-details-page.c:907
+#: src/gs-details-page.ui:167 src/gs-third-party-repo-row.c:84
+#: src/gs-upgrade-banner.c:89
+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:921 src/gs-third-party-repo-row.c:76
+msgid "_Install…"
+msgstr "_Sebded..."
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.c:963
+msgid "_Launch"
+msgstr ""
+
+#. TRANSLATORS: button text in the header when an application can be erased
+#: src/gs-details-page.c:987 src/gs-details-page.ui:192
+msgid "_Remove"
+msgstr "_Kkes"
+
+#: src/gs-details-page.c:1018 src/gs-update-dialog.c:93
+msgid "Network"
+msgstr "Réseau"
+
+#: src/gs-details-page.c:1018 src/gs-update-dialog.c:93
+msgid "Can communicate over the network"
+msgstr ""
+
+#: src/gs-details-page.c:1019 src/gs-update-dialog.c:94
+msgid "System Services"
+msgstr ""
+
+#: src/gs-details-page.c:1019 src/gs-update-dialog.c:94
+msgid "Can access D-Bus services on the system bus"
+msgstr ""
+
+#: src/gs-details-page.c:1020 src/gs-update-dialog.c:95
+msgid "Session Services"
+msgstr ""
+
+#: src/gs-details-page.c:1020 src/gs-update-dialog.c:95
+msgid "Can access D-Bus services on the session bus"
+msgstr ""
+
+#: src/gs-details-page.c:1021 src/gs-update-dialog.c:96
+msgid "Devices"
+msgstr "Périphériques"
+
+#: src/gs-details-page.c:1021 src/gs-update-dialog.c:96
+msgid "Can access system device files"
+msgstr ""
+
+#: src/gs-details-page.c:1022 src/gs-details-page.c:1023
+#: src/gs-update-dialog.c:97 src/gs-update-dialog.c:98
+msgid "Home folder"
+msgstr "Akaram umager"
+
+#: src/gs-details-page.c:1022 src/gs-details-page.c:1024
+#: src/gs-details-page.c:1026 src/gs-update-dialog.c:97
+#: src/gs-update-dialog.c:99 src/gs-update-dialog.c:101
+msgid "Can view, edit and create files"
+msgstr ""
+
+#: src/gs-details-page.c:1023 src/gs-details-page.c:1025
+#: src/gs-details-page.c:1027 src/gs-update-dialog.c:98
+#: src/gs-update-dialog.c:100 src/gs-update-dialog.c:102
+msgid "Can view files"
+msgstr ""
+
+#: src/gs-details-page.c:1024 src/gs-details-page.c:1025
+#: src/gs-update-dialog.c:99 src/gs-update-dialog.c:100
+msgid "File system"
+msgstr ""
+
+#: src/gs-details-page.c:1026 src/gs-details-page.c:1027
+#: src/gs-update-dialog.c:101 src/gs-update-dialog.c:102
+msgid "Downloads folder"
+msgstr ""
+
+#: src/gs-details-page.c:1028 src/gs-update-dialog.c:103
+msgid "Settings"
+msgstr "Paramètres"
+
+#: src/gs-details-page.c:1028 src/gs-update-dialog.c:103
+msgid "Can view and change any settings"
+msgstr ""
+
+#: src/gs-details-page.c:1029 src/gs-update-dialog.c:104
+msgid "Legacy display system"
+msgstr ""
+
+#: src/gs-details-page.c:1029 src/gs-update-dialog.c:104
+msgid "Uses an old, insecure display system"
+msgstr ""
+
+#: src/gs-details-page.c:1030 src/gs-update-dialog.c:105
+msgid "Sandbox escape"
+msgstr ""
+
+#: src/gs-details-page.c:1030 src/gs-update-dialog.c:105
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr ""
+
+#: src/gs-details-page.c:1045
+msgid "This application is fully sandboxed."
+msgstr ""
+
+#: src/gs-details-page.c:1053
+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:1212
+msgctxt "version"
+msgid "Unknown"
+msgstr "Arussin"
+
+#. TRANSLATORS: this is where the updated date is not known
+#: src/gs-details-page.c:1225
+msgctxt "updated"
+msgid "Never"
+msgstr "Werjin"
+
+#. TRANSLATORS: this is where we don't know the origin of the
+#. * application
+#: src/gs-details-page.c:1278
+msgctxt "origin"
+msgid "Unknown"
+msgstr "Arussin"
+
+#: src/gs-details-page.c:1331
+msgid "Low"
+msgstr "Faible"
+
+#: src/gs-details-page.c:1333
+msgid "Medium"
+msgstr "D alemmas"
+
+#: src/gs-details-page.c:1335
+msgid "High"
+msgstr "Haut"
+
+#. This refers to the license of the application
+#. TRANSLATORS: this is when a user doesn't specify a name
+#: src/gs-details-page.c:1337 src/gs-details-page.ui:1006
+#: src/gs-review-row.c:58
+msgid "Unknown"
+msgstr "Arussin"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1675
+msgid "You need internet access to write a review"
+msgstr ""
+
+#: src/gs-details-page.c:1864 src/gs-details-page.c:1880
+#, c-format
+msgid "Unable to find “%s”"
+msgstr ""
+
+#. TRANSLATORS: see the wikipedia page
+#: src/gs-details-page.c:2458
+msgid "Public domain"
+msgstr "Taɣult tazayezt"
+
+#. TRANSLATORS: Replace the link with a version in your language,
+#. * e.g. https://de.wikipedia.org/wiki/Gemeinfreiheit
+#: src/gs-details-page.c:2461
+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:2468
+msgid "https://www.gnu.org/philosophy/free-sw"
+msgstr ""
+
+#. TRANSLATORS: see GNU page
+#: src/gs-details-page.c:2478 src/gs-details-page.ui:1250
+msgid "Free Software"
+msgstr ""
+
+#. TRANSLATORS: for the free software popover
+#: src/gs-details-page.c:2535
+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:2562 src/gs-details-page.ui:1322
+msgid "More information"
+msgstr "Ugar n telɣut"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr ""
+
+#: src/gs-details-page.ui:222
+msgid "Downloading"
+msgstr "Asider"
+
+#: 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 "Tasemlit"
+
+#: 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:103
+msgid "Channel"
+msgstr "Abadu"
+
+#. 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 "Tisirag"
+
+#: src/gs-details-page.ui:753
+msgid "Updated"
+msgstr "Yettwalqem"
+
+#: src/gs-details-page.ui:787
+msgid "Category"
+msgstr "Catégorie"
+
+#: 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 "Aneflay"
+
+#: src/gs-details-page.ui:963
+msgid "License"
+msgstr "Licence"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:982
+msgid "Free"
+msgstr "Ilelli"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:994
+msgid "Proprietary"
+msgstr "Bab"
+
+#. 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:315
+msgid "Add-ons"
+msgstr "Izegrar"
+
+#: 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 "Iceggiren"
+
+#. 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:135
+msgid " and "
+msgstr " akked "
+
+#. TRANSLATORS: separator for a list of items
+#: src/gs-extras-page.c:138
+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:164
+#, 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:172
+#, c-format
+msgid "Available software for %s"
+msgid_plural "Available software for %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/gs-extras-page.c:214
+msgid "Unable to Find Requested Software"
+msgstr ""
+
+#. TRANSLATORS: This string is used for codecs that weren't found
+#: src/gs-extras-page.c:319
+#, c-format
+msgid "%s not found"
+msgstr ""
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:323
+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:330
+#, 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:334 src/gs-extras-page.c:345 src/gs-extras-page.c:356
+#, 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:341 src/gs-extras-page.c:363
+#, 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:352
+#, 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:367
+#, 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:374
+#, 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:378
+#, 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:385
+#, 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:389
+#, 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:396
+#, 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:400
+#, 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:407
+#, 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:411
+#, 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:455
+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:459
+#, 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:527 src/gs-extras-page.c:583 src/gs-extras-page.c:622
+msgid "Failed to find any search results"
+msgstr ""
+
+#: src/gs-extras-page.c:810
+#, 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 "Anṣuf"
+
+#: 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:70
+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:76
+msgctxt "app status"
+msgid "Installed"
+msgstr "Yettwasbedd"
+
+#. TRANSLATORS: this is the status in the history UI,
+#. * where we are showing the application was updated
+#: src/gs-history-dialog.c:82
+msgctxt "app status"
+msgid "Updated"
+msgstr "Yettwalqem"
+
+#. 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:88
+msgctxt "app status"
+msgid "Unknown"
+msgstr "Arussin"
+
+#. TRANSLATORS: This is the date string with: day number, month name, year.
+#. i.e. "25 May 2012"
+#: src/gs-history-dialog.c:111 src/gs-review-row.c:65 src/gs-updates-page.c:258
+msgid "%e %B %Y"
+msgstr ""
+
+#: src/gs-history-dialog.ui:5
+msgid "History"
+msgstr "Amazray"
+
+#. 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:62 src/gs-loading-page.c:66
+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:84
+msgid "system"
+msgstr ""
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:87
+msgid "user"
+msgstr "aseqdac"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:108 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 "Amasal"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:93
+msgid "Installation"
+msgstr "Asbeddi"
+
+#. add button
+#: src/gs-overview-page.c:313
+msgid "More…"
+msgstr "Uggar …"
+
+#. TRANSLATORS: this is a heading for audio applications which
+#. * have been featured ('recommended') by the distribution
+#: src/gs-overview-page.c:563
+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:568
+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:573
+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:578
+msgid "Recommended Productivity Applications"
+msgstr ""
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:926 src/gs-repos-dialog.c:832
+msgid "Access additional software from selected third party sources."
+msgstr "Kcem ɣer yiseɣzan-nniḍen seg teɣbula n wis tlata yettwafernen."
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:930 src/gs-repos-dialog.c:836
+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."
+
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-overview-page.c:935 src/gs-repos-dialog.c:841
+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:943 src/gs-repos-dialog.c:240
+msgid "Enable"
+msgstr "Activer"
+
+#: 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 "Ɣer deffir"
+
+#: src/gs-overview-page.ui:126
+msgid "Next"
+msgstr "Ɣer zdat"
+
+#. 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 "Taggayin"
+
+#: 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:325
+#, 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:461
+#, c-format
+msgid "Are you sure you want to remove the %s repository?"
+msgstr ""
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:465
+#, 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:473
+#, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr "D tidet tebɣiḍ ad tekkseḍ %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:476
+#, 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:64 src/gs-summary-tile.c:87
+#, 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:120
+#, 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 "_Kemmel"
+
+#. TRANSLATORS: This string is used to construct the 'X applications
+#. installed' sentence, describing a software repository.
+#: src/gs-repos-dialog.c:98
+#, 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:105
+#, 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:113
+#, 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:119
+#, 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:126
+#, 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:302
+#, 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:307
+#, c-format
+msgid "Disable “%s”?"
+msgstr ""
+
+#. 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 ""
+
+#. TRANSLATORS: this is button text to remove the repo
+#: src/gs-repos-dialog.c:329
+msgid "Disable"
+msgstr "Désactiver"
+
+#. 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:745
+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:811 src/gs-repos-dialog.c:847
+#, 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:829
+msgid "Third Party Repositories"
+msgstr "Ikufan n wis tlata"
+
+#: 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:96
+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:105
+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:110
+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:118
+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:130
+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:144
+msgid "Enabled"
+msgstr "Yermed"
+
+#. 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 "Ittwarermed"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really bad application
+#: src/gs-review-dialog.c:82
+msgid "Hate it"
+msgstr ""
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:86
+msgid "Don’t like it"
+msgstr ""
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:90
+msgid "It’s OK"
+msgstr ""
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:94
+msgid "Like it"
+msgstr ""
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:98
+msgid "Love it"
+msgstr ""
+
+#. TRANSLATORS: the review can't just be copied and pasted
+#: src/gs-review-dialog.c:120
+msgid "Please take more time writing the review"
+msgstr ""
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:124
+msgid "Please choose a star rating"
+msgstr ""
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:128
+msgid "The summary is too short"
+msgstr ""
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:132
+msgid "The summary is too long"
+msgstr ""
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:136
+msgid "The description is too short"
+msgstr "Aglam wezzil aṭas"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:140
+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:110
+msgid "Summary"
+msgstr "Agzul"
+
+#: src/gs-review-dialog.ui:120
+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:145
+msgctxt "app review"
+msgid "Review"
+msgstr "Cegger"
+
+#: src/gs-review-dialog.ui:155
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+
+#: src/gs-review-dialog.ui:187
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+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: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:242
+msgid "Report Review?"
+msgstr ""
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:246
+msgid "Report"
+msgstr "Aneqqis"
+
+#. 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 "Oui"
+
+#: src/gs-review-row.ui:130
+msgid "No"
+msgstr "Uhu"
+
+#. 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:236
+msgid "Screenshot not found"
+msgstr ""
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:251
+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:382
+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:412
+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:472
+msgid "Screenshot not valid"
+msgstr ""
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:487
+msgid "Screenshot not available"
+msgstr ""
+
+#: src/gs-screenshot-image.c:545
+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:143
+#, 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:1111 src/gs-shell.c:1116 src/gs-shell.c:1131
+#: src/gs-shell.c:1135
+#, 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:1182
+#, 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:1188
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1195 src/gs-shell.c:1240
+msgid "Unable to download updates"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1201
+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:1210
+#, 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:1215
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1222
+msgid "Unable to download updates: authentication was required"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1227
+msgid "Unable to download updates: authentication was invalid"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1232
+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:1243
+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:1286
+#, 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:1292
+#, 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:1305
+#, 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:1311
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1324
+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:1329
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1336
+#, 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:1343
+#, 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:1350
+#, 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:1358
+#, 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:1365
+#, 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:1374
+#, 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:1421
+#, 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:1428
+#, 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:1435
+#, 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:1439
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1445
+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:1455
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1460
+#, 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:1470
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1475
+#, 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:1484
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1489
+#, 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:1498
+#, 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:1504
+#, 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:1514
+#, 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:1520
+#, 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:1529
+#, 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:1535
+#, 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:1546
+#, c-format
+msgid "Unable to update %s"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1549
+#, 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:1592
+#, 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:1597
+#, 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:1606
+#, 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:1615
+#, 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:1623
+#, 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:1630
+#, 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:1637
+#, 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:1644
+#, 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:1651
+#, 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:1660
+#, 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:1698
+#, 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:1704
+#, 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:1710
+#, 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:1717
+#, 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:1724
+#, 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:1736
+#, 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:1779
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1786 src/gs-shell.c:1837 src/gs-shell.c:1878
+#: src/gs-shell.c:1926
+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:1797 src/gs-shell.c:1848 src/gs-shell.c:1889
+#: src/gs-shell.c:1960
+msgid "Sorry, something went wrong"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1829
+msgid "Failed to install file: not supported"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1833
+msgid "Failed to install file: authentication failed"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1870
+msgid "Failed to install: not supported"
+msgstr ""
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1874
+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:1920
+#, 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:1935
+#, 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:1940
+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:1947
+msgid "AC power is required"
+msgstr ""
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1951
+msgid "The battery level is too low"
+msgstr ""
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-shell-search-provider.c:258
+#, c-format
+msgid "Source: %s"
+msgstr "Aɣbalu: %s"
+
+#: src/gs-summary-tile.c:92
+#, c-format
+msgid "%s (Installing)"
+msgstr ""
+
+#: src/gs-summary-tile.c:97
+#, 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:93
+msgid "_Remove All"
+msgstr ""
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-update-dialog.c:188
+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:292
+#, c-format
+msgid "Installed on %s"
+msgstr ""
+
+#. TRANSLATORS: this is the title of the installed updates dialog window
+#: src/gs-update-dialog.c:312
+msgid "Installed Updates"
+msgstr ""
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-update-dialog.c:528
+msgid "Additions"
+msgstr ""
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-update-dialog.c:532
+msgid "Removals"
+msgstr ""
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#: src/gs-update-dialog.c:536
+msgid "Updates"
+msgstr "Isedγiten"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-update-dialog.c:540
+msgid "Downgrades"
+msgstr ""
+
+#: src/gs-update-dialog.ui:100
+msgid "No updates have been installed on this system."
+msgstr ""
+
+#: src/gs-update-monitor.c:111
+msgid "Security Updates Pending"
+msgstr ""
+
+#: src/gs-update-monitor.c:112
+msgid "It is recommended that you install important updates now"
+msgstr ""
+
+#: src/gs-update-monitor.c:115
+msgid "Restart & Install"
+msgstr ""
+
+#: src/gs-update-monitor.c:119
+msgid "Software Updates Available"
+msgstr ""
+
+#: src/gs-update-monitor.c:120
+msgid "Important OS and application updates are ready to be installed"
+msgstr ""
+
+#: src/gs-update-monitor.c:124
+msgid "View"
+msgstr "Askan"
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:232
+#, 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:238
+#, 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:249
+#, c-format
+msgid "%s has been updated."
+msgstr "%s imucceḍ."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:252
+msgid "Please restart the application."
+msgstr ""
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:260
+#, c-format
+msgid "%s and %s have been updated."
+msgstr ""
+
+#. TRANSLATORS: at least one application needs restarting
+#: src/gs-update-monitor.c:266 src/gs-update-monitor.c:285
+#, 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:278
+#, 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:519 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:521
+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:576
+#, c-format
+msgid "A new version of %s is available to install"
+msgstr ""
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:580
+msgid "Software Upgrade Available"
+msgstr ""
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:969
+msgid "Software Updates Failed"
+msgstr ""
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:971
+msgid "An important OS update failed to be installed."
+msgstr ""
+
+#: src/gs-update-monitor.c:972
+msgid "Show Details"
+msgstr "Sken tealqayt"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:995
+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:1000
+#, c-format
+msgid "Welcome to %s %s!"
+msgstr ""
+
+#. TRANSLATORS: title when we've done offline updates
+#: src/gs-update-monitor.c:1006
+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:1010
+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:1021
+msgctxt "updates"
+msgid "Review"
+msgstr "Cegger"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1069
+msgid "Failed To Update"
+msgstr ""
+
+#. TRANSLATORS: the user must have updated manually after
+#. * the updates were prepared
+#: src/gs-update-monitor.c:1075
+msgid "The system was already up to date."
+msgstr ""
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1080
+msgid "The update was cancelled."
+msgstr ""
+
+#. TRANSLATORS: the package manager needed to download
+#. * something with no network available
+#: src/gs-update-monitor.c:1086
+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:1092
+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:1098
+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:1103
+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:226
+msgid "%R"
+msgstr "%R"
+
+#. TRANSLATORS: Time in 12h format
+#: src/gs-updates-page.c:229
+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:235
+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:239
+msgid "Yesterday, %l:%M %p"
+msgstr ""
+
+#: src/gs-updates-page.c:242
+msgid "Two days ago"
+msgstr ""
+
+#: src/gs-updates-page.c:244
+msgid "Three days ago"
+msgstr ""
+
+#: src/gs-updates-page.c:246
+msgid "Four days ago"
+msgstr ""
+
+#: src/gs-updates-page.c:248
+msgid "Five days ago"
+msgstr ""
+
+#: src/gs-updates-page.c:250
+msgid "Six days ago"
+msgstr ""
+
+#: src/gs-updates-page.c:252
+msgid "One week ago"
+msgstr ""
+
+#: src/gs-updates-page.c:254
+msgid "Two weeks ago"
+msgstr ""
+
+#. TRANSLATORS: the update panel is doing *something* vague
+#: src/gs-updates-page.c:270
+msgid "Looking for new updates…"
+msgstr ""
+
+#. TRANSLATORS: the updates panel is starting up
+#: src/gs-updates-page.c:339
+msgid "Setting up updates…"
+msgstr ""
+
+#. TRANSLATORS: the updates panel is starting up
+#: src/gs-updates-page.c:340 src/gs-updates-page.c:347
+msgid "(This could take a while)"
+msgstr ""
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: src/gs-updates-page.c:454
+#, 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:618
+#, c-format
+msgid "%s %s is no longer supported."
+msgstr ""
+
+#. TRANSLATORS: OS refers to operating system, e.g. Fedora
+#: src/gs-updates-page.c:623
+msgid "Your OS is no longer supported."
+msgstr ""
+
+#. TRANSLATORS: EOL distros do not get important updates
+#: src/gs-updates-page.c:628
+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:632
+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:890
+msgid "Charges May Apply"
+msgstr ""
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:894
+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:898
+msgid "Check _Anyway"
+msgstr ""
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:914
+msgid "No Network"
+msgstr ""
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:918
+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:1341
+msgid "Checking…"
+msgstr ""
+
+#: src/gs-updates-page.c:1354
+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:281
+msgid "Restart & Update"
+msgstr ""
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:287
+msgid "Update All"
+msgstr ""
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:418
+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:422
+msgid "Requires Restart"
+msgstr ""
+
+#. TRANSLATORS: This is the header for online runtime and
+#. * app updates, typically flatpaks or snaps
+#: src/gs-updates-section.c:426
+msgid "Application Updates"
+msgstr ""
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:430
+msgid "Device Firmware"
+msgstr ""
+
+#: src/gs-updates-section.c:458 src/gs-upgrade-banner.ui:102
+msgid "_Download"
+msgstr ""
+
+#: src/gs-upgrade-banner.c:91
+msgid ""
+"It is recommended that you back up your data and files before upgrading."
+msgstr ""
+
+#: src/gs-upgrade-banner.c:95
+msgid "_Restart Now"
+msgstr "_Ales asekker tura"
+
+#: src/gs-upgrade-banner.c:97
+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:112
+#, 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:122
+#, 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:132
+#, 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:143
+#, 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:17
+msgctxt "Menu of Audio & Video"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:20
+msgctxt "Menu of Audio & Video"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:23
+msgctxt "Menu of Audio & Video"
+msgid "Audio Creation & Editing"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:29
+msgctxt "Menu of Audio & Video"
+msgid "Music Players"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:38
+msgctxt "Menu of Developer Tools"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:41
+msgctxt "Menu of Developer Tools"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:44
+msgctxt "Menu of Developer Tools"
+msgid "Debuggers"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:47
+msgctxt "Menu of Developer Tools"
+msgid "IDEs"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:56
+msgctxt "Menu of Education & Science"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:60
+msgctxt "Menu of Education & Science"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:64
+msgctxt "Menu of Education & Science"
+msgid "Artificial Intelligence"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:67
+msgctxt "Menu of Education & Science"
+msgid "Astronomy"
+msgstr "Tasnallunt"
+
+#: plugins/core/gs-desktop-common.c:71
+msgctxt "Menu of Education & Science"
+msgid "Chemistry"
+msgstr "Takrura"
+
+#: plugins/core/gs-desktop-common.c:75
+msgctxt "Menu of Education & Science"
+msgid "Languages"
+msgstr "Tutlayin"
+
+#: plugins/core/gs-desktop-common.c:79
+msgctxt "Menu of Education & Science"
+msgid "Math"
+msgstr "Tusnakt"
+
+#: plugins/core/gs-desktop-common.c:86
+msgctxt "Menu of Education & Science"
+msgid "Robotics"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:95
+msgctxt "Menu of Games"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:98
+msgctxt "Menu of Games"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:101
+msgctxt "Menu of Games"
+msgid "Action"
+msgstr "Action"
+
+#: plugins/core/gs-desktop-common.c:104
+msgctxt "Menu of Games"
+msgid "Adventure"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:107
+msgctxt "Menu of Games"
+msgid "Arcade"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:110
+msgctxt "Menu of Games"
+msgid "Blocks"
+msgstr "Iḥedran"
+
+#: plugins/core/gs-desktop-common.c:113
+msgctxt "Menu of Games"
+msgid "Board"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:116
+msgctxt "Menu of Games"
+msgid "Card"
+msgstr "Takarḍa"
+
+#: plugins/core/gs-desktop-common.c:119
+msgctxt "Menu of Games"
+msgid "Emulators"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:122
+msgctxt "Menu of Games"
+msgid "Kids"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:125
+msgctxt "Menu of Games"
+msgid "Logic"
+msgstr "Tameẓla"
+
+#: plugins/core/gs-desktop-common.c:128
+msgctxt "Menu of Games"
+msgid "Role Playing"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:131
+msgctxt "Menu of Games"
+msgid "Sports"
+msgstr "Addalen"
+
+#: plugins/core/gs-desktop-common.c:135
+msgctxt "Menu of Games"
+msgid "Strategy"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:143
+msgctxt "Menu of Graphics & Photography"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:146
+msgctxt "Menu of Graphics & Photography"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:149
+msgctxt "Menu of Graphics & Photography"
+msgid "3D Graphics"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:152
+msgctxt "Menu of Graphics & Photography"
+msgid "Photography"
+msgstr "Tawlaft"
+
+#: plugins/core/gs-desktop-common.c:155
+msgctxt "Menu of Graphics & Photography"
+msgid "Scanning"
+msgstr "Tasleṭ"
+
+#: plugins/core/gs-desktop-common.c:158
+msgctxt "Menu of Graphics & Photography"
+msgid "Vector Graphics"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:161
+msgctxt "Menu of Graphics & Photography"
+msgid "Viewers"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:169
+msgctxt "Menu of Productivity"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:172
+msgctxt "Menu of Productivity"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:175
+msgctxt "Menu of Productivity"
+msgid "Calendar"
+msgstr "Taswast"
+
+#: plugins/core/gs-desktop-common.c:179
+msgctxt "Menu of Productivity"
+msgid "Database"
+msgstr "Azadur n isefka"
+
+#: plugins/core/gs-desktop-common.c:182
+msgctxt "Menu of Productivity"
+msgid "Finance"
+msgstr "Tadrimt"
+
+#: plugins/core/gs-desktop-common.c:186
+msgctxt "Menu of Productivity"
+msgid "Word Processor"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:195
+msgctxt "Menu of Add-ons"
+msgid "Fonts"
+msgstr "Tisefsiyin"
+
+#: plugins/core/gs-desktop-common.c:198
+msgctxt "Menu of Add-ons"
+msgid "Codecs"
+msgstr "Codecs"
+
+#: plugins/core/gs-desktop-common.c:201
+msgctxt "Menu of Add-ons"
+msgid "Input Sources"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:204
+msgctxt "Menu of Add-ons"
+msgid "Language Packs"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:207
+msgctxt "Menu of Add-ons"
+msgid "Localization"
+msgstr "Asideg"
+
+#: plugins/core/gs-desktop-common.c:210
+msgctxt "Menu of Add-ons"
+msgid "Hardware Drivers"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:218
+msgctxt "Menu of Communication & News"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:221
+msgctxt "Menu of Communication & News"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:224
+msgctxt "Menu of Communication & News"
+msgid "Chat"
+msgstr "Asqerdec"
+
+#: plugins/core/gs-desktop-common.c:231
+msgctxt "Menu of Communication & News"
+msgid "News"
+msgstr "Isallen"
+
+#: plugins/core/gs-desktop-common.c:235
+msgctxt "Menu of Communication & News"
+msgid "Web Browsers"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:243
+msgctxt "Menu of Utilities"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:246
+msgctxt "Menu of Utilities"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:249
+msgctxt "Menu of Utilities"
+msgid "Text Editors"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:257
+msgctxt "Menu of Reference"
+msgid "All"
+msgstr "Tous"
+
+#: plugins/core/gs-desktop-common.c:260
+msgctxt "Menu of Reference"
+msgid "Featured"
+msgstr "Yuɣal ɣer sdat"
+
+#: plugins/core/gs-desktop-common.c:263
+msgctxt "Menu of Art"
+msgid "Art"
+msgstr "Taẓuri"
+
+#: plugins/core/gs-desktop-common.c:266
+msgctxt "Menu of Reference"
+msgid "Biography"
+msgstr "Tameddurt"
+
+#: plugins/core/gs-desktop-common.c:269
+msgctxt "Menu of Reference"
+msgid "Comics"
+msgstr "Iseḍsayen"
+
+#: plugins/core/gs-desktop-common.c:272
+msgctxt "Menu of Reference"
+msgid "Fiction"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:275
+msgctxt "Menu of Reference"
+msgid "Health"
+msgstr "Tadawsa"
+
+#: plugins/core/gs-desktop-common.c:278
+msgctxt "Menu of Reference"
+msgid "History"
+msgstr "Amazray"
+
+#: plugins/core/gs-desktop-common.c:281
+msgctxt "Menu of Reference"
+msgid "Lifestyle"
+msgstr ""
+
+#: plugins/core/gs-desktop-common.c:284
+msgctxt "Menu of Reference"
+msgid "Politics"
+msgstr "Tasertit"
+
+#: plugins/core/gs-desktop-common.c:287
+msgctxt "Menu of Reference"
+msgid "Sports"
+msgstr "Addalen"
+
+#. TRANSLATORS: this is the menu spec main category for Audio & Video
+#: plugins/core/gs-desktop-common.c:297
+msgid "Audio & Video"
+msgstr ""
+
+#. TRANSLATORS: this is the menu spec main category for Development
+#: plugins/core/gs-desktop-common.c:300
+msgid "Developer Tools"
+msgstr "Ifecka n uneflay"
+
+#. TRANSLATORS: this is the menu spec main category for Education & Science
+#: plugins/core/gs-desktop-common.c:303
+msgid "Education & Science"
+msgstr ""
+
+#. TRANSLATORS: this is the menu spec main category for Game
+#: plugins/core/gs-desktop-common.c:306
+msgid "Games"
+msgstr "Uraren"
+
+#. TRANSLATORS: this is the menu spec main category for Graphics
+#: plugins/core/gs-desktop-common.c:309
+msgid "Graphics & Photography"
+msgstr ""
+
+#. TRANSLATORS: this is the menu spec main category for Office
+#: plugins/core/gs-desktop-common.c:312
+msgid "Productivity"
+msgstr ""
+
+#. TRANSLATORS: this is the menu spec main category for Communication
+#: plugins/core/gs-desktop-common.c:318
+msgid "Communication & News"
+msgstr ""
+
+#. TRANSLATORS: this is the menu spec main category for Reference
+#: plugins/core/gs-desktop-common.c:321
+msgid "Reference"
+msgstr "Tamsisɣelt"
+
+#. TRANSLATORS: this is the menu spec main category for Utilities
+#: plugins/core/gs-desktop-common.c:324
+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:56
+msgid "OS Updates"
+msgstr ""
+
+#. TRANSLATORS: this is a longer description of the
+#. * "OS Updates" string
+#: plugins/core/gs-plugin-generic-updates.c:61
+msgid "Includes performance, stability and security improvements."
+msgstr ""
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:42
+msgid "Downloading featured images…"
+msgstr ""
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:562
+msgid "Endless OS"
+msgstr ""
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:565
+msgid "An Endless OS update with new features and fixes."
+msgstr ""
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:826
+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:141
+msgid "GNOME Software AppStream system-wide installer"
+msgstr ""
+
+#: plugins/external-appstream/gs-install-appstream.c:143
+msgid "Failed to parse command line arguments"
+msgstr ""
+
+#. TRANSLATORS: user did not specify a valid filename
+#: plugins/external-appstream/gs-install-appstream.c:150
+msgid "You need to specify exactly one filename"
+msgstr ""
+
+#. TRANSLATORS: only able to install files as root
+#: plugins/external-appstream/gs-install-appstream.c:157
+msgid "This program can only be used by the root user"
+msgstr ""
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:165
+msgid "Failed to validate content type"
+msgstr ""
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:175
+msgid "Failed to copy"
+msgstr "Anɣal ur yeddi ara"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/external-appstream/gs-plugin-external-appstream.c:236
+msgid "Downloading extra metadata files…"
+msgstr ""
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:193
+msgid "Downloading upgrade information…"
+msgstr ""
+
+#. 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 ""
+
+#: 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:901
+#, 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:136
+#, 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:141
+#, 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:146
+#, 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:151
+#, 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:156
+#, 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:161
+#, 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:167
+#, 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:173
+#, 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:178
+#, 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:183
+#, c-format
+msgid "%s Configuration Update"
+msgstr ""
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:691
+msgid "Downloading firmware update signature…"
+msgstr ""
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:732
+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:291
+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:240
+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/kk.po b/po/kk.po
new file mode 100644
index 0000000..710c3ab
--- /dev/null
+++ b/po/kk.po
@@ -0,0 +1,6956 @@
+# 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 <baurthefirst@gmail.com>, 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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-09-18 09:41+0600\n"
+"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
+"Language-Team: Kazakh <kk_KZ@googlegroups.com>\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.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 "Бағд. қамтама"
+
+#: 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 ""
+"Software қолданбасы сізге жаңа қолданбалар мен жүйелік кеңейтулерді тауып, "
+"орнатуды және орнатылған қолданбаларды өшіруді мүмкін қылады."
+
+#: 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:1980
+#: src/gs-application.c:256
+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 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 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 ""
+"3-ші жақты тарап ретінде қарастырылмауы тиіс ресми репозиторийлер тізімі"
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "Тегін емес және меншігі бар бағдарламалық қамтаманы түсіндіретін URI"
+
+#: 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 ""
+"AppStream файлдарын барлық пайдаланушылар үшін жүйелік орналасуға орнату. "
+"Жалған болса, файлдар стандартты емес $XDG_DATA_HOME/swcatalog/xml бумасына "
+"орнатылатын болады"
+
+#: 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 "Кіру үшін қолданылған gnome-online-account id сақтайтын мәтіндік жол"
+
+#. 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 "GNOME Software AppStream жүйелік орынға орнатқышы"
+
+#: 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 "Бұл бағдарламаны тек әкімші (root) пайдалана алады"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, c-format
+msgid "Failed to validate content type: %s"
+msgstr "Құрама түрін растау сәтсіз аяқталды: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 жасөсп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:1043
+#, 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:1048
+#, 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: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:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+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 "Жүйелік шинада D-Bus қызметтеріне қатынай алады"
+
+#: 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 "Сессиялық шинада D-Bus қызметтеріне қатынай алады"
+
+#: 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 "Нұсқа %s жаңалықтары"
+
+#: 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 ""
+"Іске қосылу режимі келесіден біреу: ‘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: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 "AppStream орнына жергілікті файлдағы қайнар көздерін қалау"
+
+#: 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 "Copyright © 2016–2022 GNOME Software үлесін қосушылар"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
+
+#. 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:2147
+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 "Қосымша жүйе жүктеулерінің %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: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 "Қайнар көзі: %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 "Бұрынғы %s атынан аты ауыстырылды"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "%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 өнімін еріктілердің халықаралық қоғамдастығы жобалап, әзірлеп, аударады.\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 ""
+
+#: 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 "1 және %u арасындағы санды енгізіңіз: "
+
+#. 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 "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 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 енді орнатылған"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">еркін және ашық БҚ</a> емес болып табылады, және оны “%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 дестесін “%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 "%s кейбір елдерде орнату немесе қолдану заңсыз болуы мүмкін."
+
+#. 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] "Жаңартулар орнатылды"
+
+#. 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] "Қолданба(лар) өшірілді"
+
+#. 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] "Олар іске асуы үшін жүйені қайта қосу керек."
+
+#. 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] "%d минут бұрын"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d сағат бұрын"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d күн бұрын"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d апта бұрын"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d ай бұрын"
+
+#: src/gs-common.c:891
+#, 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:1246
+#, 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 "Қолданба"
+
+#. 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:332
+msgid "Find in Software"
+msgstr "Software ішінен табу"
+
+#: 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "Ор_нату"
+
+#: src/gs-details-page.c:873
+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:897
+msgid "_Install…"
+msgstr "Ор_нату…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "%s ұсынған басқа қолданбалар"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Пікірді қалдыру үшін интернетпен байланыс керек"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "\"%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 "_Аударуға көмектесу"
+
+#. 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:216
+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] "%s жазуы үшін қолжетерлік қаріптер"
+
+#. 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] "%s үшін қолжетерлік БҚ"
+
+#: 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 "%s табылмады"
+
+#. 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 "%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 ""
+"%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"%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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"%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:420
+#, 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:424
+#, 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 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 "%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 ""
+"%s туралы ақпаратты және бұл принтерді қолдайтын драйверді орнату жолы "
+"жөнінде %s білуге болады."
+
+#. 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] "%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: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] "Сіз іздеген %s табу мүмкін емес. Көбірек білу үшін, %s қараңыз."
+
+#: 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 "Іздеу нәтижелері табылмады: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s файл пішімі"
+
+#: 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 "%s осы құрылғыда жұмыс істейтін сияқты"
+
+#. 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 осы құрылғыда жұмыс істейді"
+
+#. 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 бұл құрылғыда дұрыс жұмыс істемейді"
+
+#. 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 бұл құрылғыда жұмыс істемейді"
+
+#. 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 <a href=\"%s\">%s license</a>.\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:104
+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:2824
+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 "%s репозиторийін өшіруді шынымен қалайсыз ба?"
+
+#. 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 ""
+"%s ішінен барлық қолданбалар өшіріледі, және оларды қолданғыңыз келсе, сізге "
+"бұл репозиторийді қайтадан орнату керек болады."
+
+#. 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 "%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 өшіріледі, және оны қолданғыңыз келсе, сізге оны қайтадан орнату керек "
+"болады."
+
+#: 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 "Таңдалған үшінші жақты ұсынушыларынан қосымша БҚ репозиторийлер — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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] "%u қолданба орнатылды"
+
+#. 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 қосымша орнатылды"
+
+#. 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 қолданба"
+
+#. 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 қосымша"
+
+#. 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 және %s орнатылды"
+
+#. 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 "Жек көремін"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. 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:93
+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: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 "%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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s қауiпсiз еме"
+
+#. 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 "Ескірген 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 "Келесі скриншот"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Скриншот жарамсыз"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "тағы %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 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s адресінен жаңартуларды жүктеп алу мүмкін емес"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Жаңартуларды жүктеп алу сәтсіз аяқталды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Жаңартуларды жүктеп алу мүмкін емес: диск орны жетпейді"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Жаңартуларды жүктеп алу мүмкін емес: аутентификация керек болды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Жаңартуларды жүктеп алу мүмкін емес: аутентификация қате болды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+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:1371
+#, c-format
+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:1377
+#, c-format
+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:1389
+#, c-format
+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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "%s қолдауы жоқ ретінде орнату мүмкін емес"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+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:1406
+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:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "%s орнату мүмкін емес: диск орны жетпейді"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+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:1422
+#, c-format
+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:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1435
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "%s орнату мүмкін емес: батарея деңгейі тым төмен"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+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:1502
+#, c-format
+msgid "Unable to update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Жаңартуларды орнату мүмкін емес, өйткені %s адресінен жүктеп алу сәтсіз "
+"аяқталды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Жаңартуларды орнату мүмкін емес, өйткені жүктеп алу сәтсіз аяқталды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "%s жаңарту мүмкін емес: диск орны жетпейді"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, 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:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "%s жаңарту мүмкін емес: аутентификация керек болды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, 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:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "%s жаңарту мүмкін емес: аутентификация қате болды"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, 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:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr "%s жаңарту мүмкін емес: сізде БҚ орнатуға рұқсаттар жоқ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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:1582
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1602
+#, 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:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "%s жаңарту мүмкін емес"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, 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:1658
+#, c-format
+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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1679
+#, c-format
+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:1686
+#, c-format
+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:1692
+#, c-format
+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:1698
+#, c-format
+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:1704
+#, c-format
+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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1719
+#, c-format
+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:1756
+#, c-format
+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:1761
+#, c-format
+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:1766
+#, c-format
+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:1772
+#, c-format
+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:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "%s өшіру мүмкін емес: батарея деңгейі тым төмен"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Кешіріңіз, бірнәрсе қате кетті"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Файлды орнату сәтсіз аяқталды: қолдауы жоқ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Файлды орнату сәтсіз аяқталды: аутентификация сәтсіз"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Орнату сәтсіз аяқталды: қолдау жоқ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+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:1961
+#, c-format
+msgid "Unable to contact %s"
+msgstr "%s адресіне байланысу мүмкін емес"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Жаңа плагиндерді қолдану үшін БҚ қолданбасын қайта іске қосу керек."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Эл. қорегіне қосылу керек"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Кэштелген деректерді <a href=\"dummy\">қолд_анба параметрлерінен тазартуға</"
+"a>болады."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Орнатылған)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Орнатылуда)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Өшірілуде)"
+
+#. 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 "Орнатылған %s"
+
+#: 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] "%u қолданба жаңартылды — қайта іске қосу керек"
+
+#. 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 қолданба жаңартылды"
+
+#. 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 "%s және %s жаңартылды."
+
+#. 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 қолданба қайта іске қосуды талап етеді."
+
+#. 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 "Орнату үшін %s жаңа нұсқасы қолжетерлік"
+
+#. 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 "%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] "БҚ жаңартулары орнатылды"
+
+#. 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] "Маңызды жүйе жаңартулары орнатылды."
+
+#. 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 "Соңғы тексерілген: %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 үшін енді қолдау жоқ."
+
+#: 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 "%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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s қолжетімді"
+
+#: 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 "%s жүктелді, барлығы %s"
+
+#. 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%% жүктелді"
+
+#: 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 "Жаңа мүмкіндіктер мен түзетулері бар %s жаңартуы."
+
+#: 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 "GNOME 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: 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:404
+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 "Flatpak - бұл Linux үшін жұмыс үстел қолданбаларының жүйесі"
+
+#. 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 "Жүйелік бума %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Үй бумасында ішкі бума %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Хост-жүйенің бумалары"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "/etc ішінен хост жүйесінің баптаулары"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Жұмыс үстелі бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Жұмыс үстелдің ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Құжаттар бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Құжаттар бумасының ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Музыка бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Музыка бумасының ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Суреттер бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Суреттер бумасының ішкі бумасы %s"
+
+#: 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 "Жалпы ортақ бөлісу бумасының ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Видеолар бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Видеолар бумасының ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Үлгілер бумасы"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Үлгілер бумасының ішкі бумасы %s"
+
+#: 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 "Пайдаланушының кэш бумасының ішкі бумасы %s"
+
+#: 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 "Пайдаланушы баптаулары бумасының ішкі бумасы %s"
+
+#: 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 "Пайдаланушының деректер бумасының ішкі бумасы %s"
+
+#: 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 "Пайдаланушының орындалу уақытындағы деректер бумасының ішкі бумасы %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Файл жүйенің %s үшін қатынау"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "%s үшін flatpak метадеректерін алу…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr ""
+
+#: 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 ""
+
+#. 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 құрылғы жаңартуы"
+
+#. 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 жүйе жаңартуы"
+
+#. 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 ендірілген контроллер жаңартуы"
+
+#. 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 жаңартуы"
+
+#. 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 жаңартуы"
+
+#. 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 жаңартуы"
+
+#. 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 контроллер жаңартуы"
+
+#. 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 контроллері жаңартуы"
+
+#. 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 процессор микрокодының жаңартуы"
+
+#. 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 баптаулар жаңартуы"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s камера жаңартуы"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM жаңартуы"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s тачпад жаңартуы"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s тышқан жаңартуы"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 сақтауыш контроллер жаңартуы"
+
+#. 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 желілік контроллер жаңартуы"
+
+#. 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 монитор жаңартуы"
+
+#. 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 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB қабылдағышының жаңартуы"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+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:2687
+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 "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 "_Installed"
+#~ msgstr "Орнат_ылған"
+
+#~ msgid "_Updates"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Remove"
+#~ msgstr "Өшіру"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Қосымша қайнар көздері жоқ"
+
+#~ msgid "_Enable"
+#~ 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 "_Restart Now"
+#~ 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 "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 "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 Software баннерлер дизайнері"
+
+#~ msgid "No Designs"
+#~ msgstr "Дизайндар жоқ"
+
+#~ msgid "Error message here"
+#~ msgstr "Қате хабарламасы осында"
+
+#~ msgid "App ID"
+#~ msgstr "App ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Дизайнды өшіру"
+
+#~ msgid "OS Upgrade"
+#~ 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: 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 "Unable to purchase %s"
+#~ 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 "I have forgotten my password"
+#~ 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 "Unable to update %s from %s"
+#~ msgstr "%s өнімін %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 "U_pdate All"
+#~ msgstr "Барлығын жаңа_рту"
+
+#~ 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 "_Install All"
+#~ 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 "web app"
+#~ msgstr "веб қолданбасы"
+
+#~ 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 "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 "No sources found."
+#~ msgstr "Қайнар көздері табылмады."
+
+#~ msgid "OK"
+#~ 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 <sokhem@open.org.kh>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: Khmer <km@li.org>\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..54e6cd8
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,5318 @@
+# 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 <shcho@gnome.org>, 2013-2022.
+#
+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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-08-28 20:26+0900\n"
+"Last-Translator: Seong-ho Cho <shcho@gnome.org>\n"
+"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\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 2.3.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:1980
+#: src/gs-application.c:256
+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 "시스템 관리 위치에 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 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 ""
+"큰 값을 설정하면 원격 서버 접근 횟수는 적어지지만 사용자에게 보여줄 스크린샷 "
+"업데이트 시간이 오래걸릴 수 있습니다. 0 값은 캐시에 이미 그림이 있을 경우 검"
+"사하지 않음을 의미합니다."
+
+#: 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 "제 3자 공급원으로 간주하지 않는 공식 저장소 목록"
+
+#: 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 "자유 프로그램으로 간주하는 프로그램 항목에 활용할 라이선스 URL"
+
+#: 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 "사용자에게 비 자유 앱을 알리는 일부 UI 구성 요소 표시"
+
+#: 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://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:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "비 자유-상업용 프로그램을 나타내는 URI"
+
+#: 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 "swcatalog 폴더로 다운로드할 appstream 파일을 가리키는 URL 목록"
+
+#: 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 ""
+"모든 사용자가 활용할 시스템 경로에 AppStream 파일을 설치합니다. 거짓으로 설정"
+"했다면, 해당 파일을 비표준 $XDG_DATA_HOME/swcatalog/xml 디렉터리 경로에 설치"
+"합니다"
+
+#: 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 ""
+"선호하는 패키징 형식 우선순위에 따라 중요한 순으로 나타냅니다. 빈 배열은 기"
+"본 순서를 나타냅니다. 형식을 생략하면 가장 뒤로 정렬함을 간주합니다. 패키징 "
+"형식의 예로 deb, flatpak, rpm, snap이 있습니다."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "그놈 소프트웨어 AppStream 시스템 범위 설치 프로그램"
+
+#: 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 "내용 형식 검증에 실패했습니다: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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이(가) 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:1043
+#, 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:1048
+#, 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: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:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+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 "설치 제거(_U)"
+
+#: 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 "시스템 버스에서 D-Bus 서비스에 접근할 수 있습니다"
+
+#: 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 "세션 버스에서 D-Bus 서비스에 접근할 수 있습니다"
+
+#: 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 "%s 새 버전이 있습니다"
+
+#: 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 "%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 "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 "프로그램 설치(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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "로컬 metainfo 또는 appdata 파일 표시"
+
+#: 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 "Copyright © 2016–2022 GNOME Software contributors"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Seong-ho Cho <shcho@gnome.org>"
+
+#. 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:2147
+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 "%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: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 "제 3자 공급원에서 제공"
+
+#. 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 "공급원: %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 "%s(에)서 이름을 바꿨습니다"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "%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은(는) 자원봉사 국제 모임에서 설계, 개발, 번역합니다.\n"
+"\n"
+"원하는 언어가 아직 없을 수 있긴 하지만, 직접 참여하여 번역을 도울 수 있습니"
+"다."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "번역"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "웹사이트 번역(_T)"
+
+#. 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: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 "취소(_C)"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "로그인(_L)"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "사용자(_U)"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "암호(_P)"
+
+#. 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 "1과 %u 사이의 숫자 값을 입력하십시오: "
+
+#. 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 "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 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을(를) 설치했습니다"
+
+#. 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 "제 3자 프로그램을 설치합니까?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "제 3자 프로그램 저장소를 활성화하시겠습니까?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s 프로그램은 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">자유 오픈 소스 소프트웨어</a>가 아니며, “%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 "“%2$s”에서 %1$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 "일부 국가에서는 %s 설치 및 사용이 법에 저촉될 수 있습니다."
+
+#. 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 "수락(_A)"
+
+#. 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] "업데이트를 설치했습니다"
+
+#. 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] "프로그램을 제거했습니다"
+
+#. 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] "제대로 동작하게 하려면 다시 시작해야합니다."
+
+#. 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] "%d분 전"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d시간 전"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d일 전"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d주 전"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d달 전"
+
+#: src/gs-common.c:891
+#, 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:1246
+#, 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 "프로그램"
+
+#. 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:332
+msgid "Find in Software"
+msgstr "소프트웨어에서 찾기"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "더 보기(_S)"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "줄여보기(_S)"
+
+#: 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "설치(_I)"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "다시 시작(_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:897
+msgid "_Install…"
+msgstr "설치(_I)…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "%s의 다른 앱"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "평가를 작성하려면 인터넷 연결이 필요합니다"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "“%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 "번역 지원(_T)"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "열기(_O)"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "업데이트(_U)"
+
+#: 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 "프로젝트 웹사이트(_W)"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "기부(_D)"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "번역 기여(_T)"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "문제 보고(_R)"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "도움말(_H)"
+
+#. 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 "평가 작성(_W)"
+
+#. 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:216
+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] "%s 문자에 대응하는 글꼴"
+
+#. 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] "%s용 프로그램"
+
+#: 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 "%s이(가) 없습니다"
+
+#. 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 "%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 ""
+"빠진 프로그램 가져오기 설정 항목 같은 %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"이 형식을 지원하는 프로그램 가져오기 설정 항목 같은 %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"이 형식을 재생할 수 있는 코덱 가져오기 설정 항목 같은 %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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"이 프린터를 지원하는 드라이버 가져오기 설정 항목 같은 %s 정보는 %s에서 찾을 "
+"수 있습니다."
+
+#. 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] ""
+"안타깝게도, %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: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] ""
+"안타깝게도, %s 검색 대상을 찾지 못했습니다. 더 알아보시려면 %s을(를) 참고하십"
+"시오."
+
+#: 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 "일부 검색 결과 찾기 실패: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s 파일 형식"
+
+#: 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 "이 장치에 %s이(가) 동작할 수도 있습니다"
+
+#. 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이(가) 동작합니다"
+
+#. 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이(가) 동작하지 않을 수도 있습니다"
+
+#. 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이(가) 동작하지 않습니다"
+
+#. 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 "참여하기(_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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"이 프로그램은 봉사자 모임에서 공개 개발하며, <a href=\"%s\">%s 라이선스</a> "
+"하에 출시합니다.\n"
+"\n"
+"프로그램 개선 기여에 참여할 수 있습니다."
+
+#. 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 ""
+"이 프로그램은 봉사자 모임에서 공개 개발하며, %s 라이선스 조항 하에 출시합니"
+"다.\n"
+"\n"
+"프로그램 개선 기여에 참여할 수 있습니다."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "상업용"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "더 알아보기(_L)"
+
+#: 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 ""
+"이 프로그램은 공개적으로 개발하지 않아 동작하는 방식은 개발자만 알고 있습니"
+"다. 사용상 제약이 있을 수 있으며, 프로그램이 안전한 지 여부를 알 수 없습니"
+"다.\n"
+"\n"
+"이 프로그램에 기여하거나 개발 과정에 영향을 줄 수 없습니다."
+
+#. 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 ""
+"현재 접속 네트워크는 종량제입니다. 종량제 연결은 데이터 사용량, 속도 등을 제"
+"한하거나 해당 사용건에 대해 요금을 부과합니다. 데이터 사용량을 절약하려면 자"
+"동 업데이트를 멈춰야합니다.\n"
+"\n"
+"비 종량제 네트워크를 연결할 수 있을 경우 자동 업데이트를 재개합니다. 그때까지"
+"라도, 직접 업데이트를 설치하실 수 있습니다.\n"
+"\n"
+"대신 현재 네트워크를 종량제 네트워크로 잘못 인식했다면, 이 설정을 바꿀 수 있"
+"습니다."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "네트워크 설정 열기(_S)"
+
+#: 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:104
+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 ""
+"%s에서 추가 프로그램을 제공합니다. 일부 상업용 프로그램이 들어있습니다."
+
+#. 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 "제 3자 프로그램 저장소를 활성화하시겠습니까?"
+
+#. 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:2824
+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 "정말로 %s 저장소를 제거하시겠습니까?"
+
+#. 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 ""
+"%s에서 모든 프로그램을 제거하겠으며, 다시 사용하려면 저장소를 다시 설치해야 "
+"합니다."
+
+#. 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 "정말로 %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 프로그램을 제거하겠으며, 다시 사용하려면 설치해야 합니다."
+
+#: 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 ""
+"현재 설치한 일부 프로그램이 %s에 호환되지 않습니다. 계속하면 업그레이드를 진"
+"행하는 동안 다음 항목을 자동으로 제거합니다:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "호환성 없는 프로그램"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "계속(_C)"
+
+#. 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 "“%s”에서 설치한 프로그램이 업데이트 수신을 중단합니다."
+
+#: 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 "비활성(_D)"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "제거(_R)"
+
+#: 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 "선택한 제 3자 공급원의 추가 저장소 — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 "기본 프로그램을 공급하는 저장소는 %s에서 제공합니다."
+
+#. 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] "프로그램 %u개 설치함"
+
+#. 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개 설치함"
+
+#. 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개"
+
+#. 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개"
+
+#. 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 및 %s을(를) 설치했습니다"
+
+#. 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 "싫어요"
+
+#. 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 "게시(_P)"
+
+#: 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"<a href=\"https://odrs.gnome.org/privacy\">개인 정보 보호 정책</a>에서 어떤 "
+"데이터를 보내는지 확인해보십시오. 계정에 붙는 성명 정보는 공개됩니다."
+
+#: 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:93
+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: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 "%s은(는) 잠재적으로 불안전합니다"
+
+#. 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은(는) 불안전합니다"
+
+#. 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 "오래된 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 "다음 스크린샷"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "스크린샷이 올바르지 않습니다"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "일치하는 결과 %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 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s에서 업데이트를 다운로드할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "업데이트를 다운로드할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "업데이트를 다운로드할 수 없음: 디스크 용량 부족"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "업데이트를 다운로드할 수 없음: 인증 필요"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "업데이트를 다운로드할 수 없음: 인증 정보 잘못됨"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "%2$s에서 다운로드에 실패하여 %1$s을(를) 설치할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "%2$s 런타임이 없어 %1$s을(를) 설치할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "지원하지 않는 %s을(를) 설치할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+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:1406
+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:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "%s을(를) 설치할 수 없음: 디스크 용량 부족"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+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:1422
+#, c-format
+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:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1435
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "%s을(를) 설지할 수 없음: 배터리 잔여량 매우 부족"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "다운로드에 실패하여 %2$s에서 %1$s을(를) 업데이트할 수 없습니다"
+
+#. 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 update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "다운로드에 실패하여 %s에서 업데이트를 설치할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "다운로드에 실패하여 업데이트를 설치할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "%s을(를) 업데이트할 수 없음: 디스크 용량 부족"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, 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:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "%s을(를) 업데이트할 수 없음: 인증 필요"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, 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:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "%s을(를) 업데이트할 수 없음: 인증 정보 잘못됨"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, 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:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr "%s을(를) 업데이트할 수 없음: 프로그램 업데이트 권한 없음"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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:1582
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1602
+#, 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:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "%s을(를) 업데이트할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, 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:1658
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1679
+#, c-format
+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:1686
+#, c-format
+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:1692
+#, c-format
+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:1698
+#, c-format
+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:1704
+#, c-format
+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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1719
+#, c-format
+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:1756
+#, c-format
+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:1761
+#, c-format
+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:1766
+#, c-format
+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:1772
+#, c-format
+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:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "%s을(를) 제거할 수 없음: 배터리 잔여량이 매우 부족합니다"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "유감스럽게도 뭔가가 잘못되었군요?"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "파일 설치 실패: 지원하지 않음"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "파일 설치 실패: 인증 실패"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "설치 실패: 지원하지 않음"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+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:1961
+#, c-format
+msgid "Unable to contact %s"
+msgstr "%s에 연락할 수 없습니다"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "새 플러그인을 활용하려면 프로그램을 다시 시작해야합니다."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "교류 전원 필요"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "배터리 잔여량이 매우 부족합니다"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "프로그램 저장소(_S)"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "업데이트 기본 설정(_U)"
+
+#. 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 "더 찾아보기(_M)"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"<a href=\"dummy\">프로그램 설정(_A)</a>에서 캐시에 임시 저장한 데이터를 지울 "
+"수 있습니다."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (설치함)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (설치 중)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (제거 중)"
+
+#. 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 "%s에 설치함"
+
+#: 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] "프로그램 %u개 업데이트 함 — 다시 시작해야합니다"
+
+#. 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개 업데이트 함"
+
+#. 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 "%s 프로그램과 %s 프로그램을 업데이트했습니다."
+
+#. 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개를 다시 시작해야합니다."
+
+#. 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 "%s 새 버전을 설치할 수 있습니다"
+
+#. 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 "%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] "프로그램 업데이트를 설치했습니다"
+
+#. 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] "중요한 운영체제 업데이트를 설치했습니다."
+
+#. 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 "마지막 확인 일시: %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을(를) 더 이상 지원하지 않습니다."
+
+#: 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 "어쨌든 확인(_A)"
+
+#. 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 "어쨌든 확인(_C)"
+
+#: 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 "네트워크 설정(_N)"
+
+#: 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 "다운로드(_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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s이(가) 있습니다"
+
+#: 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 "%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:189
+#, 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 "다시 시작하고 업그레이드(_R)"
+
+#: 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 ""
+"Updates;업데이트;Upgrade;업그레이드;Sources;공급원;Repositories;저장소;"
+"Preferences;기본 설정;Install;설치;Uninstall;설치 제거;Program;프로그램;"
+"Software;소프트웨어;App;앱;Store;스토어;"
+
+# 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: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 "새 기능과 수정 사항이 들어간 %s 업데이트입니다."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS 업데이트 서비스에서 업데이트를 가져오고 적용할 수 없습니다."
+
+#: 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:404
+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 "Flatpak은 리눅스 데스크톱 프로그램용 프레임워크입니다"
+
+# flatpak 설치 범위를 나타냅니다. user vs system
+#. 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 "시스템 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "내 폴더의 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "호스트 시스템 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "/etc 호스트 시스템 설정"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "데스크톱 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "데스크톱 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "문서 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "문서 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "음악 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "음악 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "사진 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "사진 하위 폴더 %s"
+
+#: 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 "공개 공유 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "비디오 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "비디오 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "서식 폴더"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "서식 하위 폴더 %s"
+
+#: 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 "사용자 캐시 하위 폴더 %s"
+
+#: 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 "사용자 설정 하위 폴더 %s"
+
+#: 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 "사용자 데이터 하위 폴더 %s"
+
+#: 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 "사용자 실행 시간 하위 폴더 %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "파일 시스템에서 %s에 접근함"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "%s flatpak 메타데이터 가져오는 중…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "‘%s’ 추가 기능의 설치 동작 추가에 실패했습니다: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "‘%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 ""
+"원격 “%s”은(는) 필터 문제로 인해 “%s” 설치를 허용하지 않습니다. 필터를 제거하"
+"고 설치를 다시 진행하십시오. 세부 오류: %s"
+
+#. 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 장치 업데이트"
+
+# 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s 설정 업데이트"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s 카메라 업데이트"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM 업데이트"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s 터치패드 업데이트"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s 마우스 업데이트"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 저장소 컨트롤러 업데이트"
+
+#. 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 네트워크 인터페이스 업데이트"
+
+#. 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 디스플레이 업데이트"
+
+#. 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 업데이트"
+
+#. 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 "%s USB 수신기 업데이트"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+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:2687
+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 "스냅은 통합 리눅스 패키지 형식입니다"
+
+#~ 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 %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Software catalog is being downloaded"
+#~ msgstr "소프트웨어 카탈로그를 다운로드하고 있습니다"
+
+#~ msgid "Name"
+#~ msgstr "이름"
+
+# flatpak 설치 범위를 나타냅니다. user vs system
+#~ msgid "system"
+#~ 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..1f27f4e
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,7269 @@
+# 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 <EMAIL@ADDRESS>, 2014, 2015.
+# Aurimas Černius <aurisc4@gmail.com>, 2014-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: 2022-09-05 14:40+0000\n"
+"PO-Revision-Date: 2022-09-05 22:34+0300\n"
+"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
+"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\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: Gtranslator 40.0\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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Programinė įranga leidžia jums rasti ir įdiegti naujos 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 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 ""
+"Programinė įranga parodo siūlomas bei populiarias programas su naudingais "
+"aprašymais bei kelios 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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2018
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME projektas"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr "Paskutinė laiko žyma, kai sistema buvo įjungta ir atnaujinta"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Programų atsiliepimams naudojamas serveris"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Mažiausias atsiliepimų karmos įvertis"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Leisti prieigą prie programinės įrangos šaltinių dialogo"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Siūlyti atnaujinimus į negalutines versijas"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"Į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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Programinės įrangos AppStream sisteminė diegtuvė"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Amžiaus įvertinimas"
+
+#: 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 "Kai pridėti trūkstamą informaciją"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paketas"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Laukia"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Laukia diegimo"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Laukia pašalinimo"
+
+#: 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 "Įdiegta"
+
+#. 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 "Diegiama"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Šalinama"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Pašalinti"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Tinklas"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Gali komunikuoti per tinklą"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Sistemos tarnybos"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Seanso tarnybos"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Įrenginiai"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Gali pasiekti sistemos įrenginių failus"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Namų aplankas"
+
+#: 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 "Gali rodyti, redaguoti arba sukurti failus"
+
+#: 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 "Gali rodyti failus"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Atsisiuntimų aplankas"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Nustatymai"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Gali rodyti bei keisti bet kokius nustatymus"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Pasenusi vaizduoklio sistema"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Naudoja seną, nesaugią vaizduoklio sistemą"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Išėjimas iš dėžės"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Gali išeiti iš dėžės ir apeiti kitus ribojimus"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Atnaujinimo detalės"
+
+#. 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 "Nėra prieinamo atnaujinimo aprašo."
+
+#: 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 "Grįžti atgal"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Reikia papildomų leidimų"
+
+#. 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 "Atsiliepimai"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Šiai programai nėra atsiliepimų."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Nėra atsiliepimų"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versijos istorija"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nauja versijoje %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versija %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Rodyti vietinę meta informaciją arba appdata failą"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Rodyti išsamią derinimo informaciją"
+
+#: 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 update preferences"
+msgstr "Rodyti atnaujinimų nustatymus"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr ""
+"Autorių teisės saugomos © 2016–2022 GNOME Programinės įrangos pagalbininkai"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Išvertė:\n"
+"Aurimas Černius <aurisc4@gmail.com>"
+
+#. 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 "Apie programinę įrangą"
+
+#. 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 "Gražus būdas tvarkyti sistemos programinę įrangą."
+
+#. 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 "Atsiprašome! Apie šią programą nėra informacijos."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Gali pasiekti visus 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Gali gauti papildomų leidimų"
+
+#. 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 "Peržiūrėta jūsų distribucijos"
+
+#. 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 "Peržiūrėta trečiosios šalies"
+
+#. 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 "Nuosavybinis kodas"
+
+#. 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 "Audituojamas kodas"
+
+#. 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 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 "Programinė įranga daugiau nebepalaikoma"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Nesaugi"
+
+#: 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 "Tik mobiliems įrenginiams"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Veikia tik mažuose ekranuose"
+
+#: 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 "Tik darbalaukiui"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Veikia tik dideliuose ekranuose"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Ekrano dydžio neatitikimas"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Nepalaiko jūsų dabartinio ekrano dydžio"
+
+#: 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 "Reikalauja liečiamojo ekrano"
+
+#: 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 "Reikalauja klaviatūros"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Reikalauja pelės"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Reikia žaidimų valdiklio"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptyvi"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Veikia telefonuose, planšetėse ir darbalaukiuose"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Greičiausiai reikalauja klaviatūros arba pelės"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Programa neturi netinkamo turinio"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Aplankyti tinklalapį"
+
+#. 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 "Įdiegti…"
+
+#. 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 "Atsisakyti"
+
+#. 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 "Įdiegti"
+
+#. 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 "Atnaujinti"
+
+#. 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 "Pašalinti"
+
+#. 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 "Šalinama"
+
+#. 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 "Atnaujinimo metu įrenginio naudoti negalima."
+
+#. 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 "Š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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Pervadinta iš %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Padėkite išversti %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 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:5
+msgid "Translations"
+msgstr "Vertimai"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Vertimų tinklalapis"
+
+#. 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 "Reikalingas nuotolinis prisijungimas %s (sritis %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Reikia prisijungti"
+
+#: 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 "_Atsisakyti"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Prisijungti"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Na_udotojas"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Sla_ptažodis"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nauja ir atnaujinta"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Kita programinė įranga"
+
+#. 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 "Įveskite skaičių nuo 1 iki %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Pasirinkite programą:"
+
+#: 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 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 dabar įdiegta"
+
+#. 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 "Reikia paleisti iš naujo, kad pakeitimai įsigaliotų."
+
+#. 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 "Programa pasiruošusi naudojimui."
+
+#. 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 "Sistemos atnaujinimai dabar įdiegti"
+
+#. 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 "Galima parašyti atsiliepimą apie neseniai įdiegtus atnaujinimus"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Paleisti iš naujo"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Paleisti"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Įdiegti trečių šalių programinę įrangą?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Įjungti trečių šalių programinės įrangos šaltinį?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nėra <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">laisva ir atviro kodo programinė įranga</a>, o ją tiekia "
+"„%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 tiekia „%s“."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Daugiau neperspėti"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Detalios klaidos iš paketų tvarkytuvės:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detali informacija"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Priimti"
+
+#. 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] "Atnaujinimas buvo įdiegtas"
+msgstr[1] "Atnaujinimai buvo įdiegti"
+msgstr[2] "Atnaujinimai buvo įdiegti"
+
+#. 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] "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:766
+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:773
+msgid "Not Now"
+msgstr "Ne dabar"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Ką tik"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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ų"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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 "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:332
+msgid "Find in Software"
+msgstr "Rasti programinėje įrangoje"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Rodyti daugiau"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Rodyti mažiau"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Šalinama…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Diegimo užbaigimui reikia perleisti"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Laukia atnaujinimo…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Ruošiama…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Šalinama…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "Į_diegti"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "Pe_rleisti"
+
+#. 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:900
+msgid "_Install…"
+msgstr "Į_diegti…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Kitos %s programos"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "Norėdami parašyti atsiliepimą turite prisijungti prie interneto"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nepavyko rasti „%s“"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Detalių puslapis"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Įkeliamos programų detalės…"
+
+#: src/gs-details-page.ui:77
+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"
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Padėti iš_versti"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Atverti"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Atnaujinti"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Atsisiunčiama"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Priedai"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Pasirinkti priedai bus įdiegti su programa."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Įtrauktas programinė įrangos šaltinis"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Neįtrauktas programinės įrangos šaltinis"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Programinės įrangos šaltinis identifikuotas"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Naudoti tik patikimą programinę įrangą."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nėra metaduomenų"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Projekto _tinklalapis"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Paremti"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Prisidėti prie _vertimo"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "P_ranešti apie klaidą"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Žinynas"
+
+#. 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 "Raš_yti atsiliepimą"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Visi atsiliepimai"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Galimi šriftai %s scenarijui"
+msgstr[1] "Galimi šriftai %s scenarijams"
+msgstr[2] "Galimi šriftai %s scenarijų"
+
+#. 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] "%s prieinama programinė įranga"
+msgstr[1] "%s prieinama programinė įranga"
+msgstr[2] "%s prieinama programinė įranga"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Prašoma programinė įranga nerasta"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s nerasta"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "žiniatinklyje"
+
+#. 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 "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: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 ""
+"Informaciją apie %s, taip pat kaip gauti trūkstamas programas, galite rasti "
+"tinklalapyje %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 "Nėra programų %s palaikymui."
+
+#. 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 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: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 ""
+"Informaciją apie %s, taip pat kaip gauti programą, kuri gali palaikyti šį "
+"formatą, galite rasti tinklalapyje %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 "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:402
+#, 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 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 "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: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 ""
+"Informaciją apie %s, taip pat kaip gauti kodeką, kuris gali groti šį "
+"formatą, galite rasti tinklalapyje %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 "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:424
+#, 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 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 "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: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 ""
+"Informaciją apie %s, taip pat kaip gauti tvarkyklę, kuri palaiko šį "
+"spausdintuvą, galite rasti tinklalapyje %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] "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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Nepavyko rasti jokių rezultatų: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s failo formatas"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Nepavyko rasti prašomos programinės įrangos"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kodekų puslapis"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Darbalaukio palaikymas"
+
+#: 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 "Palaiko naudojimą dideliuose ekranuose"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Darbalaukio palaikymas nežinomas"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Reikalauja didelio ekrano"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Darbalaukis nepalaikomas"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Negali būti naudojama dideliuose ekranuose"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobiliųjų palaikymas"
+
+#: 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 "Veikia mažuose ekranuose"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobiliųjų palaikymas nežinomas"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Reikalauja mažo ekrano"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobilieji nepalaikomi"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Neveikia mažuose ekranuose"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Klaviatūros palaikymas"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Klaviatūros palaikymas nežinomas"
+
+#: src/gs-hardware-support-context-dialog.c:637
+msgid "Not enough information to know if keyboards are supported"
+msgstr "Nepakanka informacijos apie klaviatūros palaikymą"
+
+#: src/gs-hardware-support-context-dialog.c:639
+msgid "Keyboard Required"
+msgstr "Būtina klaviatūra"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Palaiko klaviatūrą"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Nepalaiko klaviatūros"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Negali būti naudojama su klaviatūra"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Pelės palaikymas"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Reikalauja pelės ar rodomojo įrenginio"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Pelės palaikymas nežinomas"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Būtina pelė"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Palaiko pelę ir rodomuosius įrenginius"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Pelė nepalaikoma"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Liečiamojo ekrano palaikymas"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Liečiamojo ekrano palaikymas nežinomas"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Reikia liečiamojo ekrano"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Palaiko liečiamąjį ekraną"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Nepalaiko liečiamojo ekrano"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Negali būti naudojama liečiamuoju ekranu"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Reikia žaidimų valdiklio"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Žaidimui reikalauja žaidimų valdiklio"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Žaidimų valdiklio palaikymas"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Aparatinės įrangos palaikymas"
+
+#. 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 "Įdiegta"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Įdiegtų puslapis"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Programos"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Internetinės programos"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Sisteminės programos"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Bendruomenės kūrinys"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Šią programinę įrangą sukūrė atvira pagalbininkų bendruomenė ir išleido "
+"pagal <a href=\"%s\">%s licenciją</a>.\n"
+"\n"
+"Galite prisidėti ir ją pagerinti."
+
+#. 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 ""
+"Šią programinę įrangą sukūrė atvira pagalbininkų bendruomenė ir išleido "
+"pagal %s licenciją.\n"
+"\n"
+"Galite prisidėti ir ją pagerinti."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Nuosavybinė"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Sužinoti daugiau"
+
+#: 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 ""
+"Š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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Atsisiunčiamas programinės įrangos katalogas"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Įkeliamas puslapis"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Paleidžiama…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatiniai atnaujinimai pristabdyti"
+
+#: 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 ""
+"Dabartinis tinklas yra matuojamas. Matuojami ryšiai turi duomenų ribas ir su "
+"jomis susijusias kainas. Siekiant apriboti duomenų naudojimą, automatiniai "
+"atnaujinimai buvo pristabdyti.\n"
+"\n"
+"Automatiniai atnaujinimai bus pratęsti, kai nematuojamas ryšys taps "
+"prieinamas. Iki tol galima įdiegti atnaujinimus rankiniu būdu.\n"
+"\n"
+"Taip pat, jei dabartinis tinklas buvo neteisingai identifikuotas kaip "
+"matuojamas, šį nustatymą galima pakeisti."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Atverti tinklo _nustatymus"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderuoti puslapį"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Nėra atsiliepimų, kuriuos moderuoti"
+
+#: 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: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 "Naudotojas"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Pridedama"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Šalinama"
+
+#. 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 "Atnaujinimai"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Grąžinama senesnė versija"
+
+#. 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 "pasirinkti išoriniai šaltiniai"
+
+#. 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 ""
+"Pateikia prieiga prie papildomos programinės įrangos iš %s. Įtraukia "
+"nuosavybinę programinę įrangą."
+
+#. 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 "Įjungti"
+
+#. 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 "Naršyti"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Apžvalgos puslapis"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Įjungti trečių šalių programinės įrangos šaltinius?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Kitos kategorijos"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nerasto programos duomenų"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Nežinomas"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Naudotojas neleido įdiegti"
+
+#. 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 "Paruošiama %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 "Ar tikrai norite pašalinti %s saugyklą?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Ar tikrai norite pašalinti %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 bus pašalinta, norint naudotis, reikės vėl įdiegti."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Atnaujinimų nustatymai"
+
+#: 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 ""
+"Vengiant išlaidų ir tinklo ribojimų, automatiniai atnaujinimai yra išjungti "
+"esant prisijungus prie mobilaus ar matuojamo ryšio."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatiniai atnaujinimai"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Atsisiunčia ir įdiegia atnaujinimus fone, kai galima."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Automatinių atnaujinimų pranešimai"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Rodyti pranešimus automatiškai įdiegus atnaujinimus."
+
+#. 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 ""
+"Dalis šiuo metu įdiegtos programinės įrangos nėra suderinama su %s. Jei "
+"tęsite, šie paketai bus automatiškai pašalinti atnaujinant:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Nesuderinama programinė įranga"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Tęsti"
+
+#. 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 "Programinė įranga, kuri buvo įdiegta iš „%s“, nebegaus atnaujinimų."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Išjungti saugyklą?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Pašalinti"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Įjungti naujas saugyklas"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Šie šaltiniai papildo numatytąjį %s pateiktą šaltinį."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Programinės įrangos šaltiniai"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nėra saugyklų"
+
+#. 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] "Įdiegta %u programa"
+msgstr[1] "Įdiegtos %u programos"
+msgstr[2] "Įdiegta %u programų"
+
+#. 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] "Įdiegtas %u priedas"
+msgstr[1] "Įdiegti %u priedai"
+msgstr[2] "Įdiegta %u priedų"
+
+#. 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 programa"
+msgstr[1] "%u programos"
+msgstr[2] "%u programų"
+
+#. 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 priedas"
+msgstr[1] "%u priedai"
+msgstr[2] "%u priedų"
+
+#. 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] "Įdiegta: %s ir %s"
+msgstr[1] "Įdiegta: %s ir %s"
+msgstr[2] "Įdiegta: %s ir %s"
+
+#. 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 "Šlamštas"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Nepatinka"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Gera"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Patinka"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Nuostabi"
+
+#. 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 "Prašome atsiliepimo rašymui skirti daugiau laiko"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+msgid "The summary is too short"
+msgstr "Santrauka pernelyg trumpa"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Santrauka pernelyg ilga"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Aprašas pernelyg trumpas"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Siųsti atsiliepimą"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "S_iųsti"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Įvertinimas"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Santrauka"
+
+#: src/gs-review-dialog.ui:97
+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\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Atsiliepimas"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Mūsų siunčiamus duomenis sužinosite perskaitę mūsų <a href=\"https://odrs."
+"gnome.org/privacy\">privatumo politiką</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Pranešti apie atsiliepimą?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Pranešti"
+
+#. 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 "Ar šis atsiliepimas buvo jums naudingas?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Taip"
+
+#: 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 "Šiaip sau"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Pranešti…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Šalinti…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Įsitikinkite, kad pasitikite tiekėju, nes programa nėra apribota"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+"Programa nėra apribota, bet distribucija patikrino, kad ji nekenksminga"
+
+#. 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 "Nėra leidimų"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Tinklo prieigą"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Nėra tinklo prieigos"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Naudoja sistemos tarnybas"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Naudoja seanso tarnybas"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Įrenginių prieiga"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Nėra įrenginių prieigos"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Visa failų sistemos skaitymo/rašymo prieiga"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Namų aplanko skaitymo/rašymo prieiga"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Visos failų sistemos skaitymo prieiga"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Namų aplanko skaitymo prieiga"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Atsisiuntimų aplanko skaitymo/rašymo prieiga"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Atsisiuntimų aplanko skaitymo prieiga"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Gali skaityti jūsų atsiuntimus"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Nėra failų sistemos prieigos"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Išvis negali pasiekti failų sistemos"
+
+#. 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 "Nuosavybinis kodas"
+
+#: 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 ""
+"Programos kodas nėra viešas, todėl ji negali būti nepriklausomai audituota "
+"bei gali būti nesaugi"
+
+#. 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 "Audituojamas kodas"
+
+#: 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 ""
+"Programos kodas yra viešas ir gali būti nepriklausomai audituotas, todėl "
+"programa yra tikėtinai saugi"
+
+#. 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 "Programos kūrėjas yra patikrintas"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Nesaugios priklausomybės"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 yra saugi"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s yra nesaugi"
+
+#. 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 "Saugumas"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Šaltinis"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Pasenusi SDK versija"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Nepateikta ekrano nuotrauka"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Ekrano nuotrauka nerasta"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Ekrano nuotrauka netinkama"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Paieškos puslapis"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Ieškoti programų"
+
+#: src/gs-search-page.ui:46
+msgid "No Application Found"
+msgstr "Nerasta 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Nepavyksta atsisiųsti atnaujinimų"
+
+#. 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 ""
+"Nepavyksta atsisiųsti atnaujinimų: buvo reikalinga interneto prieiga, bet "
+"nebuvo prieinama"
+
+#. 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 "Nepavyksta atsisiųsti atnaujinimų iš %s: nepakanka disko vietos"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nepavyksta atsisiųsti atnaujinimų: nepakanka disko vietos"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Nepavyksta atsisiųsti atnaujinimų: reikia patvirtinti tapatybę"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nepavyksta atsisiųsti atnaujinimų: nepavyko patvirtinti tapatybės"
+
+#. 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 ""
+"Nepavyksta atsisiųsti atnaujinimų: neturite leidimo įdiegti programinę įrangą"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Nepavyko gauti atnaujinimų sąrašo"
+
+#. 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 "Nepavyko įdiegti %s, nes nepavyko atsisiųsti iš %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 "Nepavyko įdiegti %s, nes nepavyko atsisiųsti"
+
+#. 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 "Nepavyko įdiegti %s nes vykdymo aplinka %s nėra prieinama"
+
+#. 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 "Nepavyko įdiegti %s nes nepalaikoma"
+
+#. 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 "Nepavyko įdiegti: buvo būtina interneto prieiga, bet jos nebuvo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nepavyko įdiegti: programa yra netinkamo formato"
+
+#. 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 "Nepavyko įdiegti %s: nepakanka disko vietos"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Nepavyko įdiegti %s: būtina patvirtinti tapatybę"
+
+#. 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 "Nepavyko įdiegti %s: nepavyko patvirtinti tapatybės"
+
+#. 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 "Nepavyko įdiegti %s: neturite leidimo diegti programinę įrangą"
+
+#. 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 "Nepavyko įdiegti %s: būtinas kintamosios srovės šaltinis"
+
+#. 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 "Nepavyko įdiegti %s: akumuliatorius per daug išsikrovęs"
+
+#. 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 "Nepavyko įdiegti %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 "Nepavyko atnaujinti %s iš %s, nes nepavyko atsisiųsti"
+
+#. 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 "Nepavyko atnaujinti %s, nes 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Nepavyko įdiegti atnaujinimų iš %s, nes nepavyko atsisiųsti"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nepavyko įdiegti atnaujinimų, nes nepavyko atsisiųsti"
+
+#. 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 ""
+"Nepavyko atnaujinti: buvo reikalinga interneto prieiga, bet nebuvo prieinama"
+
+#. 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 "Nepavyko atnaujinti %s: nepakanka disko vietos"
+
+#. 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 "Nepavyko įdiegti atnaujinimų: nepakanka disko vietos"
+
+#. 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 "Nepavyko atnaujinti %s: būtina patvirtinti tapatybę"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nepavyko įdiegti atnaujinimų: būtina patvirtinti tapatybę"
+
+#. 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 "Nepavyko atnaujinti %s: nepavyko patvirtinti tapatybės"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Nepavyko įdiegti atnaujinimų: nepavyko patvirtinti tapatybės"
+
+#. 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 "Nepavyko atnaujinti %s: neturite leidimo atnaujinti programinę įrangą"
+
+#. 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 ""
+"Nepavyko atnaujinti atnaujinimų: neturite leidimo atnaujinti programinę "
+"įrangą"
+
+#. 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 "Nepavyko atnaujinti %s: būtinas kintamosios srovės šaltinis"
+
+#. 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 "Nepavyko įdiegti atnaujinimų: būtinas kintamosios srovės šaltinis"
+
+#. 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 "Nepavyko atnaujinti %s: akumuliatorius per daug išsikrovę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:1604
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Nepavyko įdiegti atnaujinimų: akumuliatorius per daug išsikrovęs"
+
+#. 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 "Nepavyko atnaujinti %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nepavyko įdiegti atnaujinimų"
+
+#. 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 "Nepavyko iš esmės atnaujinti %s iš %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 "Nepavyko iš esmės atnaujinti %s, nes nepavyko atsisiųsti"
+
+#. 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 ""
+"Nepavyko iš esmės atnaujinti į %s: buvo reikalinga interneto prieiga, bet "
+"nebuvo prieinama"
+
+#. 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 "Nepavyko iš esmės atnaujinti į %s: 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nepavyko iš esmės atnaujinti į %s: 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Nepavyko iš esmės atnaujinti į %s: 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:1700
+#, 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"
+
+#. 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 "Nepavyko iš esmės atnaujinti į %s: būtinas kintamosios srovės šaltinis"
+
+#. 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 "Nepavyko iš esmės atnaujinti į %s: akumuliatorius per daug išsikrovęs"
+
+#. 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 "Nepavyko iš esmės atnaujinti į %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 "Nepavyko pašalinti %s: būtina patvirtinti tapatybę"
+
+#. 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 "Nepavyko pašalinti %s: nepavyko patvirtinti tapatybės"
+
+#. 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 "Nepavyko pašalinti %s: neturite leidimo pašalinti programinę įrangą"
+
+#. 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 "Nepavyko pašalinti %s: būtinas kintamosios srovės šaltinis"
+
+#. 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 "Nepavyko pašalinti %s: akumuliatorius per daug išsikrovęs"
+
+#. 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 "Nepavyko pašalinti %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 "Nepavyko paleisti %s: %s neįdiegta"
+
+#. 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 "Nepakanka disko vietos – atlaisvinkite vietos ir bandykite vėl"
+
+#. 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 "Atleiskite, atsitiko kažkas negero"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Nepavyko įdiegti failo: nepalaikoma"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Nepavyko įdiegti failo: nepavyko patvirtinti tapatybės"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Nepavyko įdiegti: nepalaikoma"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Nepavyko įdiegti: nepavyko patvirtinti tapatybės"
+
+#. 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 "Nepavyko susisiekti su %s"
+
+#. 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 "Reikia perleisti Programinę įrangą norint naudoti naujus įskiepius."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Būtinas kintamosios srovės šaltinis"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "Akumuliatorius per daug išsikrovęs"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Programinės įrangos šaltiniai"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Atnaujinimų nustatymai"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Tikrinti 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 "Tinklo nustatymai"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Paleisti dabar"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Daugiau informacijos"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Paieška"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Pagrindinis meniu"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Sužinokite _daugiau…"
+
+#. 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 "Atnaujinimai"
+
+#. 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 "Application Data"
+msgstr "Programos duomenys"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Bendri sistemos komponentai, kurių reikia šiai programai"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Nežinoma"
+
+#. 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 "Saugykla"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Podėlio duomenys gali būti išvalyti naudojant <a href=\"dummy\">progr_amos "
+"nustatymus</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (įdiegta)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (diegiama)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (šalinama)"
+
+#. 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 "Įdiegti atnaujinimai"
+
+#. 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 "Įdiegta %s"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "No Updates Installed"
+msgstr "Nėra įdiegtų atnaujinimų"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Programinės įrangos atnaujinimai yra pasenę"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Patikrinkite, ar yra atnaujinimų."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritinis programinės įrangos atnaujinimas paruoštas diegimui"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Svarbus programinės įrangos atnaujinimas paruoštas diegimui."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Galima atsisiųsti kritinis programinės įrangos atnaujinimą"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Svarbu: kritiniai programinės įrangos atnaujinimai laukia."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Programinės įrangos atnaujinimai paruošti diegimui"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Programinės įrangos atnaujinimai laukia diegimo."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Galima atsisiųsti programinės įrangos atnaujinimų"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Atsisiųskite laukiančius programinės įrangos atnaujinimus."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u programa atnaujinta"
+msgstr[1] "%u programos atnaujintos"
+msgstr[2] "%u programų atnaujinta"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s buvo atnaujinta."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Paleiskite programą iš naujo."
+
+#. 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 ir %s buvo atnaujintos."
+
+#. 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] "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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:401
+#, 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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Yra programinės įrangos atnaujinimų"
+
+#. 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 "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:728
+#, 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:732
+msgid "Software Upgrade Available"
+msgstr "Yra programinės įrangos atnaujinimas"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Nepavyko įdiegti atnaujinimų"
+
+#. 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 "Nepavyko įdiegti svarbaus operacinės sistemos atnaujinimo."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Rodyti detalią informaciją"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Peržiūrėti"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Nepavyko atnaujinti"
+
+#. 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 "Sistema jau buvo atnaujinta."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Paskutinį kartą tikrinta: %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 daugiau nebepalaikoma."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Jūsų operacinė sistema nebepalaikoma."
+
+#. 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 "Tai reiškia, kad daugiau nebegausite saugumo spragų taisymų."
+
+#. 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 "Rekomenduojama dabar atsinaujinti į paskutinę versiją."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Tai gali kainuoti"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Vistiek tikrinti"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nėra tinklo"
+
+#. 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 "Atnaujinimų tikrinimui reikalingas tinklo ryšys."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Tikrinti, ar yra atnaujinimų"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Atnaujinimai"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Atnaujinimų puslapis"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Įkeliami atnaujinimai…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Naujausia"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Naudoti mobiliuosius duomenis?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Vistiek tikrinti"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Nėra ryšio"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Prisijungti ir tikrinti, ar yra atnaujinimų"
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Tinklo _nustatymai"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Klaida"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Atnaujinimai tvarkomi automatiškai."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Perleisti ir atnaujinti"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Atnaujinti viską"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Programos atnaujinimai"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Įrenginio aparatinė programinė įranga"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "Prieinama %s"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Sužinokite apie naujausią versiją"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Atsisiunčiama…"
+
+#. 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 "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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Atsisiųsta %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Pe_rleisti ir įdiegti"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Prieš atnaujinant pasidarykite savo duomenų ir failų atsarginę kopiją."
+
+#: 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 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 ""
+"Atnaujinimai;Šaltiniai;Saugyklos;Nuostatos;Įdiegti;Išdiegti;Programa;"
+"Programinė;Įranga;"
+
+#. 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 "Sistemos atnaujinimai"
+
+#. 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 ""
+"Bendri sistemos atnaujinimai, tokie kaip saugumo ar klaidų taisymai, našumo "
+"pagerinimai."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Atsisiunčiami siūlomų programų paveikslėliai…"
+
+#. 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 atnaujinimas su naujomis ypatybėmis ir taisymais."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Žiniatinklis"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Atsisiunčiami atnaujinimo informacija…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Sistemos aplankas %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Namų aplankas %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Pagrindinės sistemos aplankai"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Pagrindinės sistemos konfigūracija iš /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Darbastalio aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Darbastalio poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumentų aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumentų poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Muzikos aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Muzikos poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Paveikslėlių aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Paveikslėlių poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Viešinių aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Viešinių poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Vaizdo įrašų aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Vaizdo įrašų poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Šablonų aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Šablonų poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Naudotojo podėlio aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Naudotojo podėlio poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Naudotojo konfigūracijos aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Naudotojo konfigūracijos poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Naudotojo duomenų aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Naudotojo duomenų poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Naudotojo vykdymo aplinkos aplankas"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Naudotojo vykdymo aplinkos poaplankis %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Gaunami %s flatpak metaduomenys…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"Nuotolinis „%s“ neleidžia diegti „%s“, galimai dėl jo filtro. Pašalinkite "
+"filtrą ir pakartokite diegimą. Detali klaida: %s"
+
+#. 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 į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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s kameros atnaujinimas"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM atnaujinimas"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB imtuvo atnaujinimas"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Įrenginio aparatinė programinė įranga"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Įdiegti nepasirašytą programinę įrangą?"
+
+#: 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 ""
+"Diegiama programinė įranga nepasirašyta. Nebus galima patikrinti šios "
+"programinės įrangos atnaujinimų šaltinio ar atnaujinimų integralumo."
+
+#: plugins/packagekit/gs-packagekit-task.c:153
+msgid "Download Unsigned Software?"
+msgstr "Atsisiųsti nepasirašytą programinę įrangą?"
+
+#: 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 ""
+"Yra nepasirašytų atnaujinimų. Be parašo neįmanoma patikrinti atnaujinimo "
+"šaltinio ar jo integralumo."
+
+#: plugins/packagekit/gs-packagekit-task.c:158
+msgid "Update Unsigned Software?"
+msgstr "Atnaujinti nepasirašytą programinę įrangą"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paketai"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
+
+#~ 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 "system"
+#~ msgstr "sistemai"
+
+#~ 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 "Remove"
+#~ msgstr "Pašalinti"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Nėra papildomų šaltinių"
+
+#~ msgid "_Enable"
+#~ msgstr "Į_jungti"
+
+#~ msgid "_Remove…"
+#~ msgstr "Š_alinti…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Išjungti…"
+
+#~ msgid "Disabling"
+#~ msgstr "Išjungiamas"
+
+#~ msgid "Enabled"
+#~ msgstr "Įjungtas"
+
+#~ msgid "Disabled"
+#~ msgstr "Išjungtas"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Judėjimo šoninė juosta"
+
+#~ 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 "_Restart Now"
+#~ msgstr "Pe_rleisti dabar"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s yra paruošta įdiegimui"
+
+#~ msgid "Select All"
+#~ msgstr "Žyminė viską"
+
+#~ msgid "Select None"
+#~ msgstr "Nežymėti nieko"
+
+#~ msgid "_Installed"
+#~ msgstr "Į_diegta"
+
+#~ msgid "_Updates"
+#~ msgstr "_Atnaujinimai"
+
+#~ 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 "Reference"
+#~ msgstr "Rodyklė"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Nežinoma programinės įrangos licencija"
+
+#~ 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, %R"
+#~ msgstr "Vakar, %R"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Nepavyko įrašyti failo"
+
+#~ 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 "App ID"
+#~ msgstr "Programos ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Ištrinti reklamjuostę"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "OS atnaujinimas"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Nepavyko įsigyti %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Pamiršau savo slaptažodį"
+
+#~ 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 "U_pdate All"
+#~ msgstr "_Atnaujinti viską"
+
+#~ 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 "_Install All"
+#~ msgstr "Įdiegti _viską"
+
+#~ 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 "web app"
+#~ msgstr "internetinė programa"
+
+#~ 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 "The update could not be completed."
+#~ msgstr "Atnaujinimo nepavyko užbaigti."
+
+#~ 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 "OK"
+#~ msgstr "Gerai"
+
+#~ msgid "No sources found."
+#~ msgstr "Nerasta šaltinių."
+
+#~ 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..384ab62
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,6436 @@
+# This file is distributed under the same license as the gnome-software package.
+#
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 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-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-09-03 11:32+0300\n"
+"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
+"Language-Team: Latvian <lata-l10n@googlegroups.com>\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 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 "Programmatūra"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+#| msgid "Installed Updates"
+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 applications and system "
+"extensions and remove existing installed applications."
+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 ""
+#| "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 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 ""
+"“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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME projekts"
+
+#: 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ālinātajam"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"Lielākas vērtības izvēlēšanās nozīmē mazāk apkārtceļošanas uz attālināto "
+"serveri, bet ekrānuzņēmumumu 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:81
+msgid "The server to use for application reviews"
+msgstr "Serveris, ko izmantot lietotņu recenzijām"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Recenziju minimālais karmas reitings"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+#| 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 "Saraksts ar nepieciešamajām krātuvēm, kuras nevar izslēgt vai izņemt"
+
+#: data/org.gnome.software.gschema.xml:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Ļaut piekļūt programmatūras krātuvju dialoglodziņam"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Piedāvāt uzlabojumus testa laidieniem"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+#| 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 ""
+"Saraksts ar URL, kas norāda uz appstream datnēm, kuras tiks lejupielādētas "
+"swcatalog mapē"
+
+#: data/org.gnome.software.gschema.xml:135
+#| 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 ""
+"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: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."
+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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, c-format
+#| msgid "Failed to copy: %s"
+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 references to alcohol"
+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 references to illicit drugs"
+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 references to tobacco products"
+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 nudity of any sort"
+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 references to or depictions of sexual nature"
+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 profanity of any kind"
+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 discriminatory language of any kind"
+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 advertising of any kind"
+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 gambling of any kind"
+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 ability to spend money"
+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 way to chat with other users"
+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 way to talk with other users"
+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 sharing of social network usernames or email addresses"
+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 sharing of user information with third parties"
+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 sharing of physical location with other users"
+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 references to homosexuality"
+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 references to prostitution"
+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 references to adultery"
+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 references to desecration"
+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 visible dead human remains"
+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 references to slavery"
+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 "No references to illicit drugs"
+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 "Uncontrolled chat functionality between users"
+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 "Realistic Violence"
+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
+#| msgctxt "Menu of Education & Science"
+#| msgid "Languages"
+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 "Socialize"
+msgid "Social"
+msgstr "Sociāls"
+
+#: src/gs-age-rating-context-dialog.c:547
+#| msgid "Sexual Violence"
+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:658
+#, c-format
+#| msgctxt "repo-row"
+#| msgid "%s • %s"
+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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Vecuma vērtējums"
+
+#: 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 "Kā papildināt trūkstošo informāciju"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pakotne"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Gaida"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalēšana gaida"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Izņemšana gaida"
+
+#: 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 "Instalēts"
+
+#. 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 "Instalē"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Izņem"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Atinstalēt"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Tīkls"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Var sazināties caur tīklu"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Sistēmas pakalpojumi"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Sesijas pakalpojumi"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Ierīces"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Var piekļūt sistēmas ierīču datnēm"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Mājas mape"
+
+#: 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 "Var skatīt, rediģēt un izveidot datnes"
+
+#: 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 "Var skatīt datnes"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Lejupielāžu mape"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Iestatījumi"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Var skatīt un mainīt jebkurus iestatījumus"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Mantotā attēlošanas sistēma"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Izmanto vecu, nedrošu attēlošanas sistēmu"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Izmukšana no smilškastes"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Var izkļūt no smilškastes un apiet citus ierobežojumus"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+#| msgid "The update details"
+msgid "Update Details"
+msgstr "Atjauninājumu informācija"
+
+#. 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 "Nav pieejams atjauninājumu apraksts."
+
+#: 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 "Iet atpakaļ"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Nepieciešamas papildu atļaujas"
+
+#. 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 "Atsauksmes"
+
+#: src/gs-app-reviews-dialog.ui:25
+#| msgid "Sorry! There are no details for that application."
+msgid "No reviews were found for this application."
+msgstr "Nav atrastas atsauksmes par šo lietotni."
+
+#: src/gs-app-reviews-dialog.ui:27
+#| msgid "Reviews"
+msgid "No Reviews"
+msgstr "Nav atsauksmju"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versiju vēsture"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Jaunumi versijā %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versija %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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 "Install the application (using application ID)"
+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: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 "Show verbose debugging information"
+msgstr "Rādīt izvērstu atkļūdošanas informāciju"
+
+#: 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 update preferences"
+msgstr "Rādīt atjaunināšanas 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:261 src/gs-application.c:269
+#| msgid "Copyright © 2016–2021 GNOME Software contributors"
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Autortiesības © 2016–2022 GNOME “Programmatūras” veidotāji"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Par “Programmatūru”"
+
+#. 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 "Labs veids, kā pārvaldīt programmatūru uz sava datora."
+
+#. 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 "Atvainojiet, bet par šo lietotni nav papildu informācijas."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Var piekļūt aparatūras 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:326
+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:338
+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:345
+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:352
+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:359
+#| msgid "Can access hardware devices"
+msgid "Can access arbitrary files"
+msgstr "Var piekļūt patvaļīgā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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Var saņemt patvaļīgas atļaujas"
+
+#. 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 "Distribūcija ir pārbaudījusi"
+
+#. 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 "Nodrošina trešā puse"
+
+#. 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 "Īpašnieka kods"
+
+#. 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 "Pārbaudāms kods"
+
+#. 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 "Programmatūras izstrādātājs ir pārbaudīts"
+
+#. 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 "Your OS is no longer supported."
+msgid "Software no longer supported"
+msgstr "Programmatūra vairs netiek atbalstīta"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Nedrošs"
+
+#: 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 "Tikai mobilais"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Darbojas tikai uz maziem ekrāniem"
+
+#: 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 "Tikai darbvirsma"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Darbojas tikai uz lieliem ekrāniem"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Ekrāna izmēru neatbilstība"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+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:593 src/gs-hardware-support-context-dialog.c:674
+#: src/gs-hardware-support-context-dialog.c:680
+msgid "Requires a touchscreen"
+msgstr "Nepieciešams skārienekrāns"
+
+#: 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 "Nepieciešama tastatūra"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Nepieciešama pele"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Nepieciešams spēļu kontrolieris"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptīvs"
+
+#: src/gs-app-context-bar.c:644
+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:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Droši vien ir nepieciešama tastatūra vai pele"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Nesatur vecumam neatbilstošu saturu"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Apmeklēt tīmekļa vietni"
+
+#. 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 "Instalēt…"
+
+#. 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 "Atcelt"
+
+#. 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 "Instalēt"
+
+#. 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 "Atjaunināt"
+
+#. 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 "Atinstalē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 "Atinstalē"
+
+#. 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 "Uzlabošanas laikā nevar izmantot ierīci"
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Pārdēvēt no %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Palīdziet tulkot %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 projektēja, izstrādāja un tulkoja starptautiska brīvprātīgo 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:5
+msgid "Translations"
+msgstr "Tulkojumi"
+
+#: src/gs-app-translation-dialog.ui:92
+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:82
+#, c-format
+msgid "Login required remote %s (realm %s)"
+msgstr "Attālinātajam %s vajag ierakstīties (apgabals %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Nepieciešama ierakstīšanās"
+
+#: 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 "At_celt"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Ierakstīties"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Lietotājs"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Parole"
+
+#. TRANSLATORS: this is where all applications 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
+#| msgid "All"
+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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Jaunas un atjauninātas"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Cita programmatūra"
+
+#. 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 "Lūdzu, ievadiet skaitli no 1 līdz %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Izvēlieties lietotni:"
+
+#: 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 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 tagad ir instalēts"
+
+#. 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 "Nepieciešama pārstartēšana, lai izmaiņas stātos spēkā."
+
+#. 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 "Lietotne ir gatava lietošanai."
+
+#. TRANSLATORS: this is the summary of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:84
+#| msgid "OS updates are now installed"
+msgid "System updates are now installed"
+msgstr "Sistēmas atjauninājumi tagad ir uzinstalēti"
+
+#. 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 "Nesen instalētie atjauninājumi ir pieejami atsauksmju izteikšanai"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Pārstartēt"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Palaist"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalēt trešās puses programmatūru?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Ieslēgt trešās puses programmatūras krātuves?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nav <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">brīva un atvērta programmatūra</a>, un to nodrošina “%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 nodrošina “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Vairs nebrīdināt"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+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:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Sīkāka informācija"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Pieņemt"
+
+#. 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] "Atjauninājums tika uzinstalēts"
+msgstr[1] "Atjauninājumi tika uzinstalēti"
+msgstr[2] "Atjauninājumi tika uzinstalēti"
+
+#. 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] "Lietotne ir izņemta"
+msgstr[1] "Lietotnes ir izņemtas"
+msgstr[2] "Lietotnes ir izņemtas"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Ne tagad"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Tikko"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Meklēt programmatūrā"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Rādīt vairāk"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Rādīt mazāk"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Izņem…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Jāpārstartē, lai pabeigtu instalēt"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Atjaunināšana gaida…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Sagatavo…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Atinstalē…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalēt"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "Pā_rstartē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:897
+msgid "_Install…"
+msgstr "_Instalēt…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Citas lietotnes no %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+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:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nevar atrast “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Sīkākas informācijas lapa"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Ielādē informāciju par lietotni…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Šī programmatūra nav pieejama jūsu valodā un būs pieejama ASV angļu valodā."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Palīdzi _tulkot"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Atvērt"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "Atja_unināt"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Lejupielādē"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Pielikumi"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Izvēlētie papildinājumi tiks instalēti kopā ar lietotni."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Programmatūras krātuve ir iekļauta"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Programmatūras krātuve nav iekļauta"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Programmatūras krātuve identificēta"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Izmantojiet tikai uzticamas programmatūras krātuves."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Nav metadatu"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Projekta tīmekļa _vietne"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Ziedot"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Palīdzi _tulkot"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Ziņot par problēmu"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Palīdzība"
+
+#. 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 a Review"
+msgid "_Write Review"
+msgstr "_Rakstīt atsauksmi"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+#| msgid "Reviews"
+msgid "All Reviews"
+msgstr "Visas atsauksmes"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Pieejamie fonti %s skriptam"
+msgstr[1] "Pieejamie fonti %s skriptiem"
+msgstr[2] "Pieejamie fonti %s skriptiem"
+
+#. 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] "Pieejamā programmatūra kodekam %s"
+msgstr[1] "Pieejamā programmatūra kodekiem %s"
+msgstr[2] "Pieejamā programmatūra kodekiem %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Pieprasītā programmatūra nav atrasta"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s nav atrasts"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "tīmekļa vietnē"
+
+#. 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 "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: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 ""
+"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 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 "%s atbalstam nav pieejamu lietotņu."
+
+#. 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 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: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 ""
+"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 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 "%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:402
+#, 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 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 "%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: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 ""
+"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 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 "%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:424
+#, 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 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 "%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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, 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:874
+#, c-format
+msgid "%s file format"
+msgstr "%s datnes formāts"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Nevarēja atrast pieprasīto programmatūru"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kodeku lapa"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Darbvirsmas atbalsts"
+
+#: 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 "Atbalsta izmantošanu uz lielā ekrāna"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Darbvirsmas atbalsts nav zināms"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Pieprasa lielu ekrānu"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Darbvirsma nav atbalstīta"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Nevar izmantot uz liela ekrāna"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobilais atbalsts"
+
+#: 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 "Atbalsta izmantošanu uz maza ekrāna"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobilais atbalsts nav zināms"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Pieprasa mazu ekrānu"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobilais nav atbalstīts"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Nevar izmantot uz maza ekrāna"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Tastatūras atbalsts"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Nezināms tastatūras atbalsts"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Nepieciešama tastatūra"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Atbalsta tastatūras"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tastatūras nav atbalstītas"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Nevar izmantot ar tastatūru"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Peles atbalsts"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Nepieciešama pele vai rādīšanas ierīce"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Peles atbalsts nav zināms"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Nepieciešama pele"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Atbalsta peles un rādīšanas ierīces"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Peles nav atbalstītas"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Skārienekrānu atbalsts"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Skārienekrānu atbalsts nav zināms"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Nepieciešams skārienekrāns"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Atbalsta skārienekrānus"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Skārienekrāni nav atbalstīti"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Nevar izmantot ar skārienekrānu"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Nepieciešams spēļu kontrolieris"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Nepieciešams spēļu kontrolieris"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Spēļu kontroliera atbalsts"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s strādā 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Aparatūras atbalsts"
+
+#. 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 "Instalētās"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Instalētās lapas"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Lietotnes"
+
+#: src/gs-installed-page.ui:95
+#| msgid "Applications"
+msgid "Web Applications"
+msgstr "Tīmekļa lietotnes"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Sistēmas lietotnes"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Kopienas veidots"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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: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."
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Šī programmatūra tika izstrādāta atvērtā brīvprātīgo kopienā un tā ir "
+"izlaista zem <a href=\"%s\">%s licences</a>.\n"
+"\n"
+"Jūs varat sniegt savu ieguldījumu un padarīt to vēl labāku."
+
+#. 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 ""
+"Šī programmatūra tika izstrādāta atvērtā brīvprātīgo kopienā un tā ir "
+"izlaista zem %s licences.\n"
+"\n"
+"Jūs varat sniegt savu ieguldījumu un padarīt to vēl labāku."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Īpašnieka"
+
+#: src/gs-license-tile.c:133
+#| msgid "Learn"
+msgid "_Learn More"
+msgstr "_Uzzināt vairāk"
+
+#: src/gs-license-tile.c:135
+#| 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 ""
+"Šī 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: initial start
+#: src/gs-loading-page.c:56
+#| msgid "Downloading featured images…"
+msgid "Downloading software catalog"
+msgstr "Lejupielādē programmatūras katalogu"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Ielādē lapu"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Startējas…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automātiska atjaunināšana ir pauzēta"
+
+#: 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 ""
+"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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Atvērt tīkla ie_statījumus"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderācijas lapa"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Nav atsauksmju, ko pārbaudīt"
+
+#: src/gs-origin-popover-row.c:104
+#| msgid "Unknown"
+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:108
+msgid "Beta"
+msgstr "Beta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+#| msgid "_User"
+msgid "User"
+msgstr "Lietotājs"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Pievienotās"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Izņemtās"
+
+#. 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 "Atjauninājumi"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Pazeminājumi"
+
+#. 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 "izvēlētie ārējie avoti"
+
+#. 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 ""
+"Sniedz pieeju papildu programmatūrai no %s. Tajā ir iekļauta arī "
+"īpašniekprogrammatūra."
+
+#. 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 "Ieslēgt"
+
+#. 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 "Pārskatīt"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Pārskata lapa"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Ieslēgt trešās puses programmatūras krātuves?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Citas kategorijas"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nav atrastu lietotņu datu"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Nezināma"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Lietotāja liegta instalācija"
+
+#. 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 "Sagatavot %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 "Vai tiešām vēlaties izņemt %s krātuvi?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Vai tiešām vēlaties atinstalēt %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 tiks atinstalēta. Lai to lietotu atkal, tā būs jāuzinstalē."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Atjaunināšanas iestatījumi"
+
+#: 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 ""
+"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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automātiska atjaunināšana"
+
+#: src/gs-prefs-dialog.ui:20
+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."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Automātiskās atjaunināšanas paziņojumi"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Rādīt paziņojumus, kad atjauninājumi ir automātiski uzinstalēti."
+
+#. 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 ""
+"Daļa no pašlaik instalētās programmatūras nav savienojama ar %s. Ja "
+"turpināsiet, uzlabošanas laikā tiks automātiski izņemtas:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Nesavietojamā programmatūra"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Turpināt"
+
+#. 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 receive updates."
+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."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Deaktivizēt krātuvi"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Izņemt"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Aktivizēt jaunas krātuves"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Programmatūras krātuves"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nav krātuvju"
+
+#. 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] "Instalēta %u lietotne"
+msgstr[1] "Instalētas %u lietotnes"
+msgstr[2] "Instalētas %u lietotnes"
+
+#. 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] "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 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 lietotne"
+msgstr[1] "%u lietotnes"
+msgstr[2] "%u lietotņ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-repo-row.c:181
+#, 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 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 un %s instalēts"
+msgstr[1] "%s un %s instalēti"
+msgstr[2] "%s un %s instalēti"
+
+#. 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 "Nevaru ciest"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Nepatīk"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Ir labi"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Patīk"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Esmu sajūsmā"
+
+#. 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 "Lūdzu, veltiet vairāk laika, rakstot atsauksmi"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+msgid "The summary is too short"
+msgstr "Kopsavilkums ir pārāk īss"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Kopsavilkums ir pārāk garš"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Apraksts ir pārāk īss"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publicēt atsauksmi"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Sūtīt"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Vērtējums"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Kopsavilkums"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Sniedziet atsauksmes kopsavilkumu, piemēram: “Lieliska programma, iesaku”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Atsauksme"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+#| msgid ""
+#| "Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+#| "\">privacy policy</a>."
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Mūsu <a href=\"https://odrs.gnome.org/privacy\">privātuma politikā</a> 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Ziņot par atsauksmi?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Ziņot"
+
+#. 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 "Vai šī atsauksme bija noderīga?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Jā"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nē"
+
+#. 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 "Ziņot…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Izņemt…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Pārliecinieties, ka uzticaties piegādātājam, jo lietotne nav ierobežota "
+"smilškastē"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Nav atļauju"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Piekļuve tīklam"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Nav piekļuve tīklam"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Izmanto sistēmas pakalpojumus"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Izmanto sesijas pakalpojumus"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Piekļuve ierīcēm"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Nav piekļuve ierīcēm"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Lasīšanas/rakstīšanas piekļuve mājas mapei"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Pilnas tiesības lasīt datņu sistēmā"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Lasīšanas piekļuve mājas mapei"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Lasīšanas/rakstīšanas piekļuve lejupielāžu mapei"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Lasīšanas piekļuve lejupielāžu mapei"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+#| msgid "Can read and write all data in your home directory"
+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:310
+#| msgid "Can read all data in your home directory"
+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:326
+msgid "No File System Access"
+msgstr "Tiesība tiesības piekļūt datņu sistēmai"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Vispār nevar piekļūt datņu sistēmai"
+
+#. 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 "Īpašnieka kods"
+
+#: 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 ""
+"Pirmkods nav publisks, tāpēc to nevar neatkarīgi pārbaudīt un tas varētu būt "
+"nedrošs"
+
+#. 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 "Pārbaudāms kods"
+
+#: 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 ""
+"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: 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 "Lietotnes izstrādātājs ir pārbaudīts"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+#| msgid "Required Dependencies"
+msgid "Insecure Dependencies"
+msgstr "Nedrošas atkarības"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 ir droš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 "%s ir potenciāli nedrošs"
+
+#. 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 ir nedrošs"
+
+#. 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 "Drošība"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Avots"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Novecojusi SDK versija"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ekrānattēls nav nodrošināts"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Ekrānattēls nav atrasts"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Ekrānattēls nav derīgs"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Meklēšanas lapa"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Meklēt lietotnes"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, c-format
+#| msgid "“%s”"
+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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Nevar lejupielādēt atjauninājumus"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nevar lejupielādēt atjauninājumus: nepietiek diska vietas"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Nevar lejupielādēt atjauninājumus: bija vajadzīga autentifikācija"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nevar lejupielādēt atjauninājumus: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Nevar iegūt atjauninājumu sarakstu"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Nevar instalēt %s, jo neizdevās lejupielādēt no %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Nevar instalēt %s, jo neizdevās lejupielādēt"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Nevar instalēt %s, jo izpildlaiks %s nav pieejams"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Nevar instalēt %s, jo nav atbalstīta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Nevar instalēt: bija nepieciešama pieeja internetam, bet tā nebija pieejama"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nevar instalēt: lietotnei ir nederīgs formāts"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Nevar instalēt %s: nepietiek diska vietas"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Nevar instalēt %s: bija vajadzīga autentifikācija"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Nevar instalēt %s: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Nevar instalēt %s: ir vajadzīgs maiņstrāvas pieslēgums"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Nevar instalēt %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Nevar atjaunināt %s no %s, jo neizdevās lejupielādēt"
+
+#. 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 update %s as download failed"
+msgstr "Nevar atjaunināt %s, jo 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Nevar instalēt atjauninājumus no %s, jo neizdevās lejupielādēt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nevar instalēt atjauninājumus, jo neizdevās lejupielādēt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Nevar atjaunināt: bija nepieciešama pieeja internetam, bet tā nebija pieejama"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Nevar instalēt atjauninājumus: nepietiek vietas uz diska"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Nevar atjaunināt %s: bija vajadzīga autentifikācija"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nevar instalēt atjauninājumus: bija vajadzīga autentifikācija"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Nevar atjaunināt %s: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Nevar instalēt atjauninājumus: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Nevar atjaunināt %s: ir vajadzīgs maiņstrāvas pieslēgums"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Nevar atjaunināt %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nevar instalēt atjauninājumus"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Nevar uzlabot uz %s, jo neizdevās lejupielādēt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Nevar uzlabot uz %s: 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nevar uzlabot uz %s: bija 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Nevar uzlabot uz %s: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Nevar uzlabot uz %s: ir vajadzīgs maiņstrāvas pieslēgums"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Nevar uzlabot uz %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Nevar noņemt %s: bija vajadzīga autentifikācija"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Nevar noņemt %s: autentifikācija bija nederīga"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Nevar noņemt %s: ir vajadzīgs maiņstrāvas pieslēgums"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Nevar noņemt %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Nepietika diska vietas — atbrīvojiet kādu vietu un mēģiniet vēlreiz"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Diemžēl kaut kas nogāja greizi"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Neizdevās instalēt datni: nav atbalstīta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Neizdevās instalēt datni: autentifikācija neizdevās"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Neizdevās instalēt: nav atbalstīts"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Neizdevās instalēt: autentifikācija neizdevās"
+
+#. 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 "Nevar sazināties ar %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "“Programmatūru” vajag pārstartēt, lai lietotu jaunos spraudņus."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Ir vajadzīgs maiņstrāvas pieslēgums"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Baterijā ir pārāk maz enerģijas"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Programmatūra_s krātuves"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Atja_unināšanas iestatījumi"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Pārbaudīt disku"
+
+#. 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 "Tīkla iestatījumi"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Pārstartēt tagad"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Vairāk informācijas"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Meklēt"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Galvenā izvēle"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Uzzināt _vairāk"
+
+#. 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 "Atjauninājumi"
+
+#. 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 "Application Data"
+msgstr "Lietotnes dati"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Koplietotās sistēmas komponentes, kas ir nepieciešamas šai lietotnei"
+
+#: src/gs-storage-context-dialog.c:188
+#| msgid "Unknown"
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Nezināms"
+
+#. 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 "Krātuve"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Kešatmiņas datus var izdzēst <a href=\"dummy\">_lietotņu iestatījumos</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (instalēts)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (instalē)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (izņem)"
+
+#. 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 "Instalētās lietotnes"
+
+#. 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 "Instalēts %s"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "No Updates Installed"
+msgstr "Nav instalētu atjauninājumu"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Programmatūras atjauninājumi ir novecojuši"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Lūdzu, pārbaudiet programmatūras atjauninājumus."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritiski programmatūras atjauninājumi ir gatavi instalēšanai"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Svarīgs programmatūras atjauninājumus ir gatavs instalēšanai."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritiski programmatūras atjauninājumi ir pieejami lejupielādēšanai"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Svarīgi: rindā gaida kritiski programmatūras atjauninājumi."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Programmatūras atjauninājums ir gatavi instalēšanai"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Programmatūras atjauninājumi gaida un ir gatavi instalēšanai."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Programmatūras atjauninājumi ir pieejami lejupielādēšanai"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Lūdzu, lejupielādējiet gaidošos programmatūras atjauninājumus."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications 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 application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s tika atjaunināts."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Lūdzu, pārstartējiet lietotni."
+
+#. 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 un %s tika atjaunināti."
+
+#. 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 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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:401
+#, 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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Operētājsistēmai atjauninājumi nav pieejami"
+
+#. 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 ""
+"Pārejiet uz jaunāku OS versiju, lai turpinātu saņemt drošības atjauninājumus."
+
+#. 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 "Jauna %s versija ir pieejama instalēšanai"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Pieejami programmatūras atjauninājumi"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Neizdevās atjaunināt programmatūru"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:1139
+#| msgid "An important OS update failed to be installed."
+msgid "An important operating system update failed to be installed."
+msgstr "Neizdevās uzinstalēt svarīgu operētājsistēmas atjauninājumu."
+
+#: src/gs-update-monitor.c:1140
+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:1162
+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:1167
+#, 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:1173
+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:1177
+#| 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] "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 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 "Pārskats"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Pēdējo reizi pārbaudīts: %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 vairs netiek atbalstīta."
+
+#: src/gs-updates-page.c:563
+#| msgid "Your OS is no longer supported."
+msgid "Your operating system is no longer supported."
+msgstr "Jūsu operētājsistēma vairs netiek atbalstīta."
+
+#. 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 "Tas nozīmē, ka tā vairs nesaņem drošības atjauninājumus."
+
+#. 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 "Ieteicams uzlabot OS uz jaunāku versiju."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Var tikt piemērota maksa"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Tomēr pārbaudīt"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nav tīkla"
+
+#. 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 "Lai pārbaudītu atjauninājumus, nepieciešama piekļuve internetam."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Pārbaudīt atjauninājumus"
+
+#: src/gs-updates-page.c:1286
+#| msgid "Updates"
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Atjauninājumi"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Atjauninājumu mape"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Ielādē atjauninājumus…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Aktuāls"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Izmantojat mobilos datus?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Tomēr pārbaudīt"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Nav savienojuma"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Doties tiešsaistē, lai pārbaudītu atjauninājumus."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Tīkla iestatījumi"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Kļūda"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Atjauninājumi tika automātiski sapludināti."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Pārstartēt un atjaunināt"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Atjaunināt visu"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Lietotņu atjauninājumi"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Ierīces aparātprogrammatūra"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+#| msgid "%s %s Available"
+msgid "%s Available"
+msgstr "%s ir pieejams"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Uzziniet par jauno versiju"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Lejupielādē…"
+
+#. 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 "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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Lejupielādēti %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Pā_rstartēt un uzlabot"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Pirms uzlabošanas atcerieties izveidot datu un datņu dublējumu."
+
+#: 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 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 ""
+"Atjauninājumi;Uzlabojumi;Avoti;Krātuves;Repozitoriji;Iestatījumi;Instalēt;"
+"Uzstādīt;Atinstalēt;Noņemt;Programmatūra;Lietotne;Veikals;"
+
+#. 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 "%s System Update"
+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:72
+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: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Lejupielādē piedāvātos attēlus…"
+
+#. Translators: The '%s' is replaced with the OS name, like "Endless OS"
+#: plugins/eos-updater/gs-plugin-eos-updater.c:637
+#, c-format
+#| msgid "An Endless OS update with new features and fixes."
+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:970
+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:498
+#| msgid "GNOME Software"
+msgid "GNOME Web"
+msgstr "GNOME tīmeklis"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Lejupielādē informāciju par uzlabojumiem…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+#| msgid "System Services"
+msgid "System folder %s"
+msgstr "Sistēmas mape %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+#| msgid "Home folder"
+msgid "Home subfolder %s"
+msgstr "Mājas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+#| msgid "Home folder"
+msgid "Host system folders"
+msgstr "Saimniekdatora sistēmas mapes"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Saimniekdatora sistēmas konfigurācija no /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#| msgid "Desktop Only"
+msgid "Desktop folder"
+msgstr "Darbvirsmas mape"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+#| msgid "Desktop Support"
+msgid "Desktop subfolder %s"
+msgstr "Darbvirsmas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#| msgid "Home folder"
+msgid "Documents folder"
+msgstr "Dokumentu mape"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+#| msgid "Home folder"
+msgid "Documents subfolder %s"
+msgstr "Dokumentu apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music folder"
+msgstr "Mūzikas mape"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music subfolder %s"
+msgstr "Mūzikas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#| msgid "Picture"
+msgid "Pictures folder"
+msgstr "Bilžu mape"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Bilžu apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Publiska koplietošanas mape"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Publiska koplietošanas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#| msgid "Home folder"
+msgid "Videos folder"
+msgstr "Video mape"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+#| msgid "%s is suitable for %s"
+msgid "Videos subfolder %s"
+msgstr "Video apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#| msgid "Home folder"
+msgid "Templates folder"
+msgstr "Veidņu mape"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Veidņu apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Lietotāja kešatmiņas mape"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Lietotāja kešatmiņas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#| msgid "%s Configuration Update"
+msgid "User configuration folder"
+msgstr "Lietotāja konfigurācijas mape"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+#| msgid "%s Configuration Update"
+msgid "User configuration subfolder %s"
+msgstr "Lietotāja konfigurācijas apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#| msgid "User Data"
+msgid "User data folder"
+msgstr "Lietotāja datu mape"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Lietotāja datu apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#| msgid "Home folder"
+msgid "User runtime folder"
+msgstr "Lietotāja izpildlaika mape"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Lietotāja izpildlaika apakšmape %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+#| msgid "No File System Access"
+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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Saņem %s flatpak metadatus…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Attālinātais “%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: 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, c-format
+#| msgid "%s Controller Update"
+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:215
+#, c-format
+#| msgid "%s Controller Update"
+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:220
+#, c-format
+#| msgid "%s Device Update"
+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:225
+#, c-format
+#| msgid "%s ME Update"
+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:230
+#, c-format
+#| msgid "%s Device Update"
+msgid "%s USB Receiver Update"
+msgstr "%s USB uztvērēja atjauninājums"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Aparātprogrammatūra"
+
+#: 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:148
+#| msgid "Install Third-Party Software?"
+msgid "Install Unsigned Software?"
+msgstr "Instalēt neparakstītu programmatūru?"
+
+#: 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 ""
+"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:153
+#| msgid "Find in Software"
+msgid "Download Unsigned Software?"
+msgstr "Lejupielādēt neparakstītu programmatūru?"
+
+#: 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 ""
+"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:158
+#| msgid "Find in Software"
+msgid "Update Unsigned Software?"
+msgstr "Atjaunināt neparakstītu programmatūru?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pakotnes"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ 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 "system"
+#~ msgstr "sistēmas"
+
+#~ 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 "_Installed"
+#~ msgstr "_Instalētās"
+
+#~ msgid "_Updates"
+#~ msgstr "_Atjauninājumi"
+
+#~ msgid "Remove"
+#~ msgstr "Izņemt"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Nezināma programmatūras licence"
+
+#~ 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 "_Enable"
+#~ msgstr "I_eslēgt"
+
+#~ 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, %R"
+#~ msgstr "Vakar, %R"
+
+#~ 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 "Restart Now"
+#~ msgid "_Restart Now"
+#~ msgstr "Pā_rstartēt tagad"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s ir gatavs instalēšanai"
+
+#~ 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 "Reference"
+#~ msgstr "Uzziņ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 "Failed to save file"
+#~ msgstr "Neizdevās saglabāt datni"
+
+#~ 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 "App ID"
+#~ msgstr "Lietotnes ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Dzēst dizainu"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "OS uzlabojumi"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Nevar iegādāties %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Aizmirsu savu paroli"
+
+#~ 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 "U_pdate All"
+#~ msgstr "_Atjaunināt visu"
+
+#~ 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 <jor.teron@gmail.com>, 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 <jor.teron@gmail.com>\n"
+"Language-Team: Karbi <karbi.translation@gmail.com>\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 <jor.teron@gmail.com>"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+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 <hijas.ht@gmail.com>, 2018.
+# Ranjith Siji <ranjith.sajeev@gmail.com>, 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 <ranjith.sajeev@gmail.com>\n"
+"Language-Team: Malayalam <l10n@lists.smc.org.in>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr "%s എന്നത് <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\"> സ്വതന്ത്രവും സ്വതന്ത്രവുമായ സോഫ്റ്റ്വെയർ </a> അല്ല, കൂടാതെ അത് \"%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 <roddy@endlessm.com>, 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 <roddy@endlessm.com>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, 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 <abuyop@gmail.com>, 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 <abuyop@gmail.com>\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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s bukan <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">perisian bebas dan bersumber terbuka</a>, 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+msgstr ""
+"Cari apakah data yang dihantar dalam <a href=\"https://odrs.gnome.org/privacy"
+"\">dasar kerahsiaan</a> 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..756a1c2
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,5246 @@
+# Norwegian bokmål translation of gnome-software.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-packagekit package.
+# Kjartan Maraas <kmaraas@gnome.org>, 2007-2021.
+# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
+# Harald H. <haarektrans@gmail.com>, 2015.
+# po
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-software 4.0\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2022-01-11 16:44+0000\n"
+"PO-Revision-Date: 2022-01-17 00:13+0100\n"
+"Last-Translator: Børge A. Roum\n"
+"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\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-DamnedLies-Scope: partial\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:7
+msgid "GNOME Software"
+msgstr "GNOME Programvare"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Programhåndtering for 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 ""
+"Programvare lar deg finne og installere nye programmer og systemutvidelser "
+"samt fjerne eksisterende installerte programmer."
+
+#: 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 programvare viser utvalgte og populære programmer med nyttige "
+"beskrivelser og flere skjermbilder for hvert program. Programmer kan finnes "
+"ved å bla gjennom listen med kategorier eller ved å søke. Det lar deg også "
+"oppdatere systemet ved bruk av frakoblet oppdatering."
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "Oversiktspanel"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Details panel"
+msgstr "Panel med detaljer"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Installed panel"
+msgstr "Panel med installert programvare"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+#: data/appdata/org.gnome.Software.appdata.xml.in:45
+msgid "Updates panel"
+msgstr "Panel med oppdateringer"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:49
+msgid "The update details"
+msgstr "Vis detaljer for oppdatering"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1766
+msgid "The GNOME Project"
+msgstr "GNOME prosjektet"
+
+#: data/org.gnome.software.external-appstream.policy.in.in:11
+msgid "Install an appstream file into a system location"
+msgstr "Installer en appstream-fil i en systemlokasjon"
+
+#: data/org.gnome.software.external-appstream.policy.in.in:12
+msgid "Installing an appstream file into a system location"
+msgstr "Installerer en appstream-fil i en systemlokasjon"
+
+#: data/org.gnome.software.gschema.xml:5
+msgid "A list of compatible projects"
+msgstr "En liste med kompatible objekter"
+
+#: 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 med kompatible prosjekter vi bør vise slik som GNOME, KDE "
+"og XFCE."
+
+#: data/org.gnome.software.gschema.xml:10
+msgid "Whether to manage updates and upgrades in GNOME Software"
+msgstr ""
+"Hvorvidt oppdateringer og oppgraderinger skal håndteres i GNOME programvare"
+
+#: data/org.gnome.software.gschema.xml:15
+msgid "Automatically download and install updates"
+msgstr "Last ned og installer oppdateringer automatisk"
+
+#: data/org.gnome.software.gschema.xml:25
+msgid "Whether to automatically refresh when on a metered connection"
+msgstr ""
+"Hvorvidt oppdateringer skal lastes ned automatisk på en betalt tilkobling"
+
+#: data/org.gnome.software.gschema.xml:47
+msgid "A list of popular applications"
+msgstr "En liste med populære programmer"
+
+#: data/org.gnome.software.gschema.xml:60
+msgid "The last update notification timestamp"
+msgstr "Tidsstempel for forrige varsling om oppdateringer"
+
+#: data/org.gnome.software.gschema.xml:68
+msgid "The last update timestamp"
+msgstr "Tidsstempel for forrige oppdatering"
+
+#: data/org.gnome.software.gschema.xml:140
+#, 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/app-info/xmls "
+"directory"
+msgstr "Installer AppStream-filene i en systemlokasjon for alle brukere"
+
+#. 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 "GNOME programvare AppStream systeminstallasjon"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+msgid "Failed to parse command line arguments"
+msgstr "Klarte ikke å tolke kommandolinjeargumenter"
+
+#. 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 "Du må oppgi eksakt ett filnavn"
+
+#. 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 "Dette programmet kan kun brukes av root-brukeren"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, fuzzy, c-format
+#| msgid "Failed to validate content type"
+msgid "Failed to validate content type: %s"
+msgstr "Klarte ikke å validere innholdstype"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, fuzzy, c-format
+#| msgid "Unable to remove %s"
+msgid "Failed to move: %s"
+msgstr "Kan ikke fjerne %s"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Installer programvare"
+
+#: src/gnome-software-local-file.desktop.in:4
+msgid "Install selected software on the system"
+msgstr "Installer utvalgt programvare på systemet"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:78
+msgid "Cartoon Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:85
+msgid "Fantasy Violence"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:92
+msgid "Realistic Violence"
+msgstr "Realistisk vold"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:99
+msgid "Violence Depicting Bloodshed"
+msgstr "Vold som viser blod"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:106
+msgid "Sexual Violence"
+msgstr "Seksuell vold"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:113
+msgid "Alcohol"
+msgstr "Alkohol"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:120
+msgid "Narcotics"
+msgstr "Ulovlige rusmidler"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:127
+msgid "Tobacco"
+msgstr "Tobakk"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:134
+msgid "Nudity"
+msgstr "Nakenhet"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:141
+msgid "Sexual Themes"
+msgstr "Seksuelle temaer"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:148
+msgid "Profanity"
+msgstr "Grovt språk"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:155
+msgid "Inappropriate Humor"
+msgstr "Usømmelig humor"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:162
+#, fuzzy
+#| msgid "Documentation"
+msgid "Discrimination"
+msgstr "Dokumentasjon"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:169
+msgid "Advertising"
+msgstr "Reklame"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:176
+#, fuzzy
+#| msgid "Enabling"
+msgid "Gambling"
+msgstr "Slår på"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:183
+msgid "Purchasing"
+msgstr "Kjøp"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:190
+msgid "Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:197
+msgid "Audio Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:204
+#, fuzzy
+#| msgid "Show Details"
+msgid "Contact Details"
+msgstr "Vis detaljer"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:211
+#, fuzzy
+#| msgid "More Information"
+msgid "Identifying Information"
+msgstr "Mer informasjon"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:218
+msgid "Location Sharing"
+msgstr "Deling av lokasjon"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:241
+msgid "Homosexuality"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:248
+msgid "Prostitution"
+msgstr "Sexsalg"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:255
+msgid "Adultery"
+msgstr "Utroskap"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:262
+msgid "Sexualized Characters"
+msgstr "Seksualiserte karakterer"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:269
+msgid "Desecration"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:276
+msgid "Human Remains"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:283
+msgid "Slavery"
+msgstr "Slaveri"
+
+#. Translators: This refers to a content rating attribute which
+#. * has an unknown value. For example, the amount of violence in
+#. * an app is ‘Unknown’.
+#: src/gs-age-rating-context-dialog.c:338
+#, fuzzy
+#| msgctxt "origin"
+#| msgid "Unknown"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#. 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.
+#. TRANSLATORS: this is a subcategory matching all the
+#. * different apps in the parent category, e.g. "Games"
+#: src/gs-age-rating-context-dialog.c:605 lib/gs-category.c:214
+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 application is not known. The bubble is small,
+#. * so the string should be as short as possible.
+#: src/gs-age-rating-context-dialog.c:618 src/gs-app-context-bar.c:194
+#: src/gs-storage-context-dialog.c:87
+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:684
+#, 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:688
+#, c-format
+msgid "%s is suitable for toddlers"
+msgstr "%s er egnet for babyer"
+
+#. 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:692
+#, c-format
+msgid "%s is suitable for young children"
+msgstr "%s er egnet for små 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:700
+#, c-format
+msgid "%s is suitable for teenagers"
+msgstr "%s er egnet for tenåringer"
+
+#. 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:704
+#, fuzzy, c-format
+#| msgid "%s file format"
+msgid "%s is suitable for adults"
+msgstr "%s filformat"
+
+#. 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:709
+#, 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:5 src/gs-app-context-bar.ui:241
+msgid "Age Rating"
+msgstr "Aldersrangering"
+
+#: src/gs-age-rating-context-dialog.ui:81
+#: src/gs-hardware-support-context-dialog.ui:81
+#: src/gs-safety-context-dialog.ui:231
+#, fuzzy
+#| msgid "Show verbose debugging information"
+msgid "How to add missing information"
+msgstr "Vis detaljert feilsøkingsinformasjon"
+
+#: lib/gs-app.c:5712
+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:5728 src/gs-safety-context-dialog.c:406
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:5804
+msgid "Package"
+msgstr "Pakke"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:443
+msgid "Pending"
+msgstr "Utestående"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:447 src/gs-details-page.c:327
+#, fuzzy
+#| msgid "Pending installation…"
+msgid "Pending install"
+msgstr "Utestående installasjon …"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:451 src/gs-details-page.c:334
+#, fuzzy
+#| msgid "Pending"
+msgid "Pending remove"
+msgstr "Utestående"
+
+#. 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-app-addon-row.c:111 src/gs-app-row.ui:174 src/gs-app-tile.ui:50
+#: src/gs-feature-tile.c:402 src/gs-installed-page.c:712 src/gs-shell.ui:298
+msgid "Installed"
+msgstr "Installert"
+
+#. 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:196 src/gs-details-page.c:320
+msgid "Installing"
+msgstr "Installerer"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Fjerner"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Avinstaller"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Nettverk"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Kan kommunisere over nettverk"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Systemtjenester"
+
+#: src/gs-app-details-page.c:69
+msgid "Can access D-Bus services on the system bus"
+msgstr "Kan aksessere D-Bus tjenester på systembussen"
+
+#: src/gs-app-details-page.c:70
+msgid "Session Services"
+msgstr "Økttjenester"
+
+#: src/gs-app-details-page.c:70
+msgid "Can access D-Bus services on the session bus"
+msgstr "Kan aksessere D-Bus-tjenester på øktbussen"
+
+#: src/gs-app-details-page.c:71
+msgid "Devices"
+msgstr "Enheter"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Kan aksessere enhetsfiler for systemet"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Hjemmemappe"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:74
+#: src/gs-app-details-page.c:76
+msgid "Can view, edit and create files"
+msgstr "Kan vise, redigere og opprette filer"
+
+#: src/gs-app-details-page.c:73 src/gs-app-details-page.c:75
+#: src/gs-app-details-page.c:77
+msgid "Can view files"
+msgstr "Kan vise filer"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+msgid "File system"
+msgstr "Filsystem"
+
+#: src/gs-app-details-page.c:76 src/gs-app-details-page.c:77
+msgid "Downloads folder"
+msgstr "Mappe for nedlastinger"
+
+#: src/gs-app-details-page.c:78
+msgid "Settings"
+msgstr "Innstillinger"
+
+#: src/gs-app-details-page.c:78
+msgid "Can view and change any settings"
+msgstr "Kan vise og endre alle innstillinger"
+
+#: src/gs-app-details-page.c:79
+msgid "Legacy display system"
+msgstr "Gammelt skjermsystem"
+
+#: src/gs-app-details-page.c:79
+msgid "Uses an old, insecure display system"
+msgstr "Bruker et gammelt og usikkert skjermsystem"
+
+#: src/gs-app-details-page.c:80
+msgid "Sandbox escape"
+msgstr "Kan unslippe sandkasse"
+
+#: src/gs-app-details-page.c:80
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Kan unslippe sandkassen og omgå andre begrensninger"
+
+#. Translators: This is the source and upgrade version of an
+#. * application, shown to the user when they view more detailed
+#. * information about pending updates. The source is of the form
+#. * ‘deja-dup’ (a package name) or
+#. * ‘app/org.gnome.Builder/x86_64/main’ (a flatpak ID), and the
+#. * version is of the form ‘40.4-1.fc34’ (a version number).
+#: src/gs-app-details-page.c:139
+#, c-format
+msgid "%s %s"
+msgstr ""
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-app-details-page.c:158
+msgid "No update description available."
+msgstr "Ingen beskrivelse tilgjengelig for oppdateringen."
+
+#: src/gs-app-details-page.ui:25 src/gs-shell.ui:358 src/gs-shell.ui:449
+msgid "Go back"
+msgstr "Gå tilbake"
+
+#: src/gs-app-details-page.ui:47 src/gs-app-row.c:502
+msgid "Requires additional permissions"
+msgstr "Krever flere rettigheter"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:473
+msgid "Version History"
+msgstr "Versjonshistorikk"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nytt i versjon %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versjon %s"
+
+#: src/gs-app-version-history-row.c:80
+msgid "No details for this release"
+msgstr "Ingen detaljer for denne versjonen"
+
+#. 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:65
+msgid "%e %B %Y"
+msgstr "%e %B %Y"
+
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:129
+msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"
+msgstr ""
+"Oppstartsmodus: enten «updates», «updated», «installed» eller «overview»"
+
+#: src/gs-application.c:129
+msgid "MODE"
+msgstr "MODUS"
+
+#: src/gs-application.c:131
+msgid "Search for applications"
+msgstr "Søk etter programmer"
+
+#: src/gs-application.c:131
+msgid "SEARCH"
+msgstr "SØK"
+
+#: src/gs-application.c:133
+msgid "Show application details (using application ID)"
+msgstr "Vis detaljer for program. Bruker programmets ID"
+
+#: src/gs-application.c:133 src/gs-application.c:137
+msgid "ID"
+msgstr "ID"
+
+#: src/gs-application.c:135
+msgid "Show application details (using package name)"
+msgstr "Vis detaljer for program. Bruker programmets pakkenavn"
+
+#: src/gs-application.c:135
+msgid "PKGNAME"
+msgstr "PAKKENAVN"
+
+#: src/gs-application.c:137
+msgid "Install the application (using application ID)"
+msgstr "Installer programmet. Bruker programmets ID"
+
+#: src/gs-application.c:139
+msgid "Open a local package file"
+msgstr "Åpne en lokal pakkefil"
+
+#: src/gs-application.c:139 src/gs-application.c:144
+msgid "FILENAME"
+msgstr "FILNAVN"
+
+#: src/gs-application.c:141
+msgid ""
+"The kind of interaction expected for this action: either ‘none’, ‘notify’, "
+"or ‘full’"
+msgstr ""
+"Type interaksjon som forventes for denne handlingen: enten «none», «notify» "
+"eller «full»"
+
+#: src/gs-application.c:144
+msgid "Show a local metainfo or appdata file"
+msgstr ""
+
+#: src/gs-application.c:146
+msgid "Show verbose debugging information"
+msgstr "Vis detaljert feilsøkingsinformasjon"
+
+#: src/gs-application.c:148
+msgid "Installs any pending updates in the background"
+msgstr "Installerer utestående oppdateringer i bakgrunnen"
+
+#: src/gs-application.c:150
+msgid "Show update preferences"
+msgstr "Vis brukervalg for oppdatering"
+
+#: src/gs-application.c:152
+msgid "Quit the running instance"
+msgstr "Avslutt kjørende instans"
+
+#: src/gs-application.c:154
+msgid "Prefer local file sources to AppStream"
+msgstr "Foretrekk lokale filkilder over AppStream"
+
+#: src/gs-application.c:156
+msgid "Show version number"
+msgstr "Vis versjonsnummer"
+
+#: src/gs-application.c:325
+msgid "Copyright © 2016–2021 GNOME Software contributors"
+msgstr ""
+
+#: src/gs-application.c:328
+msgid "translator-credits"
+msgstr ""
+"Kjartan Maraas <kmaraas@gnome.org>, Torstein Adolf Winterseth <kvikende@fsfe."
+"org>, Harald H. <haarektrans@gmail.com>"
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:341 src/gs-shell.c:2163
+msgid "About Software"
+msgstr "Om Programvare"
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:344
+msgid "A nice way to manage the software on your system."
+msgstr "En enkel måte å håndtere programmene på ditt system."
+
+#. TRANSLATORS: we tried to show an app that did not exist
+#: src/gs-application.c:529
+msgid "Sorry! There are no details for that application."
+msgstr "Beklager! Ingen detaljer for dette programmet."
+
+#. 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:155 src/gs-storage-context-dialog.c:128
+msgid "Installed Size"
+msgstr "Installert størrelse"
+
+#: src/gs-app-context-bar.c:158
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data and %s of cache"
+msgstr "Inkluderer %s, %s og %s."
+
+#: src/gs-app-context-bar.c:161
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data"
+msgstr "Inkluderer %s, %s og %s."
+
+#: src/gs-app-context-bar.c:164
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of cache"
+msgstr "Inkluderer %s, %s og %s."
+
+#: src/gs-app-context-bar.c:167
+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:176 src/gs-storage-context-dialog.c:156
+msgid "Download Size"
+msgstr "Nedlastet størrelse"
+
+#: src/gs-app-context-bar.c:179
+msgid "Needs no additional system downloads"
+msgstr ""
+
+#: src/gs-app-context-bar.c:181
+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:186
+#, 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:200
+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:264
+#, fuzzy
+#| msgid "Permissions"
+msgid "No permissions"
+msgstr "Rettighetsnivå"
+
+#. 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:275
+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:282
+#, fuzzy
+#| msgid "System Services"
+msgid "Uses system services"
+msgstr "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:289
+#, fuzzy
+#| msgid "Session Services"
+msgid "Uses session services"
+msgstr "Ø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:296
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Can access hardware devices"
+msgstr "Kan aksessere enhetsfiler for systemet"
+
+#. 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:308
+msgid "Can read/write all your data"
+msgstr "Kan lese/skrive til alle filer"
+
+#. 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:320
+msgid "Can read all your data"
+msgstr "Kan lese alle filer"
+
+#. 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:327
+msgid "Can read/write your downloads"
+msgstr "Kan lese/skrive til nedlastede filer"
+
+#. 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:334
+msgid "Can read your downloads"
+msgstr "Kan lese dine nedlastede 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:341 src/gs-safety-context-dialog.c:218
+#, fuzzy
+#| msgid "Can view and change any settings"
+msgid "Can access and change user settings"
+msgstr "Kan vise og endre alle innstillinger"
+
+#. 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:348 src/gs-safety-context-dialog.c:202
+#, fuzzy
+#| msgid "Uses an old, insecure display system"
+msgid "Uses a legacy windowing system"
+msgstr "Bruker et gammelt og usikkert skjermsystem"
+
+#. 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:355 src/gs-safety-context-dialog.c:210
+#, fuzzy
+#| msgid "Requires additional permissions"
+msgid "Can acquire arbitrary permissions"
+msgstr "Krever flere rettigheter"
+
+#. 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:381 src/gs-safety-context-dialog.c:143
+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:388 src/gs-safety-context-dialog.c:140
+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:400
+#, fuzzy
+#| msgid "Proprietary"
+msgid "Proprietary code"
+msgstr "Proprietær"
+
+#. 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:406
+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:413
+#, fuzzy
+#| msgid "Software Repository Identified"
+msgid "Software developer is verified"
+msgstr "Programvarekilde indentifisert"
+
+#. 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:422
+#, fuzzy
+#| msgid "Your OS is no longer supported."
+msgid "Software no longer supported"
+msgstr "Operativsystemet er ikke støttet lenger."
+
+#. 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:434 src/gs-app-context-bar.c:695
+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:442
+msgid "Safe"
+msgstr "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:449
+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:456
+msgid "Unsafe"
+msgstr "Utrygg"
+
+#: src/gs-app-context-bar.c:535 src/gs-app-context-bar.c:567
+#: src/gs-hardware-support-context-dialog.c:588
+msgid "Mobile Only"
+msgstr "Kun for mobil"
+
+#: src/gs-app-context-bar.c:536
+msgid "Only works on a small screen"
+msgstr "Fungerer bare på små skjermer"
+
+#: src/gs-app-context-bar.c:541 src/gs-app-context-bar.c:574
+#: src/gs-app-context-bar.c:581 src/gs-app-context-bar.c:621
+#: src/gs-app-context-bar.c:626 src/gs-hardware-support-context-dialog.c:568
+msgid "Desktop Only"
+msgstr "Kun for skrivebords-maskiner"
+
+#: src/gs-app-context-bar.c:542
+msgid "Only works on a large screen"
+msgstr "Fungerer bare på store skjermer"
+
+#: src/gs-app-context-bar.c:546 src/gs-hardware-support-context-dialog.c:606
+msgid "Screen Size Mismatch"
+msgstr ""
+
+#: src/gs-app-context-bar.c:547 src/gs-hardware-support-context-dialog.c:607
+msgid "Doesn’t support your current screen size"
+msgstr "Støtter ikke din nåværende skjermstørrelse"
+
+#: src/gs-app-context-bar.c:568 src/gs-hardware-support-context-dialog.c:659
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Requires a touchscreen"
+msgstr ""
+
+#: src/gs-app-context-bar.c:575 src/gs-hardware-support-context-dialog.c:619
+#: src/gs-hardware-support-context-dialog.c:625
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a keyboard"
+msgstr "Krever omstart"
+
+#: src/gs-app-context-bar.c:582
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a mouse"
+msgstr "Krever omstart"
+
+#: src/gs-app-context-bar.c:593
+msgid "Gamepad Needed"
+msgstr "Krever spill-kontroller"
+
+#: src/gs-app-context-bar.c:594
+msgid "Requires a gamepad to play"
+msgstr "Krever en spill-kontroller for å 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:608
+msgid "Adaptive"
+msgstr ""
+
+#: src/gs-app-context-bar.c:609
+msgid "Works on phones, tablets and desktops"
+msgstr "Fungerer på telefoner, nettbrett og skrivebords-maskiner"
+
+#: src/gs-app-context-bar.c:622
+msgid "Probably requires a keyboard or mouse"
+msgstr "Krever sannsynligvis tastatur eller mus"
+
+#: src/gs-app-context-bar.c:627
+msgid "Works on desktops and laptops"
+msgstr "Fungerer på skrivebord- og bærebare maskiner"
+
+#. 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:670
+#, fuzzy
+#| msgid "The application contains no age-inappropriate content."
+msgid "Contains no age-inappropriate content"
+msgstr "Programmet inneholder ikke innhold som krever aldersgrense."
+
+#: src/gs-app-context-bar.c:719
+#, fuzzy
+#| msgid "No update description available."
+msgid "No age rating information available"
+msgstr "Ingen beskrivelse tilgjengelig for oppdateringen."
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * allows the application to be easily installed
+#: src/gs-app-row.c:144
+#, fuzzy
+#| msgid "Visit website"
+msgid "Visit Website"
+msgstr "Besøk nettsted"
+
+#. 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:150
+msgid "Install…"
+msgstr "Installer …"
+
+#. 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:158 src/gs-updates-section.ui:62
+msgid "Cancel"
+msgstr "Avbryt"
+
+#. 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:166 src/gs-common.c:341 src/gs-page.c:367
+msgid "Install"
+msgstr "Installer"
+
+#. TRANSLATORS: this is a button in the updates panel
+#. * that allows the app to be easily updated live
+#: src/gs-app-row.c:174
+msgid "Update"
+msgstr "Oppdater"
+
+#. 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:179 src/gs-app-row.c:189 src/gs-details-page.ui:271
+#: src/gs-page.c:527
+msgid "Uninstall"
+msgstr "Avinstaller"
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * shows the status of an application being erased
+#: src/gs-app-row.c:203
+msgid "Uninstalling"
+msgstr "Avinstallerer"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:313
+msgid "Device cannot be used during update."
+msgstr "Enheten kan ikke brukes under oppdatering."
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-app-row.c:323 src/gs-shell-search-provider.c:264
+#, 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:509
+#, c-format
+msgid "Renamed from %s"
+msgstr "Endret navn fra %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Hjelp til med å oversette %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 blir designet, utviklet og oversatt av et internasjonalt fellesskap av "
+"frivillige.\n"
+"\n"
+"Det betyr at selv om den ikke er tilgjengelig på ditt språk ennå, så kan du "
+"bli med og hjelpe til med å oversette den selv."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "Oversettelse"
+
+#: src/gs-app-translation-dialog.ui:99
+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 "Pålogging kreves - ekstern %s (område %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Pålogging kreves"
+
+#: src/gs-basic-auth-dialog.ui:21 src/gs-common.c:667
+#: src/gs-details-page.ui:284 src/gs-removal-dialog.ui:17
+#: src/gs-review-dialog.ui:18
+msgid "_Cancel"
+msgstr "A_vbryt"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Logg inn"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Br_uker"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Passord"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:209
+msgid "Other"
+msgstr "Andre"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: lib/gs-category.c:218
+msgid "Featured"
+msgstr "Utvalgte"
+
+#. 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:42 src/gs-overview-page.ui:110
+#, fuzzy
+#| msgid "Editor’s Picks"
+msgid "Editor’s Choice"
+msgstr "Redaktørens utvalgte"
+
+#. 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:70 src/gs-overview-page.ui:133
+#, fuzzy
+#| msgid "Updated"
+msgid "New & Updated"
+msgstr "Oppdatert"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:98
+msgid "Other Software"
+msgstr "Annen Programvare"
+
+#. TRANSLATORS: the user isn't reading the question
+#: lib/gs-cmd.c:193
+#, c-format
+msgid "Please enter a number from 1 to %u: "
+msgstr "Skriv inn et tall fra 1 til %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:256
+msgid "Choose an application:"
+msgstr "Velg et program:"
+
+#: 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 "Utvalgte"
+
+#: 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 "Lag og rediger lyder"
+
+#: lib/gs-desktop-data.c:45
+msgctxt "Menu of Audio & Video"
+msgid "Music Players"
+msgstr "Musikkspillere"
+
+#: 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 "Utvalgte"
+
+#: 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 "Tekstbehandler"
+
+#: 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 "Alle"
+
+#: lib/gs-desktop-data.c:90
+msgctxt "Menu of Audio & Video"
+msgid "Featured"
+msgstr "Utvalgte"
+
+#: 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 "Arcade"
+
+#: lib/gs-desktop-data.c:102
+msgctxt "Menu of Games"
+msgid "Blocks"
+msgstr "Blokk"
+
+#: lib/gs-desktop-data.c:105
+msgctxt "Menu of Games"
+msgid "Board"
+msgstr "Brett"
+
+#: 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 "Logikk"
+
+#: 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 "Alle"
+
+#: lib/gs-desktop-data.c:137
+msgctxt "Menu of Communication & News"
+msgid "Featured"
+msgstr "Utvalgte"
+
+#: lib/gs-desktop-data.c:140
+msgctxt "Menu of Communication & News"
+msgid "Chat"
+msgstr "Lynmeldinger"
+
+#: 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 "Utvalgte"
+
+#: 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 "Matematikk"
+
+#: 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 "Geografi"
+
+#: 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 "Action"
+
+#: 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 "Alle"
+
+#: lib/gs-desktop-data.c:226
+msgctxt "Menu of Developer Tools"
+msgid "Featured"
+msgstr "Utvalgte"
+
+#: lib/gs-desktop-data.c:229
+msgctxt "Menu of Developer Tools"
+msgid "Debuggers"
+msgstr "Feilsøkere"
+
+#: lib/gs-desktop-data.c:232
+msgctxt "Menu of Developer Tools"
+msgid "IDEs"
+msgstr "IDEer"
+
+#: 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 "Maskinvaredrivere"
+
+#: lib/gs-desktop-data.c:254
+msgctxt "Menu of Add-ons"
+msgid "Fonts"
+msgstr "Skrifter"
+
+#: 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 "Lokalisering"
+
+#. 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 "Arbeid"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:289
+msgid "Play"
+msgstr "Lek"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:291
+msgid "Socialize"
+msgstr "Sosialisér"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:293
+#, fuzzy
+#| msgid "_Learn More"
+msgid "Learn"
+msgstr "_Lær mer"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:295
+#, fuzzy
+#| msgid "Developer"
+msgid "Develop"
+msgstr "Utvikler"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:298
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Codecs"
+msgid "Codecs"
+msgstr "Kodeker"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:300
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Hardware Drivers"
+msgid "Hardware Drivers"
+msgstr "Maskinvaredrivere"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:302
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Fonts"
+msgid "Fonts"
+msgstr "Skrifter"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:304
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Input Sources"
+msgid "Input Sources"
+msgstr "Inndatakilder"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:306
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Language Packs"
+msgid "Language Packs"
+msgstr "Språkpakker"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:308
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Localization"
+msgid "Localization"
+msgstr "Lokalisering"
+
+#. 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:130 src/gs-common.c:153
+#, c-format
+msgid "%s is now installed"
+msgstr "%s er nå installert"
+
+#. TRANSLATORS: an application has been installed, but
+#. * needs a reboot to complete the installation
+#: src/gs-common.c:134 src/gs-common.c:157
+msgid "A restart is required for the changes to take effect."
+msgstr "En omstart kreves for å ta endringene i bruk."
+
+#. TRANSLATORS: this is the body of a notification that an application
+#. * has been successfully installed
+#: src/gs-common.c:138
+msgid "Application is ready to be used."
+msgstr "Programmet er klart til bruk."
+
+#. TRANSLATORS: this is the summary of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:146
+#, fuzzy
+#| msgid "OS updates are now installed"
+msgid "System updates are now installed"
+msgstr "OS-oppdateringer er nå installert"
+
+#. TRANSLATORS: this is the body of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:149
+msgid "Recently installed updates are available to review"
+msgstr ""
+"Nylig installerte oppdateringer er tilgjengelig for å skrive en "
+"tilbakemelding"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:168 src/gs-common.c:830
+msgid "Restart"
+msgstr "Start på nytt"
+
+#: src/gs-common.c:174
+msgid "Launch"
+msgstr "Start"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:275
+msgid "Install Third-Party Software?"
+msgstr "Installer tredjepartsprogramvare?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:279 src/gs-repos-dialog.c:164
+msgid "Enable Third-Party Software Repository?"
+msgstr "Slå på tredjeparts programvarekilde?"
+
+#. TRANSLATORS: the replacements are as follows:
+#. * 1. Application name, e.g. "Firefox"
+#. * 2. Software repository name, e.g. fedora-optional
+#.
+#: src/gs-common.c:295
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s er ikke <a href=\"https://en.wikipedia.org/wiki/"
+"Free_and_open_source_software\">programvare som er fri og åpen kildekode</"
+"a>, og tilbys av «%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:305
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s tilbys av %s."
+
+#: src/gs-common.c:314
+msgid "This software repository must be enabled to continue installation."
+msgstr "Dette programvarelageret må slås på for å fortsette installasjonen."
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:324
+#, c-format
+msgid "It may be illegal to install or use %s in some countries."
+msgstr "Det kan være ulovlig å installere eller bruke %s i noen land."
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:330
+msgid "It may be illegal to install or use this codec in some countries."
+msgstr ""
+"Det kan være ulovlig å installere eller bruke denne kodeken i noen land."
+
+#. TRANSLATORS: this is button text to not ask about non-free content again
+#: src/gs-common.c:337
+msgid "Don’t Warn Again"
+msgstr "Ikke varsle igjen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:346
+msgid "Enable and Install"
+msgstr "Slå på 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:548
+msgid "Detailed errors from the package manager follow:"
+msgstr "Detaljert feilmelding fra pakkehåndtereren følger:"
+
+#: src/gs-common.c:564 src/gs-safety-context-dialog.ui:82
+msgid "Details"
+msgstr "Detaljer"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:655
+msgid "_Accept"
+msgstr "_Aksepter"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-common.c:805
+msgid "An update has been installed"
+msgid_plural "Updates have been installed"
+msgstr[0] "En oppdatering ble installert"
+msgstr[1] "Oppdateringer ble installert"
+
+#. TRANSLATORS: we've just removed some apps
+#: src/gs-common.c:815
+#, fuzzy
+#| msgid "An application"
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "Et program"
+msgstr[1] "Et program"
+
+#. TRANSLATORS: the new apps will not be run until we restart
+#: src/gs-common.c:821
+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 kreves for å ta den i bruk."
+msgstr[1] "En omstart kreves for å ta dem i bruk."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:828
+msgid "Not Now"
+msgstr "Ikke nå"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:920
+msgid "Just now"
+msgstr "Akkurat nå"
+
+#: src/gs-common.c:922
+#, 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:926
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d time siden"
+msgstr[1] "%d timer siden"
+
+#: src/gs-common.c:930
+#, 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:934
+#, 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:938
+#, 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:942
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d år siden"
+msgstr[1] "%d år siden"
+
+#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown
+#: src/gs-dbus-helper.c:283
+msgid "An application"
+msgstr "Et program"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types.
+#: src/gs-dbus-helper.c:289
+#, c-format
+msgid "%s is requesting additional file format support."
+msgstr "%s ber om støtte for flere filformater."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:291
+msgid "Additional MIME Types Required"
+msgstr "Flere MIME-typer kreves"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional fonts.
+#: src/gs-dbus-helper.c:295
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr "%s forespør flere skrifter."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:297
+msgid "Additional Fonts Required"
+msgstr "Ekstra skrifter kreves"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional codecs.
+#: src/gs-dbus-helper.c:301
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr "%s ber om flere mulimediekodeker."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:303
+msgid "Additional Multimedia Codecs Required"
+msgstr "Flere multimediekodeker kreves"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers.
+#: src/gs-dbus-helper.c:307
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr "%s ber om flere skriverdrivere."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:309
+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:313
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "%s ber om flere pakker."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:315
+msgid "Additional Packages Required"
+msgstr "Flere pakker kreves"
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:324
+msgid "Find in Software"
+msgstr "Finn i programvare"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-description-box.c:67 src/gs-description-box.c:252
+#: src/gs-details-page.ui:835
+msgid "_Show More"
+msgstr "Vi_s mer"
+
+#: src/gs-description-box.c:67
+#, fuzzy
+#| msgid "_Show More"
+msgid "_Show Less"
+msgstr "Vi_s mer"
+
+#: src/gs-details-page.c:315
+msgid "Removing…"
+msgstr "Fjerner …"
+
+#: src/gs-details-page.c:325
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires restart to finish install"
+msgstr "Krever omstart"
+
+#: src/gs-details-page.c:332
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires restart to finish remove"
+msgstr "Krever omstart"
+
+#. 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:349
+msgid "Pending installation…"
+msgstr "Utestående installasjon …"
+
+#. 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:356
+msgid "Pending update…"
+msgstr "Utestående oppdatering …"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:372
+msgid "Preparing…"
+msgstr "Forbereder …"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:375
+#, fuzzy
+#| msgid "Uninstalling"
+msgid "Uninstalling…"
+msgstr "Avinstallerer"
+
+#. 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:793 src/gs-details-page.c:819
+#: src/gs-details-page.ui:218 plugins/packagekit/gs-packagekit-task.c:148
+msgid "_Install"
+msgstr "_Installer"
+
+#: src/gs-details-page.c:809
+#, fuzzy
+#| msgid "Restart"
+msgid "_Restart"
+msgstr "Start på nytt"
+
+#. 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:833
+msgid "_Install…"
+msgstr "_Installer …"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1372
+msgid "You need internet access to write a review"
+msgstr "Du må ha tilgang til internett for å skrive en tilbakemelding"
+
+#: src/gs-details-page.c:1519 src/gs-details-page.c:1535
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Fant ikke «%s»"
+
+#. TRANSLATORS: This is a title for the app details page,
+#. * shown when it’s loading the details of an app.
+#: src/gs-details-page.c:2077
+msgid "Loading…"
+msgstr "Laster …"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Side med detaljer"
+
+#: src/gs-details-page.ui:38
+msgid "Loading application details…"
+msgstr "Laster detaljer for program …"
+
+#: src/gs-details-page.ui:75
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Denne programvaren er ikke tilgjengelig på ditt språk og vil vises på "
+"engelsk."
+
+#: src/gs-details-page.ui:81
+msgid "Help _Translate"
+msgstr ""
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:234
+msgid "_Open"
+msgstr ""
+
+#: src/gs-details-page.ui:247 plugins/packagekit/gs-packagekit-task.c:158
+msgid "_Update"
+msgstr "_Oppdater"
+
+#: src/gs-details-page.ui:309
+msgid "Downloading"
+msgstr "Laster ned"
+
+#: src/gs-details-page.ui:396 src/gs-installed-page.ui:112
+msgid "Add-ons"
+msgstr "Tillegg"
+
+#: src/gs-details-page.ui:407
+msgid "Selected add-ons will be installed with the application."
+msgstr "Valgte tillegg vil bli installert med programmet."
+
+#: src/gs-details-page.ui:507
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Dette programmet kan kun brukes når det finnes en aktiv tilkobling til "
+"internett."
+
+#: src/gs-details-page.ui:527
+msgid "Software Repository Included"
+msgstr "Programvarekilde inkludert"
+
+#: src/gs-details-page.ui:528
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"Dette programmet inkluderer en programvarekilde som gir deg oppdateringer og "
+"tilgang til annen programvare."
+
+#: src/gs-details-page.ui:545
+msgid "No Software Repository Included"
+msgstr "Ingen programvarekilde inkludert"
+
+#: src/gs-details-page.ui:546
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Dette programmet inkluderer ikke en programvarekilde. Det vil ikke bli "
+"oppdatert med nye versjoner."
+
+#: src/gs-details-page.ui:564
+msgid ""
+"This software is already provided by your distribution and should not be "
+"replaced."
+msgstr ""
+"Denne programvaren tilbys allerede av din distribusjon og bør ikke erstattes."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:581
+msgid "Software Repository Identified"
+msgstr "Programvarekilde indentifisert"
+
+#: src/gs-details-page.ui:582
+msgid ""
+"Adding this software repository will give you access to additional software "
+"and upgrades."
+msgstr ""
+"Hvis du legger til denne programvarekilden vil du få tilgang til flere "
+"programmer og oppgraderinger."
+
+#: src/gs-details-page.ui:583
+msgid "Only use software repositories that you trust."
+msgstr "Bruk kun programvarekilder du stoler på."
+
+#: src/gs-details-page.ui:648
+msgid "No Metadata"
+msgstr "Ingen metadata"
+
+#: src/gs-details-page.ui:657
+msgid ""
+"This software doesn’t provide any links to a website, code repository or "
+"issue tracker."
+msgstr ""
+
+#: src/gs-details-page.ui:685
+#, fuzzy
+#| msgid "_Website"
+msgid "Project _Website"
+msgstr "_Nettsted"
+
+#: src/gs-details-page.ui:702
+msgid "_Donate"
+msgstr "_Doner"
+
+#: src/gs-details-page.ui:719
+msgid "Contribute _Translations"
+msgstr ""
+
+#: src/gs-details-page.ui:736
+msgid "_Report an Issue"
+msgstr ""
+
+#: src/gs-details-page.ui:753
+msgid "_Help"
+msgstr ""
+
+#. Translators: Header of the section with other users' opinions about the app.
+#: src/gs-details-page.ui:795
+msgid "Reviews"
+msgstr "Tilbakemeldinger"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:813
+msgid "_Write a Review"
+msgstr "S_kriv en tilbakemelding"
+
+#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos
+#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’).
+#: src/gs-details-page.ui:911 src/gs-safety-context-dialog.ui:151
+msgid "Source"
+msgstr "Kilde"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:245
+msgid "Downloading extra metadata files…"
+msgstr "Laster ned 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: 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] "Tilgjengelige skrifter for skriptet %s"
+msgstr[1] "Tilgjengelige skrifter for skriptene %s"
+
+#. 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] "Tilgjengelig programvare for %s"
+msgstr[1] "Tilgjengelig programvare for %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Forespurt programvare ble ikke funnet"
+
+#: src/gs-extras-page.c:244
+msgid "Failed to find requested software"
+msgstr "Fant ikke forespurt programvare"
+
+#. TRANSLATORS: This string is used for codecs that weren't found
+#: src/gs-extras-page.c:344
+#, c-format
+msgid "%s not found"
+msgstr "Fant ikke %s"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:348
+msgid "on the website"
+msgstr "på nettstedet"
+
+#. 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 "No applications are available that provide the file %s."
+msgstr "Fant ingen programmer som inneholder 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:359 src/gs-extras-page.c:370 src/gs-extras-page.c:381
+#, c-format
+msgid ""
+"Information about %s, as well as options for how to get missing applications "
+"might be found %s."
+msgstr ""
+"Informasjon om %s, og alternativer for å få tak i manglende programmer kan "
+"finnes %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:366 src/gs-extras-page.c:388
+#, c-format
+msgid "No applications are available for %s support."
+msgstr "Ingen programmer er tilgjengelig for å støtte %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 "%s is not available."
+msgstr "%s er ikke tilgjengelig"
+
+#. 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 an application that "
+"can support this format might be found %s."
+msgstr ""
+"Informasjon om %s og alternativer for å få tak i programmer som støtter "
+"dette formatet kan finnes %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 fonts are available for the %s script support."
+msgstr "Ingen skrifter er tilgjengelig for å støtte skript %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 fonts "
+"might be found %s."
+msgstr ""
+"Informasjon om %s og alternativer for å få tak i ekstra skrifter kan finnes "
+"%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 addon codecs are available for the %s format."
+msgstr "Ingen tilleggskodeker tilgjengelig 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:414
+#, 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 alternativer for å få tak i en kodek som kan spille av "
+"dette formatet kan finnes %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:421
+#, c-format
+msgid "No Plasma resources are available for %s support."
+msgstr "Ingen Plasma-ressurser er tilgjengelig for å støtte %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:425
+#, 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 alternativer for å få tak i ekstra Plasma-ressurser kan "
+"finnes %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:432
+#, c-format
+msgid "No printer drivers are available for %s."
+msgstr "Ingen skriverdrivere er tilgjengelig 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:436
+#, 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 alternativer for å få tak i en driver som støtter denne "
+"skriveren kan finnes %s."
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:482
+msgid "the documentation"
+msgstr "dokumentasjon"
+
+#. 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:488
+#, 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 forespurt av %s. Vennligst se %s for mer informasjon."
+msgstr[1] "Fant ikke %s forespurt av %s. Vennligst se %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:497
+#, 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 du søkte etter. Vennligst se %s for mer informasjon."
+msgstr[1] "Fant ikke %s du søkte etter. Vennligst se %s for mer informasjon."
+
+#: src/gs-extras-page.c:574 src/gs-extras-page.c:630 src/gs-extras-page.c:669
+#, fuzzy, c-format
+#| msgid "Failed to find any search results"
+msgid "Failed to find any search results: %s"
+msgstr "Klarte ikke å finne noen søkeresultater"
+
+#: src/gs-extras-page.c:860
+#, c-format
+msgid "%s file format"
+msgstr "%s filformat"
+
+#: src/gs-extras-page.c:1235
+msgid "Unable to Find Requested Software"
+msgstr "Fant ikke forespurt programvare"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Side for kodeker"
+
+#: src/gs-featured-carousel.ui:42
+msgid "Previous"
+msgstr "Forrige"
+
+#: src/gs-featured-carousel.ui:65
+msgid "Next"
+msgstr "Neste"
+
+#: src/gs-featured-carousel.ui:82
+msgid "Featured Apps List"
+msgstr "Liste med utvalgte programmer"
+
+#: src/gs-first-run-dialog.ui:9
+msgid "Welcome"
+msgstr "Velkommen"
+
+#: src/gs-first-run-dialog.ui:18
+msgid "Welcome to Software"
+msgstr "Velkommen til programvare"
+
+#: src/gs-first-run-dialog.ui:19
+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 ""
+"Programvare lar deg installere alle programmer du trenger fra ett og samme "
+"sted. Se våre anbefalinger, bla gjennom kategorier eller søk etter "
+"programmene du ønsker."
+
+#: src/gs-first-run-dialog.ui:25
+msgid "_Browse Software"
+msgstr "_Bla gjennom programvare"
+
+#: src/gs-hardware-support-context-dialog.c:562
+#: src/gs-hardware-support-context-dialog.c:571
+#, fuzzy
+#| msgid "Open Desktop Ratings Support"
+msgid "Desktop Support"
+msgstr "Støtte for Open Desktop poenggiving"
+
+#: src/gs-hardware-support-context-dialog.c:563
+#: src/gs-hardware-support-context-dialog.c:572
+msgid "Supports being used on a large screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:565
+msgid "Desktop Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:566
+msgid "Not enough information to know if large screens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:569
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a large screen"
+msgstr "Krever omstart"
+
+#: src/gs-hardware-support-context-dialog.c:574
+#, fuzzy
+#| msgid "Open Desktop Ratings Support"
+msgid "Desktop Not Supported"
+msgstr "Støtte for Open Desktop poenggiving"
+
+#: src/gs-hardware-support-context-dialog.c:575
+msgid "Cannot be used on a large screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:582
+#: src/gs-hardware-support-context-dialog.c:591
+#, fuzzy
+#| msgid "Flatpak Support"
+msgid "Mobile Support"
+msgstr "Støtte for Flatpak"
+
+#: src/gs-hardware-support-context-dialog.c:583
+#: src/gs-hardware-support-context-dialog.c:592
+msgid "Supports being used on a small screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:585
+msgid "Mobile Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Not enough information to know if small screens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:589
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a small screen"
+msgstr "Krever omstart"
+
+#: src/gs-hardware-support-context-dialog.c:594
+msgid "Mobile Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:595
+msgid "Cannot be used on a small screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:618
+#: src/gs-hardware-support-context-dialog.c:627
+#, fuzzy
+#| msgid "Snap Support"
+msgid "Keyboard Support"
+msgstr "Støtte for Snap"
+
+#: src/gs-hardware-support-context-dialog.c:621
+msgid "Keyboard Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:622
+msgid "Not enough information to know if keyboards are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:624
+#, fuzzy
+#| msgid "Login Required"
+msgid "Keyboard Required"
+msgstr "Pålogging kreves"
+
+#: src/gs-hardware-support-context-dialog.c:628
+msgid "Supports keyboards"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:630
+msgid "Keyboard Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:631
+msgid "Cannot be used with a keyboard"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:638
+#: src/gs-hardware-support-context-dialog.c:647
+#, fuzzy
+#| msgid "Snap Support"
+msgid "Mouse Support"
+msgstr "Støtte for Snap"
+
+#: src/gs-hardware-support-context-dialog.c:639
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Requires a mouse or pointing device"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:641
+msgid "Mouse Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:642
+msgid ""
+"Not enough information to know if mice or pointing devices are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:644
+#, fuzzy
+#| msgid "Login Required"
+msgid "Mouse Required"
+msgstr "Pålogging kreves"
+
+#: src/gs-hardware-support-context-dialog.c:648
+msgid "Supports mice and pointing devices"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:650
+msgid "Mouse Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:651
+msgid "Cannot be used with a mouse or pointing device"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:658
+#: src/gs-hardware-support-context-dialog.c:667
+msgid "Touchscreen Support"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:661
+msgid "Touchscreen Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Not enough information to know if touchscreens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:664
+#, fuzzy
+#| msgid "Login Required"
+msgid "Touchscreen Required"
+msgstr "Pålogging kreves"
+
+#: src/gs-hardware-support-context-dialog.c:668
+msgid "Supports touchscreens"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:670
+msgid "Touchscreen Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:671
+msgid "Cannot be used with a touchscreen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:684
+#, fuzzy
+#| msgid "Login Required"
+msgid "Gamepad Required"
+msgstr "Pålogging kreves"
+
+#: src/gs-hardware-support-context-dialog.c:685
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a gamepad"
+msgstr "Krever omstart"
+
+#: src/gs-hardware-support-context-dialog.c:687
+#, fuzzy
+#| msgid "Snap Support"
+msgid "Gamepad Support"
+msgstr "Støtte for Snap"
+
+#: src/gs-hardware-support-context-dialog.c:688
+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:697
+#, 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:704
+#, 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:711
+#, 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:718
+#, 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 "Støtte for oppgradering av fastvare"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Side med installert programvare"
+
+#: src/gs-installed-page.ui:52
+msgid "In Progress"
+msgstr "Prosesseres"
+
+#. origin_ui on a remote is the repo dialogue section name,
+#. * not the remote title
+#: src/gs-installed-page.ui:72 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Programvare"
+
+#: src/gs-installed-page.ui:92
+msgid "System Applications"
+msgstr "Systemprogrammer"
+
+#: src/gs-license-tile.c:93
+msgid "Community Built"
+msgstr ""
+
+#. Translators: The placeholder here is the name of a software license.
+#: src/gs-license-tile.c:101
+#, 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:106
+msgid "Proprietary"
+msgstr "Proprietær"
+
+#: src/gs-license-tile.c:113
+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."
+msgstr ""
+
+#: src/gs-license-tile.ui:117
+msgid "_Get Involved"
+msgstr ""
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:62 src/gs-loading-page.c:66
+msgid "Software catalog is being downloaded"
+msgstr "Programvarekatalogen lastes ned"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Laster side"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Starter opp …"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:247
+msgid "Automatic Updates Paused"
+msgstr "Automatiske oppdateringer satt på pause"
+
+#: 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 ""
+"Nettverket som brukes har en dataplan. Tilkoblinger med en dataplan har "
+"begrensninger på datamengde eller kostnader forbundet med seg. For å spare "
+"på bruk av data har derfor automatiske oppdateringer blitt satt på pause.\n"
+"\n"
+"Automatiske oppdateringer vil gjenopptas når et nettverk uten dataplan blir "
+"tilgjengelig. Inntil dette skjer er det fortsatt mulig å installere "
+"oppdateringer manuelt.\n"
+"\n"
+"Alternativt kan innstillingen endres hvis nettverket er identifisert med "
+"dataplan uten at dette er korrekt."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Åpne inn_stillinger for nettverk"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderer side"
+
+#: src/gs-moderate-page.ui:84
+msgid "There are no reviews to moderate"
+msgstr "Ingen tilbakemeldinger å moderere"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-odrs-provider.c:1309
+msgid "Downloading application ratings…"
+msgstr "Laster ned poengsummer for programmer …"
+
+#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm"
+#: src/gs-origin-popover-row.c:55
+msgid "Name"
+msgstr "Navn"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:72
+msgid "system"
+msgstr "system"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:75
+msgid "user"
+msgstr "bruker"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-origin-popover-row.c:91
+msgid "Channel"
+msgstr "Kanal"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:96 src/gs-origin-popover-row.ui:82
+msgid "Branch"
+msgstr "Gren"
+
+#: src/gs-origin-popover-row.ui:30
+msgid "URL"
+msgstr "URL"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:56
+msgid "Installation"
+msgstr "Installasjon"
+
+#. Translators: The available version of an app
+#: src/gs-origin-popover-row.ui:108
+msgid "Version"
+msgstr "Versjon"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:251
+msgid "Additions"
+msgstr "Lagt til"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:255
+msgid "Removals"
+msgstr "Fjernet"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gs-os-update-page.c:259 src/gs-shell.ui:319 src/gs-updates-page.c:1344
+msgid "Updates"
+msgstr "Oppdateringer"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:263
+msgid "Downgrades"
+msgstr "Nedgraderinger"
+
+#. 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:634
+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:636
+#, fuzzy, c-format
+#| msgid "Access additional software from selected third party sources."
+msgid ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+msgstr "Aksesser tilleggsprogramvare fra utvalgte tredjepartskilder."
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:645 src/gs-repos-dialog.c:169
+msgid "Enable"
+msgstr "Slå på"
+
+#. 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:697 src/gs-shell.ui:285
+#, fuzzy
+#| msgid "_Explore"
+msgid "Explore"
+msgstr "_Utforsk"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Oversiktsside"
+
+#: src/gs-overview-page.ui:39
+msgid "Enable Third Party Software Repositories?"
+msgstr "Slå på tredjeparts programvarekilde?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:157
+#, fuzzy
+#| msgid "Categories"
+msgid "Other Categories"
+msgstr "Kategorier"
+
+#: src/gs-overview-page.ui:198
+msgid "No Application Data Found"
+msgstr "Ingen programdata funnet"
+
+#: lib/gs-plugin-loader.c:2859
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: src/gs-page.c:275
+#, fuzzy
+#| msgid "Pending installation…"
+msgid "User declined installation"
+msgstr "Utestående installasjon …"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:358
+#, 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:496
+#, c-format
+msgid "Are you sure you want to remove the %s repository?"
+msgstr "Er du sikker på at du vil fjerne kilden %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:500
+#, c-format
+msgid ""
+"All applications from %s will be uninstalled, and you will have to re-"
+"install the repository to use them again."
+msgstr ""
+"Alle programmer fra %s vil bli avinstallert og du vil måtte installere "
+"kilden på nytt for å bruke dem igjen."
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:508
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Er du sikker på at du vil avinstallere %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:511
+#, c-format
+msgid ""
+"%s will be uninstalled, and you will have to install it to use it again."
+msgstr ""
+"%s vil bli avinstallert og du vil måtte installere det for å bruke det igjen."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Oppdater brukervalg"
+
+#: 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 ""
+"Automatiske oppdateringer er slått av på mobil eller betalt tilkobling."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatiske oppdateringer"
+
+#: 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 "Installerer utestående oppdateringer i bakgrunnen"
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Varsling om automatiske oppdateringer"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Vis varsling når oppdateringer har blitt installert automatisk."
+
+#. 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 ""
+"Deler av den installerte programvaren er ikke kompatibel med %s. Hvis du "
+"fortsetter vil følgende bli fjernet automatisk under oppgraderingen:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Inkompatibel programvare"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Fortsett"
+
+#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64"
+#: src/gs-repos-dialog.c:236
+#, 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 ""
+"Programvare som er installert fra denne kilden vil ikke motta oppdateringer "
+"eller sikkerhetsfikser."
+
+#: src/gs-repos-dialog.c:245
+#, fuzzy
+#| msgid "Software Repositories"
+msgid "Disable Repository?"
+msgstr "Programvarekilder"
+
+#: src/gs-repos-dialog.c:245
+#, fuzzy
+#| msgid "Software Repositories"
+msgid "Remove Repository?"
+msgstr "Programvarekilder"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:251
+#, fuzzy
+#| msgid "Disable"
+msgid "_Disable"
+msgstr "Slå av"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:254
+#, fuzzy
+#| msgid "Remove"
+msgid "_Remove"
+msgstr "Fjern"
+
+#: src/gs-repos-dialog.c:503
+#, fuzzy
+#| msgid "Software Repositories"
+msgid "Enable New Repositories"
+msgstr "Programvarekilder"
+
+#: src/gs-repos-dialog.c:504
+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:513
+#, fuzzy
+#| msgid "More information"
+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:518
+#, fuzzy, c-format
+#| msgid "Access additional software from selected third party sources."
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Aksesser tilleggsprogramvare fra utvalgte tredjepartskilder."
+
+#: src/gs-repos-dialog.c:523
+#, fuzzy
+#| msgid "Third Party Repositories"
+msgid "Fedora Third Party Repositories"
+msgstr "Tredjeparts programvarekilder"
+
+#. 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:665
+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:723
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Disse kildene supplementerer forvalgt programvare som tilbys av %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:87
+msgid "Software Repositories"
+msgstr "Programvarekilder"
+
+#: src/gs-repos-dialog.ui:53
+#, fuzzy
+#| msgid "Software Repositories"
+msgid "No Repositories"
+msgstr "Programvarekilder"
+
+#. 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 program installert"
+msgstr[1] "%u programmer installert"
+
+#. 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 tillegg installert"
+msgstr[1] "%u tillegg installert"
+
+#. 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 program"
+msgstr[1] "%u programmer"
+
+#. 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 tillegg"
+msgstr[1] "%u tillegg"
+
+#. 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 er nå installert"
+msgstr[1] "%s og %s er nå installert"
+
+#. 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:237
+#, 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 "Hater det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Liker det ikke"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Det er OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Liker det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Elsker det"
+
+#. 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 "Vennligst bruk litt mer tid på tilbakemeldingen"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Vennligst velg antall stjerner"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Sammendraget er for kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Sammendraget er for langt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Beskrivelsen er for kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Legg inn tilbakemelding"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Legg inn"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Rangering"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Sammendrag"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Gi et kort sammendrag av tilbakemeldingen. For eksempel: «Bra program, "
+"anbefales»."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Gi tilbakemelding"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Hva mener du om programmet? Prøv å begrunne dine syn."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+msgstr ""
+"Finn ut hvilke data som oversendes i våre <a href=\"https://odrs.gnome.org/"
+"privacy\">Retningslinjer for personvern</a>."
+
+#: src/gs-review-histogram.c:73
+#, c-format
+msgid "%u review total"
+msgid_plural "%u reviews total"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/gs-review-histogram.ui:92
+#, fuzzy
+#| msgid "About Software"
+msgid "out of 5 stars"
+msgstr "Om Programvare"
+
+#. TRANSLATORS: this is when a user doesn't specify a name
+#: src/gs-review-row.c:58
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#. 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 ""
+"Du kan rapportere tilbakemeldinger hvis de inneholder støtende, uforskammede "
+"eller diskriminerende oppførsel."
+
+#. 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 ""
+"Hvis en tilbakemelding rapporteres vil den bli skjult til den er sjekket av "
+"en administrator."
+
+#. TRANSLATORS: window title when
+#. * reporting a user-submitted review
+#. * for moderation
+#: src/gs-review-row.c:241
+msgid "Report Review?"
+msgstr "Rapporter tilbakemelding?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:245
+msgid "Report"
+msgstr "Rapporter"
+
+#. Translators: Users can express their opinions about other users' opinions about the apps.
+#: src/gs-review-row.ui:79
+msgid "Was this review useful to you?"
+msgstr "Var denne tilbakemeldingen nyttig for deg?"
+
+#: src/gs-review-row.ui:95
+msgid "Yes"
+msgstr "Ja"
+
+#: src/gs-review-row.ui:103
+msgid "No"
+msgstr "Nei"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:111
+msgid "Meh"
+msgstr "Samme det"
+
+#: src/gs-review-row.ui:121
+msgid "Report…"
+msgstr "Rapporter …"
+
+#: src/gs-review-row.ui:130
+msgid "Remove…"
+msgstr "Fjern …"
+
+#: src/gs-safety-context-dialog.c:141
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:144
+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:151
+#, fuzzy
+#| msgid "Permissions"
+msgid "No Permissions"
+msgstr "Rettighetsnivå"
+
+#: src/gs-safety-context-dialog.c:152
+#, fuzzy
+#| msgid "This application is fully sandboxed."
+msgid "App is fully sandboxed"
+msgstr "Programmet kjører utelukkende i sandkassen."
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:163
+#, fuzzy
+#| msgid "Network Settings"
+msgid "Network Access"
+msgstr "Innstillinger for nettverk"
+
+#: src/gs-safety-context-dialog.c:164
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Can access the internet"
+msgstr "Kan aksessere enhetsfiler for systemet"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:167
+#, fuzzy
+#| msgid "No Network"
+msgid "No Network Access"
+msgstr "Ikke noe nettverk"
+
+#: src/gs-safety-context-dialog.c:168
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Cannot access the internet"
+msgstr "Kan aksessere enhetsfiler for systemet"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:174
+#, fuzzy
+#| msgid "System Services"
+msgid "Uses System Services"
+msgstr "Systemtjenester"
+
+#: src/gs-safety-context-dialog.c:175
+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:182
+#, fuzzy
+#| msgid "Session Services"
+msgid "Uses Session Services"
+msgstr "Økttjenester"
+
+#: src/gs-safety-context-dialog.c:183
+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:190
+#, fuzzy
+#| msgid "Devices"
+msgid "Device Access"
+msgstr "Enheter"
+
+#: src/gs-safety-context-dialog.c:191
+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:194
+#, fuzzy
+#| msgid "Devices"
+msgid "No Device Access"
+msgstr "Enheter"
+
+#: src/gs-safety-context-dialog.c:195
+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:201
+#, fuzzy
+#| msgid "Legacy display system"
+msgid "Legacy Windowing System"
+msgstr "Gammelt skjermsystem"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:209
+#, fuzzy
+#| msgid "Permissions"
+msgid "Arbitrary Permissions"
+msgstr "Rettighetsnivå"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:217
+#, fuzzy
+#| msgid "Settings"
+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:229
+msgid "Full File System Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:230
+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:238
+msgid "Home Folder Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Full File System Read Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:248
+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:257
+msgid "Home Folder Read Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:258
+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:267
+msgid "Download Folder Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:268
+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:279
+#, fuzzy
+#| msgid "Downloads folder"
+msgid "Download Folder Read Access"
+msgstr "Mappe for nedlastinger"
+
+#: src/gs-safety-context-dialog.c:280
+msgid "Can read 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:293
+#, fuzzy
+#| msgid "File system"
+msgid "No File System Access"
+msgstr "Filsystem"
+
+#: src/gs-safety-context-dialog.c:294
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Cannot access the file system at all"
+msgstr "Kan aksessere enhetsfiler for systemet"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:308
+#, fuzzy
+#| msgid "Proprietary"
+msgid "Proprietary Code"
+msgstr "Proprietær"
+
+#: src/gs-safety-context-dialog.c:309
+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:312
+msgid "Auditable Code"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:313
+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:321
+msgid "App developer is verified"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:322
+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:333
+msgid "Insecure Dependencies"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:334
+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:343
+#, fuzzy, c-format
+#| msgid "%s is now installed"
+msgid "%s is safe"
+msgstr "%s er nå installert"
+
+#. Translators: The app is considered potentially unsafe to install and run.
+#. * The placeholder is the app name.
+#: src/gs-safety-context-dialog.c:350
+#, fuzzy, c-format
+#| msgid "%s is now installed"
+msgid "%s is potentially unsafe"
+msgstr "%s er nå installert"
+
+#. Translators: The app is considered unsafe to install and run.
+#. * The placeholder is the app name.
+#: src/gs-safety-context-dialog.c:357
+#, fuzzy, c-format
+#| msgid "%s is now installed"
+msgid "%s is unsafe"
+msgstr "%s er nå installert"
+
+#. 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:111
+msgid "License"
+msgstr "Lisens"
+
+#: src/gs-safety-context-dialog.ui:191
+msgid "SDK"
+msgstr ""
+
+#: src/gs-safety-context-dialog.ui:215
+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:45
+#, fuzzy
+#| msgid "Screenshot"
+msgid "Previous Screenshot"
+msgstr "Skjermdump"
+
+#. Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel.
+#: src/gs-screenshot-carousel.ui:73
+#, fuzzy
+#| msgid "Screenshot"
+msgid "Next Screenshot"
+msgstr "Skjermdump"
+
+#: src/gs-screenshot-carousel.ui:126
+msgid "No screenshot provided"
+msgstr "Ingen skjermdump gitt"
+
+#. TRANSLATORS: this is when we try to download a screenshot and
+#. * we get back 404
+#: src/gs-screenshot-image.c:334 src/gs-screenshot-image.c:388
+msgid "Screenshot not found"
+msgstr "Skjermbilde ikke funnet"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:407
+msgid "Failed to load image"
+msgstr "Klarte ikke å laste bilde"
+
+#. 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:554
+msgid "Screenshot size not found"
+msgstr "Størrelse på skjermbilde ble ikke funnet"
+
+#. 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:635
+msgid "Could not create cache"
+msgstr "Kunne ikke lage buffer"
+
+#. TRANSLATORS: this is when we try to download a screenshot
+#. * that was not a valid URL
+#: src/gs-screenshot-image.c:649
+msgid "Screenshot not valid"
+msgstr "Skjermdump ikke gyldig"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:681
+msgid "Screenshot not available"
+msgstr "Skjermdump ikke tilgjengelig"
+
+#: src/gs-screenshot-image.ui:6
+msgid "Screenshot"
+msgstr "Skjermdump"
+
+#. TRANSLATORS: this is when there are too many search results
+#. * to show in in the search page
+#: src/gs-search-page.c:170
+#, 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:6
+msgid "Search page"
+msgstr "Søkeside"
+
+#: src/gs-search-page.ui:17
+#, fuzzy
+#| msgid "Search for applications"
+msgid "Search for Apps"
+msgstr "Søk etter programmer"
+
+#: src/gs-search-page.ui:43
+msgid "No Application Found"
+msgstr "Ingen program funnet"
+
+#. 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:1170 src/gs-shell.c:1175 src/gs-shell.c:1190
+#: src/gs-shell.c:1194
+#, 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:1211
+#, fuzzy, c-format
+#| msgid "“%s”"
+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:1247
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Kan ikke laste ned fastvareoppdateringer 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:1253
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Kan ikke laste ned oppdateringer fra %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1260 src/gs-shell.c:1305
+msgid "Unable to download updates"
+msgstr "Kan ikke laste ned oppdateringer"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1266
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Kan ikke laste ned oppdateringer: Tilgang til internett kreves men var ikke "
+"tilgjengelig"
+
+#. 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 updates from %s: not enough disk space"
+msgstr "Kan ikke laste ned oppdateringer fra %s: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1280
+msgid "Unable to download updates: not enough disk space"
+msgstr "Kan ikke laste ned oppdateringer: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1287
+msgid "Unable to download updates: authentication was required"
+msgstr "Kan ikke laste ned oppdateringer: autentisering var påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1292
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Kan ikke laste ned oppdateringer: autentiseringen var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1297
+msgid ""
+"Unable to download updates: you do not have permission to install software"
+msgstr ""
+"Kan ikke laste ned oppdateringer: du har ikke rettigheter til å installere "
+"programvare"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1308
+msgid "Unable to get list of updates"
+msgstr "Kan ikke hente liste med oppdateringer"
+
+#. 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:1350
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Kan ikke installere %s siden nedlasting fra %s feilet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1356
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Kan ikke installere %s fordi nedlastingen feilet"
+
+#. 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:1369
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Kan ikke installere %s fordi kjøretidsmiljø %s ikke er tilgjengelig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1375
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Kan ikke installere %s da den ikke er støttet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1382
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Kan ikke installere: Tilgang til internett kreves men var ikke tilgjengelig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1388
+msgid "Unable to install: the application has an invalid format"
+msgstr "Kan ikke installere: programmet har ugyldig format"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1393
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Kan ikke installere %s: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1400
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Kan ikke installere %s: autentisering var påkrevet"
+
+#. 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 install %s: authentication was invalid"
+msgstr "Kan ikke installere %s: ugyldig autentisering"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1414
+#, c-format
+msgid "Unable to install %s: you do not have permission to install software"
+msgstr ""
+"Kan ikke installere %s: du har ikke rettigheter til å installere programvare"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Kan ikke installere %s: Strømtilkobling kreves"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1429
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Kan ikke installere %s: Batterinivået er for lavt"
+
+#. 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 install %s"
+msgstr "Kan ikke installere %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:1484
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Kan ikke oppdatere %s fra %s siden nedlasting feilet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1491
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "Kan ikke oppdatere %s siden nedlasting feilet"
+
+#. 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:1498
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Kan ikke installere oppdateringer fra %s fordi nedlastingen feilet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1502
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Kan ikke installere oppdateringer fordi nedlastingen feilet"
+
+#. 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 ""
+"Kan ikke oppdatere: Tilgang til internett var påkrevet men var ikke "
+"tilgjengelig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1518
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Kan ikke oppdatere %s: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1523
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Kan ikke installere oppdateringer: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1533
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Kan ikke oppdatere %s: autentisering var påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1538
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Kan ikke installere oppdateringer: autentisering var påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1547
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Kan ikke oppdatere %s: autentiseringen var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1552
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Kan ikke installere oppdateringer: ugyldig autentisering"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr ""
+"Kan ikke oppdatere %s: du har ikke rettigheter til å oppdatere programvare"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1567
+#, c-format
+msgid ""
+"Unable to install updates: you do not have permission to update software"
+msgstr ""
+"Kan ikke oppdatere oppdateringer: du har ikke rettigheter til å oppdatere "
+"programvare"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1577
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Kan ikke oppdatere %s: strømtilkobling er påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1583
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Kan ikke installere oppdateringer: Strømtilkobling kreves"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1592
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Kan ikke oppdatere %s: Batterinivået er for lavt"
+
+#. 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 install updates: The battery level is too low"
+msgstr "Kan ikke installere oppdateringer: Batterinivået er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1609
+#, c-format
+msgid "Unable to update %s"
+msgstr "Kan ikke oppdatere %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1612
+#, c-format
+msgid "Unable to install updates"
+msgstr "Kan ikke installere oppdateringer"
+
+#. 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:1654
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "Kan ikke oppgradere til %s fra %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1659
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Kan ikke oppgradere til %s siden nedlasting feilet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1668
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+msgstr ""
+"Kan ikke oppgradere til %s: nødvendig tilgang til internett var ikke "
+"tilgjengelig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1677
+#, c-format
+msgid "Unable to upgrade to %s: not enough disk space"
+msgstr "Kan ikke oppgradere til %s: ikke nok diskplass"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1685
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Kan ikke oppgradere til %s: autentisering var påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Kan ikke oppgradere til %s: autentiseringen var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1699
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr "Kan ikke oppgradere til %s: du har ikke rettigheter til å oppgradere"
+
+#. 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 "Kan ikke oppgradere til %s: strømtilkobling er påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1713
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Kan ikke oppgradere til %s: Batterinivået er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1722
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Kan ikke oppgradere til %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1759
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Kan ikke fjerne %s: autentisering var påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1765
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Kan ikke fjerne %s: autentiseringen var ugyldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1771
+#, c-format
+msgid "Unable to remove %s: you do not have permission to remove software"
+msgstr "Kan ikke fjerne %s: du har ikke rettigheter til å fjerne programvare"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Kan ikke fjerne %s: strømtilkobling er påkrevet"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1785
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Kan ikke fjerne %s: Batterinivået er for lavt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1797
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Kan ikke fjerne %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:1839
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr "Kan ikke starte %s: %s er ikke installert"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1846 src/gs-shell.c:1897 src/gs-shell.c:1938
+#: src/gs-shell.c:1983
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Ikke nok diskplass – frigjør plass og prøv igjen"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1857 src/gs-shell.c:1908 src/gs-shell.c:1949
+#: src/gs-shell.c:2007
+msgid "Sorry, something went wrong"
+msgstr "Beklager, noe gikk galt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1889
+msgid "Failed to install file: not supported"
+msgstr "Kan ikke installere filen: ikke støttet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1893
+msgid "Failed to install file: authentication failed"
+msgstr "Klarte ikke å installere fil: autentisering feilet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1930
+msgid "Failed to install: not supported"
+msgstr "Klarte ikke å installere: ikke støttet"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1934
+msgid "Failed to install: authentication failed"
+msgstr "Klarte ikke å installere: autentisering feilet"
+
+#. 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:1977
+#, 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 application, aka 'GNOME Software'.
+#: src/gs-shell.c:1989
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Programvare må startes på nytt for å bruke nye tillegg."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1994
+msgid "AC power is required"
+msgstr "Strømtilkobling kreves"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1998
+msgid "The battery level is too low"
+msgstr "Batterinivået er for lavt"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Programvarekilder"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Br_ukervalg for oppdatering"
+
+#: src/gs-shell.ui:21 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "Programvare"
+
+#. button in the info bar
+#: src/gs-shell.ui:96
+msgid "Examine Disk"
+msgstr "Undesøk disk"
+
+#. button in the info bar
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-shell.ui:105 src/gs-updates-page.c:899
+msgid "Network Settings"
+msgstr "Innstillinger for nettverk"
+
+#. button in the info bar
+#: src/gs-shell.ui:114
+msgid "Restart Now"
+msgstr "Start på nytt nå"
+
+#. button in the info bar
+#: src/gs-shell.ui:123
+msgid "More Information"
+msgstr "Mer informasjon"
+
+#: src/gs-shell.ui:180
+msgid "Search"
+msgstr "Søk"
+
+#: src/gs-shell.ui:195
+msgid "Primary Menu"
+msgstr ""
+
+#: src/gs-shell.ui:265
+msgid "Find Out _More"
+msgstr "Finn ut _mer"
+
+#. 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:93
+#, fuzzy
+#| msgctxt "App permissions"
+#| msgid "None"
+msgid "None"
+msgstr "Ingen"
+
+#: src/gs-storage-context-dialog.c:132
+#, fuzzy
+#| msgid "Application Updates"
+msgid "Application Data"
+msgstr "Programoppdateringer"
+
+#: src/gs-storage-context-dialog.c:133
+msgid "Data needed for the application to run"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:137
+msgid "User Data"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:138
+#, fuzzy
+#| msgid "Please restart the application."
+msgid "Data created by you in the application"
+msgstr "Vennligst start programmet på nytt."
+
+#: src/gs-storage-context-dialog.c:144
+msgid "Cache Data"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:145
+msgid "Temporary cached data"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:161
+#, fuzzy
+#| msgid "%u application installed"
+#| msgid_plural "%u applications installed"
+msgid "The application itself"
+msgstr "%u program installert"
+
+#: src/gs-storage-context-dialog.c:165
+msgid "Required Dependencies"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:166
+msgid "Shared system components required by this application"
+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:82
+msgid ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+
+#: src/gs-summary-tile.c:72
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (installert)"
+
+#: src/gs-summary-tile.c:77
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (installerer)"
+
+#: src/gs-summary-tile.c:82
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (fjerner)"
+
+#. 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:127
+#, 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:146
+msgid "Installed Updates"
+msgstr "Installerte oppdateringer"
+
+#: src/gs-update-dialog.ui:87
+msgid "No updates have been installed on this system."
+msgstr "Ingen oppdateringer er installert på dette systemet."
+
+#: src/gs-update-monitor.c:203
+msgid "Software Updates Are Out of Date"
+msgstr "Programvareoppdateringer er utdatert"
+
+#: src/gs-update-monitor.c:204
+msgid "Please check for software updates."
+msgstr "Vennligst se etter programvareoppdateringer."
+
+#: src/gs-update-monitor.c:210
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritisk programvareoppdatering er klar for installasjon"
+
+#: src/gs-update-monitor.c:211
+msgid "An important software update is ready to be installed."
+msgstr "En viktig programvareoppdatering er klar for installasjon."
+
+#: src/gs-update-monitor.c:214
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritisk programvareoppdateringer er tilgjengelig for nedlasting"
+
+#: src/gs-update-monitor.c:215
+msgid "Important: critical software updates are waiting."
+msgstr "Viktig: kritiske programvareoppdateringer venter."
+
+#: src/gs-update-monitor.c:223
+msgid "Software Updates Ready to Install"
+msgstr "Programvareoppdateringer klar for installasjon"
+
+#: src/gs-update-monitor.c:224
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Programvareoppdateringer venter og er klar for installasjon."
+
+#: src/gs-update-monitor.c:229
+msgid "Software Updates Available to Download"
+msgstr "Programvareoppdateringer er tilgjengelig for nedlasting"
+
+#: src/gs-update-monitor.c:230
+msgid "Please download waiting software updates."
+msgstr "Vennligst last ned programvareoppdateringer som er på vent."
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:342
+#, c-format
+msgid "%u Application Updated — Restart Required"
+msgid_plural "%u Applications Updated — Restart Required"
+msgstr[0] "%u program oppdatert – omstart kreves"
+msgstr[1] "%u programmer oppdatert – omstart kreves"
+
+#. TRANSLATORS: apps were auto-updated
+#: src/gs-update-monitor.c:348
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u program oppdatert"
+msgstr[1] "%u programmer oppdatert"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:359
+#, c-format
+msgid "%s has been updated."
+msgstr "%s er oppdatert."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:362
+msgid "Please restart the application."
+msgstr "Vennligst start programmet på nytt."
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:370
+#, c-format
+msgid "%s and %s have been updated."
+msgstr "%s og %s er oppdatert."
+
+#. TRANSLATORS: at least one application needs restarting
+#: src/gs-update-monitor.c:376 src/gs-update-monitor.c:395
+#, c-format
+msgid "%u application requires a restart."
+msgid_plural "%u applications require a restart."
+msgstr[0] "%u program krever en omstart."
+msgstr[1] "%u programmer krever en omstart."
+
+#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox
+#: src/gs-update-monitor.c:388
+#, 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:656 src/gs-updates-page.ui:19
+msgid "Operating System Updates Unavailable"
+msgstr "Ingen oppdateringer er tilgjengelig for operativsystemet"
+
+#. TRANSLATORS: this is the message dialog for the distro EOL notice
+#: src/gs-update-monitor.c:658
+msgid "Upgrade to continue receiving security updates."
+msgstr "Oppgrader for å få nye sikkerhetsoppdateringer."
+
+#. TRANSLATORS: this is a distro upgrade, the replacement would be the
+#. * distro name, e.g. 'Fedora'
+#: src/gs-update-monitor.c:713
+#, c-format
+msgid "A new version of %s is available to install"
+msgstr "En ny versjon av %s er tilgjengelig for installering"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:717
+msgid "Software Upgrade Available"
+msgstr "Oppgradering er tilgjengelig"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1114
+msgid "Software Updates Failed"
+msgstr "Programvareoppdateringer feilet"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:1116
+#, fuzzy
+#| msgid "An important OS update failed to be installed."
+msgid "An important operating system update failed to be installed."
+msgstr "En viktig OS-oppdatering feilet ved installasjon."
+
+#: src/gs-update-monitor.c:1117
+msgid "Show Details"
+msgstr "Vis detaljer"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1140
+msgid "System Upgrade Complete"
+msgstr "Systemoppgradering 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:1145
+#, 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:1151
+msgid "Software Update Installed"
+msgid_plural "Software Updates Installed"
+msgstr[0] "Programvareoppdatering installert"
+msgstr[1] "Programvareoppdateringer installert"
+
+#. TRANSLATORS: message when we've done offline updates
+#: src/gs-update-monitor.c:1155
+#, 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] "En viktig OS-oppdatering har blitt installert."
+msgstr[1] "Viktige OS-oppdateringer har blitt installert."
+
+#. 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:1166
+msgctxt "updates"
+msgid "Review"
+msgstr "Se gjennom"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1215
+msgid "Failed To Update"
+msgstr "Klarte ikke å oppdatere"
+
+#. TRANSLATORS: the user must have updated manually after
+#. * the updates were prepared
+#: src/gs-update-monitor.c:1221
+msgid "The system was already up to date."
+msgstr "Systemet var allerede oppdatert."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1226
+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:1232
+msgid ""
+"Internet access was required but wasn’t available. Please make sure that you "
+"have internet access and try again."
+msgstr ""
+"Tilgang til internett var nødvendig men ikke tilgjengelig. Sjekk at du har "
+"tilgang til internett og prøv igjen."
+
+#. TRANSLATORS: if the package is not signed correctly
+#: src/gs-update-monitor.c:1238
+msgid ""
+"There were security issues with the update. Please consult your software "
+"provider for more details."
+msgstr ""
+"Oppdateringen hadde problemer med sikkerheten. Spør progamvareleverandøren "
+"om flere detaljer."
+
+#. TRANSLATORS: we ran out of disk space
+#: src/gs-update-monitor.c:1244
+msgid ""
+"There wasn’t enough disk space. Please free up some space and try again."
+msgstr "Det var ikke nok diskplass. Vennligst frigjør plass og prøv igjen."
+
+#. TRANSLATORS: We didn't handle the error type
+#: src/gs-update-monitor.c:1249
+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 ""
+"Beklager, installering av oppdateringen feilet. Vennligst vent på en ny "
+"oppdatering og prøv igjen. Ta kontakt med programvareleverandøren hvis "
+"problemet vedvarer."
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: src/gs-updates-page.c:251
+#, c-format
+msgid "Last checked: %s"
+msgstr "Siste sjekk: %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:573
+#, c-format
+msgid "%s %s is no longer supported."
+msgstr "%s %s er ikke støttet lenger."
+
+#: src/gs-updates-page.c:577
+#, fuzzy
+#| msgid "Your OS is no longer supported."
+msgid "Your operating system is no longer supported."
+msgstr "Operativsystemet er ikke støttet lenger."
+
+#. TRANSLATORS: EOL distros do not get important updates
+#: src/gs-updates-page.c:582
+msgid "This means that it does not receive security updates."
+msgstr "Dette betyr at det ikke får sikkerhetsoppdateringer."
+
+#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26
+#: src/gs-updates-page.c:586
+msgid "It is recommended that you upgrade to a more recent version."
+msgstr "Det anbefales at du oppgraderer til en nyere versjon."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:867
+msgid "Charges May Apply"
+msgstr "Kostnader kan påløpe"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:871
+msgid ""
+"Checking for updates while using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Sjekk etter oppdateringer mens du bruker mobilt bredbånd kan medføre at det "
+"påløper kostnader."
+
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-updates-page.c:875
+msgid "Check _Anyway"
+msgstr "Sjekk _likevel"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:891
+msgid "No Network"
+msgstr "Ikke noe nettverk"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:895
+msgid "Internet access is required to check for updates."
+msgstr "Tilgang til internett kreves for å se etter oppdateringer."
+
+#: src/gs-updates-page.c:1282
+msgid "Checking…"
+msgstr "Sjekker …"
+
+#: src/gs-updates-page.c:1300
+msgid "Check for updates"
+msgstr "Se etter oppdateringer"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Side med oppdateringer"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:81
+#, fuzzy
+#| msgid "Pending update…"
+msgid "Loading Updates…"
+msgstr "Utestående oppdatering …"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:94
+#, fuzzy
+#| msgid "(This could take a while)"
+msgid "This could take a while."
+msgstr "(Dette kan ta tid)"
+
+#. TRANSLATORS: This means all software (plural) installed on this system is up to date.
+#: src/gs-updates-page.ui:202
+msgid "Up to Date"
+msgstr ""
+
+#: src/gs-updates-page.ui:241
+msgid "Use Mobile Data?"
+msgstr ""
+
+#: src/gs-updates-page.ui:242
+#, 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 ""
+"Å se etter oppdateringer ved bruk av mobilt bredbånd kan medføre kostnader"
+
+#: src/gs-updates-page.ui:245
+msgid "_Check Anyway"
+msgstr "_Sjekk likevel"
+
+#: src/gs-updates-page.ui:261
+msgid "No Connection"
+msgstr ""
+
+#: src/gs-updates-page.ui:262
+#, fuzzy
+#| msgid "Go online to check for updates"
+msgid "Go online to check for updates."
+msgstr "Gå på nettet for å se etter oppdateringer"
+
+#: src/gs-updates-page.ui:265
+msgid "_Network Settings"
+msgstr "Innstillinger for _nettverk"
+
+#: src/gs-updates-page.ui:294
+msgid "Error"
+msgstr ""
+
+#: src/gs-updates-page.ui:295
+#, fuzzy
+#| msgid "Updates are automatically managed"
+msgid "Updates are automatically managed."
+msgstr "Oppdateringer håndteres automatisk"
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:326
+msgid "Restart & Update"
+msgstr "Start på nytt og oppdater"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:332
+msgid "Update All"
+msgstr "Oppdater alle"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:473
+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:478
+msgid "Requires Restart"
+msgstr "Krever omstart"
+
+#. TRANSLATORS: This is the header for online runtime and
+#. * app updates, typically flatpaks or snaps
+#: src/gs-updates-section.c:483
+msgid "Application Updates"
+msgstr "Programoppdateringer"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:488
+msgid "Device Firmware"
+msgstr "Fastvare for enhet"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:69
+#: plugins/packagekit/gs-packagekit-task.c:153
+msgid "_Download"
+msgstr "Last ne_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:88
+#, fuzzy, c-format
+#| msgid "%s %s Now Available"
+msgid "%s %s Available"
+msgstr "%s %s er nå tilgjengelig"
+
+#. 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:93
+#, fuzzy, c-format
+#| msgid "%s %s Now Available"
+msgid "%s Available"
+msgstr "%s %s er nå tilgjengelig"
+
+#: src/gs-upgrade-banner.c:139
+msgid "Learn about the new version"
+msgstr ""
+
+#: src/gs-upgrade-banner.c:163
+#, fuzzy
+#| msgid "Downloading"
+msgid "Downloading…"
+msgstr "Laster ned"
+
+#. 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:181
+#, 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:185
+#, c-format
+msgid "%u%% downloaded"
+msgstr ""
+
+#: src/gs-upgrade-banner.ui:39
+msgid "A major upgrade, with new features and added polish."
+msgstr "En større oppgradering, med ny funksjonalitet og annet."
+
+#: src/gs-upgrade-banner.ui:184
+#, fuzzy
+#| msgid "Restart & Update"
+msgid "_Restart & Upgrade"
+msgstr "Start på nytt og oppdater"
+
+#: src/gs-upgrade-banner.ui:198
+#, fuzzy
+#| msgid ""
+#| "It is recommended that you back up your data and files before upgrading."
+msgid "Remember to back up data and files before upgrading."
+msgstr ""
+"Det anbefales at du sikkerhetskopierer dine data og filer før oppgradering."
+
+#: src/org.gnome.Software.desktop.in:4
+msgid "Add, remove or update software on this computer"
+msgstr "Legg til eller fjern programvare på denne datamaskinen"
+
+#. 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 ""
+"Oppdateringer;Oppgrader;Kilder;Repo;Brukervalg;Installer;Avinstaller;Program;"
+"Programvare;App;Butikk;"
+
+#. 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
+#, fuzzy
+#| msgid "%s System Update"
+msgid "System Updates"
+msgstr "Oppdatering for system %s"
+
+#. 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 "Laster ned utvalgte bilder …"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:590
+msgid "Endless OS"
+msgstr "Endless operativsystem"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:593
+msgid "An Endless OS update with new features and fixes."
+msgstr ""
+"En operativsystemoppdatering for Endless med ny funksjonalitet og "
+"feilrettinger."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:868
+msgid "EOS update service could not fetch and apply the update."
+msgstr ""
+"EOS oppdateringstjenesten kunne ikke hente og installere oppdateringen."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:248
+msgid "Downloading upgrade information…"
+msgstr "Laster ned informasjon om oppgradering …"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:370
+msgid ""
+"Upgrade for the latest features, performance and stability improvements."
+msgstr ""
+"Oppgrader ditt Fedora system med de siste funksjonene og forbedringene for "
+"ytelse og stabilitet."
+
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6
+msgid "Flatpak Support"
+msgstr "Støtte for Flatpak"
+
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7
+msgid "Flatpak is a framework for desktop applications on Linux"
+msgstr "Flatpak er et rammeverk for skrivebordsprogrammer på Linux"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1143
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Henter flatpak-metadata for %s …"
+
+#: plugins/flatpak/gs-flatpak.c:3194
+#, c-format
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-flatpak-utils.c:94
+#, fuzzy
+#| msgid "Installation"
+msgid "User Installation"
+msgstr "Installasjon"
+
+#: plugins/flatpak/gs-flatpak-utils.c:94
+#, fuzzy
+#| msgid "System Integration"
+msgid "System Installation"
+msgstr "Systemintegrasjon"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:976
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:990
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %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 "Oppdatering for enhet %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:139
+#, c-format
+msgid "%s System Update"
+msgstr "Oppdatering for system %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:144
+#, c-format
+msgid "%s Embedded Controller Update"
+msgstr "Oppdatering for innebygget kontroller %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:149
+#, c-format
+msgid "%s ME Update"
+msgstr "Oppdatering for administrasjonsmotor %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:154
+#, c-format
+msgid "%s Corporate ME Update"
+msgstr "Oppdatering for %s administrasjonsmotor for bedrifter"
+
+#. 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 "Oppdatering for %s ME for konsumenter"
+
+#. 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 "Oppdatering for %s kontroller"
+
+#. 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 "Oppdatering for %s Thunderbolt kontroller"
+
+#. 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 CPU mikrokodeoppdatering"
+
+#. 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 konfigurasjonsoppdatering"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, fuzzy, c-format
+#| msgid "%s System Update"
+msgid "%s Battery Update"
+msgstr "Oppdatering for system %s"
+
+#. TRANSLATORS: camera can refer to the laptop internal
+#. * camera in the bezel or external USB webcam
+#: plugins/fwupd/gs-fwupd-app.c:190
+#, fuzzy, c-format
+#| msgid "%s Consumer ME Update"
+msgid "%s Camera Update"
+msgstr "Oppdatering for %s ME for konsumenter"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, fuzzy, c-format
+#| msgid "%s ME Update"
+msgid "%s TPM Update"
+msgstr "Oppdatering for administrasjonsmotor %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, fuzzy, c-format
+#| msgid "%s ME Update"
+msgid "%s Touchpad Update"
+msgstr "Oppdatering for administrasjonsmotor %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, fuzzy, c-format
+#| msgid "%s ME Update"
+msgid "%s Mouse Update"
+msgstr "Oppdatering for administrasjonsmotor %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, fuzzy, c-format
+#| msgid "%s ME Update"
+msgid "%s Keyboard Update"
+msgstr "Oppdatering for administrasjonsmotor %s"
+
+#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter
+#: plugins/fwupd/gs-fwupd-app.c:210
+#, fuzzy, c-format
+#| msgid "%s Controller Update"
+msgid "%s Storage Controller Update"
+msgstr "Oppdatering for %s kontroller"
+
+#. TRANSLATORS: Network Interface refers to the physical
+#. * PCI card, not the logical wired connection
+#: plugins/fwupd/gs-fwupd-app.c:215
+#, fuzzy, c-format
+#| msgid "%s Controller Update"
+msgid "%s Network Interface Update"
+msgstr "Oppdatering for %s kontroller"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1105
+#, fuzzy
+#| msgid "Device Firmware"
+msgid "Firmware"
+msgstr "Fastvare for enhet"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Støtte for oppgradering av fastvare"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7
+msgid "Provides support for firmware upgrades"
+msgstr "Gir støtte for oppgradering av fastvare"
+
+#: plugins/packagekit/gs-packagekit-task.c:146
+#, fuzzy
+#| msgid "Install Third-Party Software?"
+msgid "Install Unsigned Software?"
+msgstr "Installer tredjepartsprogramvare?"
+
+#: plugins/packagekit/gs-packagekit-task.c:147
+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:151
+#, fuzzy
+#| msgid "Find in Software"
+msgid "Download Unsigned Software?"
+msgstr "Finn i programvare"
+
+#: plugins/packagekit/gs-packagekit-task.c:152
+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:156
+#, fuzzy
+#| msgid "Find in Software"
+msgid "Update Unsigned Software?"
+msgstr "Finn i programvare"
+
+#: plugins/packagekit/gs-packagekit-task.c:157
+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:433
+#, fuzzy
+#| msgid "Package"
+msgid "Packages"
+msgstr "Pakke"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2387
+#, fuzzy
+#| msgid "Operating System Updates Unavailable"
+msgid "Operating System (OSTree)"
+msgstr "Ingen oppdateringer er tilgjengelig for operativsystemet"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:287
+msgid "Snap Store"
+msgstr "Snap Store"
+
+#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6
+msgid "Snap Support"
+msgstr "Støtte for 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 universell Linux-pakke"
+
+#~ msgid "Select All"
+#~ msgstr "Velg alle"
+
+#~ msgid "Select None"
+#~ msgstr "Velg ingen"
+
+#~ msgid "_Installed"
+#~ msgstr "_Installert"
+
+#~ msgid "_Updates"
+#~ msgstr "_Oppdateringer"
+
+#~ msgid "Featured %s"
+#~ msgstr "Utvalgte fra %s"
+
+#~ msgid "Show"
+#~ msgstr "Vis"
+
+#~ msgid "Subcategories filter menu"
+#~ msgstr "Meny for underkategorifilter"
+
+#~ msgid "Sort"
+#~ msgstr "Sorter"
+
+#~ msgid "Subcategories sorting menu"
+#~ msgstr "Meny for underkategorisortering"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "Featured"
+#~ msgstr "Utvalgte"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "Featured"
+#~ msgstr "Utvalgte"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "Featured"
+#~ msgstr "Utvalgte"
+
+#~ msgid "Audio & Video"
+#~ msgstr "Lyd og bilde"
+
+#~ msgid "Developer Tools"
+#~ msgstr "Utviklingsverktøy"
+
+#~ msgid "Education & Science"
+#~ msgstr "Opplæring og vitenskap"
+
+#~ msgid "Games"
+#~ msgstr "Spill"
+
+#~ msgid "Graphics & Photography"
+#~ msgstr "Grafikk og fotografi"
+
+#~ msgid "Productivity"
+#~ msgstr "Produktivitet"
+
+#~ msgid "Communication & News"
+#~ msgstr "Kommunikasjon og nyheter"
+
+#~ msgid "Reference"
+#~ msgstr "Referanse"
+
+#~ msgid "Utilities"
+#~ msgstr "Verktøy"
+
+#~ msgid "_Read More"
+#~ msgstr "_Les mer"
+
+#~ msgid "_Read Less"
+#~ msgstr "_Les mindre"
+
+#~ msgid "_Launch"
+#~ msgstr "_Start"
+
+#~ msgid ""
+#~ "Unable to determine which parts of the system this application accesses. "
+#~ "This is typical for older applications."
+#~ msgstr ""
+#~ "Kan ikke bestemme hvilke deler av systemet denne applikasjonen "
+#~ "aksesserer. Dette er typisk for eldre applikasjoner."
+
+#~ msgctxt "updated"
+#~ msgid "Never"
+#~ msgstr "Aldri"
+
+#~ msgctxt "App permissions"
+#~ msgid "Low"
+#~ msgstr "Lavt nivå"
+
+#~ msgctxt "App permissions"
+#~ msgid "Medium"
+#~ msgstr "Middels nivå"
+
+#~ msgctxt "App permissions"
+#~ msgid "High"
+#~ msgstr "Høyt nivå"
+
+#~ msgctxt "App permissions"
+#~ msgid "Unknown"
+#~ msgstr "Ukjent"
+
+#~ 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] "Brukere er bundet av følgende lisens:"
+#~ msgstr[1] "Brukere er bundet av følgende lisenser:"
+
+#~ msgid "_Add shortcut"
+#~ msgstr "_Legg til snarvei"
+
+#~ msgid "Re_move shortcut"
+#~ msgstr "Fje_rn snarvei"
+
+#~ msgid "Localized in your Language"
+#~ msgstr "Tilpasset ditt språk"
+
+#~ msgid "Release Activity"
+#~ msgstr "Versjonsaktivitet"
+
+#~ msgid "Sandboxed"
+#~ msgstr "Kjører i sandkasse"
+
+#~ msgid "Category"
+#~ msgstr "Kategori"
+
+#~ msgid "Free"
+#~ msgstr "Fri"
+
+#~ msgctxt "Application license"
+#~ msgid "Unknown"
+#~ msgstr "Ukjent"
+
+#~ msgid ""
+#~ "This means that the software can be freely run, copied, distributed, "
+#~ "studied and modified."
+#~ msgstr ""
+#~ "Dette betyr at programvaren fritt kan kjøres, kopieres, distribueres, "
+#~ "studeres og endres."
+
+#~ msgid "Proprietary Software"
+#~ msgstr "Proprietær programvare"
+
+#~ 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 betyr at programvaren eies av et individ eller et selskap. Det er "
+#~ "ofte begrensninger på bruk og kildekoden kan vanligvis ikke aksesseres."
+
+#~ msgid "Unknown Software License"
+#~ msgstr "Ukjent programvarelisens"
+
+#~ msgid "The license terms of this software are unknown."
+#~ msgstr "Lisensbetingelsene for denne programvaren er ukjent."
+
+#~ msgid "The application was rated this way because it features:"
+#~ msgstr "Programmet var vurdert på denne måten fordi det inneholder:"
+
+#~ msgid "No details were available for this rating."
+#~ msgstr "Ingen detaljer var tilgjengelig for denne vurderingen."
+
+#~ msgctxt "app status"
+#~ msgid "Uninstalled"
+#~ msgstr "Avinstallert"
+
+#~ msgctxt "app status"
+#~ msgid "Installed"
+#~ msgstr "Installert"
+
+#~ msgctxt "app status"
+#~ msgid "Updated"
+#~ msgstr "Oppdatert"
+
+#~ msgctxt "app status"
+#~ msgid "Unknown"
+#~ msgstr "Ukjent"
+
+#~ msgid "History"
+#~ msgstr "Historikk"
+
+#~ msgid "More…"
+#~ msgstr "Mer …"
+
+#~ msgid "Recommended Audio & Video Applications"
+#~ msgstr "Anbefalte lyd- og bildeprogrammer"
+
+#~ msgid "Recommended Games"
+#~ msgstr "Anbefalte spill"
+
+#~ msgid "Recommended Graphics Applications"
+#~ msgstr "Anbefalte grafikkprogrammer"
+
+#~ msgid "Recommended Productivity Applications"
+#~ msgstr "Anbefalte produktivitetsprogrammer"
+
+#~ msgid ""
+#~ "Some of this software is proprietary and therefore has restrictions on "
+#~ "use, sharing, and access to source code."
+#~ msgstr ""
+#~ "Noe av denne programvaren er proprietær og har derfor begrensninger på "
+#~ "bruk, deling og tilgang til kildekoden."
+
+#~ msgid "Find out more…"
+#~ msgstr "Finn ut mer …"
+
+#~ msgid "Recent Releases"
+#~ msgstr "Nylige versjoner"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "Fjern «%s»?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "Slå av «%s»?"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Ingen ekstra programvarekilder"
+
+#~ msgid "_Enable"
+#~ msgstr "_Slå på"
+
+#~ msgid "_Remove…"
+#~ msgstr "Fje_rn …"
+
+#~ msgid "_Disable…"
+#~ msgstr "S_lå av …"
+
+#~ msgid "Disabling"
+#~ msgstr "Slår av"
+
+#~ msgid "Enabled"
+#~ msgstr "Slått på"
+
+#~ msgid "Disabled"
+#~ msgstr "Slått av"
+
+#~ msgid "ratings in total"
+#~ msgstr "poengsum totalt"
+
+#~ msgid "_Remove All"
+#~ msgstr "Fje_rn alle"
+
+#~ msgid "Looking for new updates…"
+#~ msgstr "Ser etter nye oppdateringer …"
+
+#~ msgid "Setting up updates…"
+#~ msgstr "Klargjør oppdateringer …"
+
+#~ msgid "Software is up to date"
+#~ msgstr "Programmene er oppdatert"
+
+#~ msgid "_Restart Now"
+#~ msgstr "Sta_rt på nytt nå"
+
+#~ msgid "Updates will be applied when the computer is restarted."
+#~ msgstr "Oppdateringer vil bli tatt i bruk når datamaskinen startes på nytt."
+
+#~ msgid "Waiting to Download %s %s"
+#~ msgstr "Venter på nedlasting av %s %s"
+
+#~ msgid "Downloading %s %s"
+#~ msgstr "Laster ned %s %s"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s klar til installering"
+
+#~ msgid "OS Updates"
+#~ msgstr "Oppdateringer for operativsystemet"
+
+#~ msgid "Includes performance, stability and security improvements."
+#~ msgstr "Inneholder forbedringer for ytelse, stabilitet og sikkerhet."
+
+#~ msgid "Failed to copy"
+#~ msgstr "Klarte ikke å kopiere"
+
+#~ msgid "Downloading firmware update signature…"
+#~ msgstr "Laster ned signatur for fastvareoppdatering …"
+
+#~ msgid "Downloading firmware update metadata…"
+#~ msgstr "Laster ned metadata for fastvareoppdatering …"
+
+#~ msgid "ODRS is a service providing user reviews of applications"
+#~ msgstr "ODRS er en tjeneste som gir brukere omtaler av programmer"
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 0000000..81b71cf
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,6302 @@
+# 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 <EMAIL@ADDRESS>, 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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-09-11 20:10+0545\n"
+"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
+"Language-Team: Nepali Translation Team <chautari@gmail.com>\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.0.1\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:21
+#: src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "सफ्टवेयर"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+#, fuzzy
+#| msgid "Installed Updates"
+msgid "Install and update apps"
+msgstr "अद्यावधिक (_U)"
+
+#: 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:1980 src/gs-application.c:256
+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 "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
+#, 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 "तेस्रो पक्ष मान्नु नपर्ने आधिकारिक भण्डारको सूची"
+
+#: 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 "अनुप्रयोग नि: शुल्क छ भनेर प्रयोगकर्तालाई सूचित गर्ने केही UI तत्वहरू देखाउनुहोस्"
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: 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 "सामग्री प्रकार प्रमाणित गर्न असफल भयो: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 किशोरकिशोरीका लागि उपयुक्त छ"
+
+#. 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 वयस्कहरूका लागि उपयुक्त छ"
+
+#. 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 %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
+#, fuzzy
+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:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+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 "संस्करण %s मा नयाँ"
+
+#: 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 "आईडी"
+
+#: 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
+#, fuzzy
+#| msgid "Install the application (using application ID)"
+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
+#, fuzzy
+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 "प्रतिलिपि अधिकार (©) २०१६-२०२२ जिनोम सफ्टवेयर योगदानकर्ता"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "pawan Chitrakar <chautari@gmail.com>"
+
+#. 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:2147
+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
+#, fuzzy
+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
+#, fuzzy
+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
+#, fuzzy
+msgid "Software no longer supported"
+msgstr "%s %s अब उप्रान्त समर्थित छैन।."
+
+#. 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 "स्रोत: %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 "%s बाट पुन: नामकरण गरियो"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "मद्दत अनुवाद %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 "अनुवाद"
+
+#: 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 (realm %s)"
+
+#: 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
+#, fuzzy
+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 "कृपया १ देखि %u सम्म कुनै सङ्ख्या प्रविष्ट गर्नुहोस्:"
+
+#. 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
+#, fuzzy
+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 "%s अहिले स्थापना भएको छ"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">free "
+"and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">स्वतन्त्र र खुला "
+"स्रोत सफ्टवेयर</a> छैन, र \"%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 “%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 "केही देशहरूमा %s स्थापना वा प्रयोग गर्नु गैरकानुनी हुन सक्दछ ।"
+
+#. 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] "%d मिनेट अगाडि"
+msgstr[1] "%d मिनेट अगाडि"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d घन्टा अगाडि"
+msgstr[1] "%d घन्टा अगाडि"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d दिन अघि"
+msgstr[1] "%d दिन अघि"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d हप्ता अघि"
+msgstr[1] "%d हप्ता अघि"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d महिना अघि"
+msgstr[1] "%d महिना अघि"
+
+#: src/gs-common.c:891
+#, 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:1246
+#, 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 "अनुप्रयोग"
+
+#. 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:332
+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:857 src/gs-details-page.c:883 src/gs-details-page.ui:228
+#: plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "स्थापना गर्नुहोस्"
+
+#: src/gs-details-page.c:873
+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:897
+msgid "_Install…"
+msgstr "_स्थापना गर्नुहोस्…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "अन्य अनुप्रयोगहरू %s द्वारा"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr ""
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "फेला पार्न असक्षम: \"%s\""
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "विवरण पृ्ष्ठ"
+
+#: src/gs-details-page.ui:39
+#, fuzzy
+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 "अद्यावधिक (_U)"
+
+#: 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:216
+#, fuzzy
+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] "%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: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: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 "%s फेला परेन"
+
+#. 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 "%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 ""
+
+#. 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 "%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:376
+#, 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: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 "%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: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 "%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: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
+#, fuzzy, 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: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 "%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 ""
+
+#. 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 "कुनै पनि खोजी परिणाम फेला पार्न असफल भयो: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s ढाँचाको फाइल"
+
+#: 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 "%s ले सम्भवत यो यन्त्रमा काम गर्दछ"
+
+#. 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 "सञ्जाल यन्त्र:\t%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:726
+#, fuzzy, 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 "%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 "हार्डवेयर समर्थन"
+
+#. 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 <a href=\"%s\">%s license</a>.\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
+#, fuzzy
+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
+#, fuzzy
+msgid "There are no reviews to moderate"
+msgstr "समीक्षा"
+
+#: src/gs-origin-popover-row.c:104
+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:2824
+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
+#, fuzzy, c-format
+#| msgid "Are you sure you want to remove the %s source?"
+msgid "Are you sure you want to remove the %s repository?"
+msgstr "तपाईँ \"%s\" स्थायि रुपमा मेट्न निश्चित हुनुहुन्छ?"
+
+#. 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
+#, fuzzy, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "तपाईँ साँच्चिकै '%s' उपकरण मेट्न चाहनुहुन्छ ?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:533
+#, fuzzy, c-format
+msgid "%s will be uninstalled, and you will have to install it to use it again."
+msgstr "%d %s %d %s चार्ज नभएसम्म (%d%%)"
+
+#: 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] "%u अनुप्रयोग स्थापना गरिएको"
+msgstr[1] "%u अनुप्रयोगहरू स्थापना गरिएका"
+
+#. 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 एड-इन स्थापना गरिएको छ"
+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-repo-row.c:175
+#, 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 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 एड-इन"
+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-repo-row.c:188
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "%s र%s स्थापना भयो"
+msgstr[1] "%s र%s स्थापना भयो"
+
+#. 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 "मन नपर्ने"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy\">privacy "
+"policy</a>. 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:93
+#, fuzzy
+#| msgid "About Software"
+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
+#, fuzzy
+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
+#, fuzzy
+#| msgid "Can read/write all your data"
+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 "%s सम्भावित असुरक्षित छ"
+
+#. 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 असुरक्षित छ"
+
+#. 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 "म्याद समाप्त भएको 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 "पछिल्लो स्क्रिनसट"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "स्क्रिनसट अवैध छ"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217 src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s बाट अद्यावधिकहरू डाउनलोड गर्न असक्षम भयो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "अद्यावधिकहरू डाउनलोड गर्न असक्षम भयो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "अद्यावधिक हरू डाउनलोड गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "अद्यावधिक डाउनलोड गर्न असक्षम: प्रमाणीकरण आवश्यक थियो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "अद्यावधिक हरू डाउनलोड गर्न असक्षम: प्रमाणीकरण अवैध थियो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+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:1371
+#, c-format
+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:1377
+#, c-format
+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:1389
+#, c-format
+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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "समर्थन नभएको %s स्थापना गर्न असक्षम"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+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:1406
+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:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "%s स्थापना गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+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:1422
+#, c-format
+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:1428
+#, 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:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "%s स्थापना गर्न असक्षम: AC पावर आवश्यक छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "%s स्थापना गर्न असक्षम: ब्याट्रीको स्तर धेरै न्यून छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+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:1502
+#, c-format
+msgid "Unable to update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "डाउनलोड असफल भएको कारण %s बाट अद्यावधिकहरू स्थापना गर्न असक्षम"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "डाउनलोड असफल भएको कारण अद्यावधिकहरू स्थापना गर्न असक्षम"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "%s अद्यावधिक गर्न असक्षम: पर्याप्त डिस्क खाली स्थान छैन"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, 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:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "%s अद्यावधिक गर्न असक्षम: प्रमाणीकरण आवश्यक थियो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, 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:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "%s अद्यावधिक गर्न असक्षम: प्रमाणीकरण अवैध थियो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, 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:1567
+#, 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:1573
+#, 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:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "%s अद्यावधिक गर्न असक्षम: AC पावर आवश्यक छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "अद्यावधिकहरू स्थापना गर्न असक्षम: AC पावर आवश्यक छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1602
+#, 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:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "%s अद्यावधिक गर्न असक्षम भयो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, 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:1658
+#, c-format
+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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1671
+#, fuzzy, c-format
+msgid "Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1679
+#, c-format
+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:1686
+#, c-format
+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:1692
+#, c-format
+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:1698
+#, 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:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "%s मा स्तरवृद्धि गर्न असक्षम: AC पावर आवश्यक छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1719
+#, c-format
+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:1756
+#, c-format
+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:1761
+#, c-format
+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:1766
+#, 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:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "%s हटाउन असक्षम: AC पावर आवश्यक छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "%s हटाउन असक्षम: ब्याट्रीको स्तर धेरै न्यून छ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923 src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934 src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "ओहो, केही गलत भयो"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "फाइल स्थापना गर्न असफल: समर्थन गर्दैन"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+#, fuzzy
+msgid "Failed to install file: authentication failed"
+msgstr "ड्राइभर स्थापन असफल"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "स्थापना गर्न असफल: समर्थन गरेन"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+#, fuzzy
+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:1961
+#, c-format
+msgid "Unable to contact %s"
+msgstr "%s सँग सम्पर्क गर्न अक्षम"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr ""
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "AC पावर आवश्यक"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+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 "None"
+
+#: src/gs-storage-context-dialog.c:139
+msgid "Application Data"
+msgstr "अनुप्रयोग डेटा"
+
+#: src/gs-storage-context-dialog.c:140
+#, fuzzy
+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 <a href=\"dummy\">_application settings</a>."
+msgstr ""
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s स्थापना भयो"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s स्थापना गरिदैछ"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (हटाउँदैछ)"
+
+#. 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 "%s मा स्थापना गरियो"
+
+#: src/gs-update-dialog.ui:77
+#, fuzzy
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+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
+#, fuzzy
+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 अनुप्रयोग अद्यावधिक गरियो — पुन: सुरु आवश्यक गर्नुहोस्"
+msgstr[1] "%u अनुप्रयोगहरू अद्यावधिक गरियो — पुन: सुरु आवश्यक गर्नुहोस्"
+
+#. 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 अनुप्रयोग अद्यावधिक गरियो"
+msgstr[1] "%u अनुप्रयोगहरू अद्यावधिक गरियो"
+
+#. 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 "%s र %s अद्यावधिक गरिएको छ ।."
+
+#. 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 अनुप्रयोगलाई पुन: सुरुआत आवश्यक हुन्छ ।"
+msgstr[1] "%u अनुप्रयोगहरूलाई पुन: सुरुआत आवश्यक हुन्छ ।"
+
+#. 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
+#, fuzzy, 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: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 "%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 "पुनरावलोकन गर्नुहोस्"
+
+#. 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 "अन्तिम जाँच : %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 अब उप्रान्त समर्थित छैन।."
+
+#: 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
+#, fuzzy
+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 "%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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s उपलब्ध छ"
+
+#: 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 "%s को %s डाउनलोड गरियो"
+
+#. 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%% डाउनलोड भयो"
+
+#: 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
+#, fuzzy
+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:404
+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 ""
+
+#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264
+#: plugins/flatpak/gs-flatpak.c:313
+#, fuzzy, c-format
+#| msgid "System Updates"
+msgid "System folder %s"
+msgstr "प्रणाली फोल्डर मेट्न सकिँदैन “{0}”."
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "गृह उपफोल्डर %s"
+
+#: 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 "डेस्कटप उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "कागजात फोल्डर"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "कागजात उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "सङ्गीत फोल्डर"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "सङ्गीत उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "तस्विर फोल्डर"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "चित्र सबफोल्डर %s"
+
+#: 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 "सार्वजनिक शेयर उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "भिडियो फोल्डर"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, fuzzy, c-format
+#| msgid "%s is suitable for %s"
+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 "टेम्प्लेट उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "प्रयोगकर्ता क्यास फोल्डर"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, fuzzy, c-format
+msgid "User cache subfolder %s"
+msgstr "वैध प्रतिमा क्याश होइन: %s\n"
+
+#: 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 "प्रयोगकर्ता कन्फिगरेसन उपफोल्डर %s"
+
+#: 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 "फ्प्रयोगकर्ता डाटा उपफोल्डर %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, fuzzy
+#| msgid "Home folder"
+msgid "User runtime folder"
+msgstr "रनटाइम"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, fuzzy, c-format
+msgid "User runtime subfolder %s"
+msgstr "प्रयोगकर्ताको गृह पृष्ठको ठेगाना ।"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, fuzzy, c-format
+#| msgid "No File System Access"
+msgid "Filesystem access to %s"
+msgstr "फाइल प्रणाली"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, fuzzy, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "\"%s\"मा '%s'को सूचना प्राप्त"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "'%s' एडअनका लागि स्थापना गर्न असफल: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, fuzzy, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "वस्तु थप्न असफल भयो: %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 ""
+
+#. 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 यन्त्र अद्यावधिक"
+
+#. 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 प्रणाली अद्यावधिक"
+
+#. 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 सम्मिलित नियन्त्रक अद्यावधिक"
+
+#. 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 अद्यावधिक"
+
+#. 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 अद्यावधिक"
+
+#. 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 अद्यावधिक"
+
+#. 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 नियन्त्रक अद्यावधिक"
+
+#. 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 थन्डरबोल्ट नियन्त्रक अद्यावधिक"
+
+#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU
+#. * at system bootup
+#: plugins/fwupd/gs-fwupd-app.c:176
+#, fuzzy, c-format
+msgid "%s CPU Microcode Update"
+msgstr "• सीपीयू अवास्तविकरण गर्न सक्षम: %s\n"
+
+#. 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 कन्फिगरेसन अद्यावधिक"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s क्यामेरा अद्यावधिक"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM अद्यावधिक"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s टचप्याड अद्यावधिक"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s माउस अद्यावधिक"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 भण्डारण नियन्त्रक अद्यावधिक"
+
+#. 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 सञ्जाल इन्टरफेस अद्यावधिक"
+
+#. 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 प्रदर्शन अद्यावधिक"
+
+#. 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 अद्यावधिक"
+
+#. 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 "%s USB प्राप्तकर्ता अद्यावधिक"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+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
+#, fuzzy
+msgid "Provides support for firmware upgrades"
+msgstr "पर्ल प्लगइनका लागि यो प्लगइनले समर्थन प्रदान गर्छ"
+
+#: plugins/packagekit/gs-packagekit-task.c:148
+#, fuzzy
+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
+#, fuzzy
+#| msgid "Find in Software"
+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
+#, fuzzy
+#| msgid "Find in Software"
+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:2687
+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 ""
+
+#~ 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 "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 "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 "कुनै पनि होइन (पूर्वानिर्धारित)"
+
+#~ msgid "_Installed"
+#~ msgstr "स्थापित"
+
+#~ msgid "_Updates"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "_Enable"
+#~ 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 डाउनलोड गर्दै"
+
+#, c-format
+#~ msgid "%s %s Ready to be Installed"
+#~ 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 "Failed to save file"
+#~ 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 "App ID"
+#~ msgstr "एप ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "डिजाइन मेटनुहोस्"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "ओएस्(OS) स्तरवृद्धि गर्नुहोस्"
+
+#~ 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 मा जानुहोस्"
+
+#~ msgid "Unable to update %s from %s"
+#~ msgstr "%2$s बाट %1$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 "Restart & Install"
+#~ 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 "Downloading new updates…"
+#~ msgstr "नयाँ अद्यावधिक डाउनलोड गर्दैछ..."
+
+#~ msgid "U_pdate All"
+#~ 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 "The update could not be completed."
+#~ 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 "अनुप्रयोग पाईएन"
+
+#, fuzzy
+#~ msgid "No sources found."
+#~ msgstr "शब्दकोश स्रोत फेला पर्यो"
+
+#~ msgid "OK"
+#~ 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 " वा"
+
+#, fuzzy
+#~ msgid "Web app"
+#~ msgstr "App ID"
+
+#~ 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..b4ab7c5
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,7243 @@
+# 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 <nfollens@gnome.org>, 2015-2022.
+# Justin van Steijn <jvs@fsfe.org> 2015, 2016, 2017, 2018, 2019, 2022.
+# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2016, 2018, 2019, 2020, 2021.
+# Reinout van Schouwen <reinouts@gnome.org>, 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: 2022-09-01 14:01+0000\n"
+"PO-Revision-Date: 2022-09-01 18:01+0200\n"
+"Last-Translator: Nathan Follens <nfollens@gnome.org>\n"
+"Language-Team: Dutch <gnome-nl-list@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.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 "Software"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+msgid "Install and update apps"
+msgstr "Installeer en update apps"
+
+#: 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 ""
+"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 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 ""
+"Software geeft aanbevolen en populaire toepassingen weer met nuttige "
+"beschrijvingen en meerdere schermafdrukken per toepassing. U vindt "
+"toepassingen door ofwel 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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Het Gnome-project"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr "De laatste tijdstempel toen het systeem online was en bijgewerkt werd"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "De server die moet worden gebruikt voor toepassingsbeoordelingen"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "De minimale karma-score voor beoordelingen"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Toegang geven tot het softwarebronnen-dialoogvenster"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Opwaarderingen aanbieden voor pre-releases"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://nl.wikipedia.org/wiki/Propri%C3%ABtaire_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Gnome Software AppStream systeembrede installer"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Leeftijdsbeoordeling"
+
+#: 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 "Hoe ontbrekende informatie bijdragen"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pakket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "In behandeling"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Installatie in afwachting"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Verwijdering in afwachting"
+
+#: 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 "Geïnstalleerd"
+
+#. 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 "Wordt geïnstalleerd"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Wordt verwijderd"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "Verwij_deren"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Netwerk"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Kan over het netwerk communiceren"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Systeemdiensten"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Sessiediensten"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Apparaten"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Kan systeem-apparaatbestanden lezen"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Persoonlijke map"
+
+#: 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 "Kan bestanden lezen, bewerken en aanmaken"
+
+#: 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 "Kan bestanden lezen"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Downloadmap"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Instellingen"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Kan alle instellingen inzien en wijzigen"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Verouderd weergavesysteem"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Gebruikt een oud en onveilig weergavesysteem"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Zandbak omzeilen"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Kan de zandbak en andere beperkingen omzeilen"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Update-details"
+
+#. 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 "Geen updatebeschrijving beschikbaar."
+
+#: 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 "Ga terug"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+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:855
+msgid "Reviews"
+msgstr "Beoordelingen"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Er zijn geen beoordelingen voor deze toepassing."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Geen beoordelingen"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versiegeschiedenis"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nieuw in versie %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versie %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Lokaal metainfo- of appdatabestand tonen"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Gedetailleerde foutopsporingsinformatie tonen"
+
+#: 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 update preferences"
+msgstr "Updatevoorkeuren 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 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:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Nathan Follens <nfollens@gnome.org>\n"
+"Justin van Steijn\n"
+"Hannie Dumoleyn\n"
+"Philip Goto\n"
+"Meer info over Gnome-NL https://nl.gnome.org"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Over Software"
+
+#. 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 "Een prettige manier om de software op uw systeem te beheren."
+
+#. 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 "Er zijn helaas geen details voor die toepassing."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Heeft toegang tot hardware-apparaten"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Heeft toegang tot alle 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Kan willekeurige toegangsrechten verkrijgen"
+
+#. 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 "Nagekeken door uw distributie"
+
+#. 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 "Geleverd door een derde partij"
+
+# 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:425
+msgid "Proprietary code"
+msgstr "Propriëtaire code"
+
+#. 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 "Controleerbare code"
+
+#. 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 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 "Deze software wordt niet meer ondersteund"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Onveilig"
+
+#: 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 "Alleen mobiel"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Werkt alleen op een klein scherm"
+
+#: 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 "Alleen bureaublad"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Werkt alleen op een groot scherm"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Schermgrootte komt niet overeen"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Biedt geen ondersteuning voor uw huidige schermgrootte"
+
+#: 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 "Vereist een aanraakscherm"
+
+#: 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 "Vereist een toetsenbord"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Vereist een muis"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Gamepad vereist"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptief"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Werkt op smartphones, tablets en bureaubladen"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Vereist waarschijnlijk een toetsenbord of muis"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Bevat geen leeftijd-ongepaste inhoud"
+
+#: src/gs-app-context-bar.c:753
+msgid "No age rating information available"
+msgstr "Geen leeftijdsbeoordeling beschikbaar"
+
+#. 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 "Website bezoeken"
+
+#. 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 "Installeren…"
+
+#. 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 "Annuleren"
+
+#. 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 "Installeren"
+
+#. 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 "Bijwerken"
+
+#. 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 "Verwijderen"
+
+#. 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 "Wordt verwijderd"
+
+#. 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 "Apparaat kan niet worden gebruikt tijdens het bijwerken."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "%s hernoemd"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Help mee met het vertalen van %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 wordt ontworpen, ontwikkeld en vertaald door een internationale "
+"gemeenschap van vrijwilligers.\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:5
+msgid "Translations"
+msgstr "Vertalingen"
+
+#: src/gs-app-translation-dialog.ui:92
+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:13
+msgid "Login Required"
+msgstr "Aanmelding vereist"
+
+#: 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 "_Annuleren"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Aanmelden"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Gebr_uiker"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Wachtwoord"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nieuw & bijgewerkt"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+msgid "Picks from the Web"
+msgstr "Selectie van webapps"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:125
+msgid "Other Software"
+msgstr "Overige software"
+
+#. 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 "Voer een getal in van 1 tot %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Kies een toepassing:"
+
+#: 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 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 is nu geïnstalleerd"
+
+#. 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 "Pas na een herstart zullen de wijzigingen van kracht zijn."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Systeemupdates zijn nu geïnstalleerd"
+
+#. 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 "Recent geïnstalleerde updates zijn klaar voor beoordeling"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Herstarten"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Starten"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Software van derden installeren?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Softwarebron van derden inschakelen?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s is geen <a href=\"https://nl.wikipedia.org/wiki/"
+"Vrije_software_en_opensourcesoftware\">vrije en openbronsoftware</a>, en "
+"wordt geleverd door ‘%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 wordt geleverd door ‘%s’."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Niet opnieuw waarschuwen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Gedetailleerde fouten van de pakketbeheerder volgen:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Gegevens"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Aanvaarden"
+
+#. 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] "Er is een update geïnstalleerd"
+msgstr[1] "Er zijn updates geïnstalleerd"
+
+#. 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] "Een toepassing is verwijderd"
+msgstr[1] "Toepassingen zijn verwijderd"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Niet nu"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Zojuist"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Zoeken in Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Meer weergeven"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Minder weergeven"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Wordt verwijderd…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Herstart vereist om installatie te voltooien"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Update in afwachting…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Voorbereiden…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Wordt verwijderd…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Installeren"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "He_rstarten"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Installeren…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Andere toepassingen van %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "U heeft internettoegang nodig om een beoordeling te schrijven"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "‘%s’ niet gevonden"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Pagina met informatie"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Toepassingsdetails worden geladen…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Help mee ver_talen"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Openen"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Bijwerken"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Downloaden"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Add-ons"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Geselecteerde add-ons zullen met de toepassing worden geïnstalleerd."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Inclusief softwarebron"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Geen softwarebron inbegrepen"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Deze toepassing bevat geen softwarebron en zal niet worden bijgewerkt met "
+"nieuwe versies."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Softwarebron geïdentificeerd"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Gebruik alleen softwarebronnen die u vertrouwt."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Geen metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Project_website"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Doneren"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Ver_talingen bijdragen"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "P_robleem melden"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Hulp"
+
+#. 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 "Beoordeling _schrijven"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Alle beoordelingen"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+msgid "Downloading extra metadata files…"
+msgstr "Extra metadatabestanden worden gedownload…"
+
+#. TRANSLATORS: separator for a list of items
+#: src/gs-extras-page.c:142
+msgid " and "
+msgstr " en "
+
+#. 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] "Beschikbare lettertypes voor het %s-script"
+msgstr[1] "Beschikbare lettertypes voor de %s-scripts"
+
+#. 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] "Beschikbare software voor %s"
+msgstr[1] "Beschikbare software voor %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Gevraagde software niet gevonden"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s niet gevonden"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "op de website"
+
+#. 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 "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: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 ""
+"Informatie over %s en opties voor het verkrijgen van ontbrekende "
+"toepassingen kunnen mogelijk gevonden worden %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 "Geen toepassingen beschikbaar die %s ondersteunen."
+
+#. 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 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: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 ""
+"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 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 ""
+"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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"%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: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] ""
+"%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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Geen zoekresultaten gevonden: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s bestandsformaat"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Gevraagde software kon niet gevonden worden"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Codecs-pagina"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Bureaubladondersteuning"
+
+#: 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 "Kan gebruikt worden op een groot scherm"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Bureaubladondersteuning onbekend"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Vereist een groot scherm"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Bureaublad niet ondersteund"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Kan niet gebruikt worden op een groot scherm"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobiele ondersteuning"
+
+#: 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 "Kan gebruikt worden op een klein scherm"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobiele ondersteuning onbekend"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Vereist een klein scherm"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobiel niet ondersteund"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Kan niet gebruikt worden op een klein scherm"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Toetsenbordondersteuning"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Toetsenbordondersteuning onbekend"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Toetsenbord vereist"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Ondersteunt toetsenborden"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Toetsenbord niet ondersteund"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Kan niet gebruikt worden met een toetsenbord"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Muisondersteuning"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Vereist een muis of aanwijsapparaat"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Muisondersteuning onbekend"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Muis vereist"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Ondersteunt muizen en aanwijsapparaten"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Muis niet ondersteund"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Aanraakschermondersteuning"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Aanraakschermondersteuning onbekend"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Aanraakscherm vereist"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Ondersteunt aanraakschermen"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Aanraakscherm niet ondersteund"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Kan niet gebruikt worden met een aanraakscherm"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad vereist"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Vereist een gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Gamepadondersteuning"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s werkt 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hardwareondersteuning"
+
+#. 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 "Geïnstalleerd"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Geïnstalleerd-pagina"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Toepassingen"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Webtoepassingen"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Systeemtoepassingen"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Gemaakt door de gemeenschap"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Deze software wordt openbaar ontwikkeld door een gemeenschap van "
+"vrijwilligers, en wordt uitgegeven onder de <a href=\"%s\">%s-licentie</a>.\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: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 ""
+"Deze software wordt openbaar ontwikkeld door een gemeenschap van "
+"vrijwilligers, en wordt uitgegeven onder de %s-licentie.\n"
+"\n"
+"U kunt meehelpen en de software zo nog beter maken."
+
+# 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
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Niet-vrij"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Meer informatie"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Softwarecatalogus downloaden"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Laden-pagina"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Starten…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatische updates gepauzeerd"
+
+#: 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 ""
+"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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Netwerkin_stellingen openen"
+
+# Moet dit niet ‘pagina modereren’ zijn?
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Modereren-pagina"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Er zijn geen beoordelingen om te modereren"
+
+#: src/gs-origin-popover-row.c:104
+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:108
+msgid "Beta"
+msgstr "Bèta"
+
+#. Translators: It's an origin scope, 'User' or 'System' installation
+#: src/gs-origin-popover-row.ui:138
+msgid "User"
+msgstr "Gebruiker"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Aanvullingen"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Verwijderingen"
+
+#. 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 "Updates"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Neerwaarderingen"
+
+#. 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 "geselecteerde externe bronnen"
+
+#. 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 ""
+"Geeft toegang tot extra software van %s. Bevat ook sommige propriëtaire "
+"software."
+
+#. 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 "Inschakelen"
+
+#. 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 "Verkennen"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Overzicht-pagina"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Softwarebronnen van derden inschakelen?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Overige categorieën"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Geen toepassingsgegevens gevonden"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Gebruikt heeft installatie afgewezen"
+
+#. 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 voorbereiden"
+
+#. 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 "Weet u zeker dat u de softwarebron %s wilt verwijderen?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Weet u zeker dat u %s wilt verwijderen?"
+
+#. 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 zal verwijderd worden en u zult het opnieuw moeten installeren om het te "
+"gebruiken."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Updatevoorkeuren"
+
+#: 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 ""
+"Om extra kosten en netwerklimieten te vermijden worden softwareupdates niet "
+"automatisch gedownload op mobiele verbindingen en verbindingen met een "
+"datalimiet."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatische updates"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Downloadt en installeert softwareupdates op de achtergrond, indien mogelijk."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Meldingen over automatische updates"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Melding tonen wanneer updates automatisch geïnstalleerd zijn."
+
+#. 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 ""
+"Een deel van de momenteel geïnstalleerde software is niet compatibel met %s. "
+"Als u doorgaat zal het volgende automatisch worden verwijderd bij het "
+"opwaarderen:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Incompatibele software"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Doorgaan"
+
+#. 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 ""
+"Software die vanuit ‘%s’ is geïnstalleerd zal geen updates meer ontvangen."
+
+#: 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:254
+msgid "_Disable"
+msgstr "_Uitschakelen"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Verwijderen"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Nieuwe softwarebronnen inschakelen"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Aanvullende softwarebronnen van geselecteerde derde partijen — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Deze softwarebronnen leveren de standaardsoftware vanuit %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Softwarebronnen"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Geen softwarebronnen"
+
+#. 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 toepassing geïnstalleerd"
+msgstr[1] "%u toepassingen geïnstalleerd"
+
+#. 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 add-on geïnstalleerd"
+msgstr[1] "%u add-ons geïnstalleerd"
+
+#. 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 toepassing"
+msgstr[1] "%u toepassingen"
+
+#. 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 add-on"
+msgstr[1] "%u add-ons"
+
+#. 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 en %s geïnstalleerd"
+msgstr[1] "%s en %s geïnstalleerd"
+
+#. 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 "Ik haat het"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Vind het niet leuk"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Het is oké"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Vind het leuk"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Ik hou ervan"
+
+#. 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 "Gelieve de tijd te nemen voor het schrijven van de beoordeling"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+msgid "The summary is too short"
+msgstr "De samenvatting is te kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "De samenvatting is te lang"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "De beschrijving is te kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Beoordeling plaatsen"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Plaatsen"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Beoordeling"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Samenvatting"
+
+#: src/gs-review-dialog.ui:97
+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”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Beoordeling"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Bekijk welke gegevens er worden verzonden in ons <a href=\"https://odrs."
+"gnome.org/privacy\">privacybeleid</a>. 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:93
+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:56
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "Onbekend"
+
+#. 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 ""
+"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:225
+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:239
+msgid "Report Review?"
+msgstr "Beoordeling rapporteren?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Rapporteren"
+
+#. 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 "Was deze beoordeling nuttig voor u?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ja"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nee"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Een beetje"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Rapporteren…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Verwijderen…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Kijk na of u de leverancier vertrouwt, want de toepassing bevindt zich niet "
+"in een zandbak"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+"Toepassing bevindt zich niet in een zandbak, maar de distributie heeft "
+"nagekeken dat deze niet kwaadwillend is"
+
+#. 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 "Geen toegangsrechten"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Netwerktoegang"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Geen netwerktoegang"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Gebruikt systeemdiensten"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Gebruikt sessiediensten"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Apparaattoegang"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Geen apparaattoegang"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Lees- en schrijftoegang tot volledig bestandssysteem"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Lees- en schrijftoegang tot persoonlijke map"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Leestoegang tot volledig bestandssysteem"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Leestoegang tot persoonlijke map"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Lees- en schrijftoegang tot downloadmap"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Leestoegang tot downloadmap"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Kan alle gegevens in uw downloadmap lezen"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Geen toegang tot bestandssysteem"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Heeft geen enkele toegang tot het bestandssysteem"
+
+# 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:341
+msgid "Proprietary Code"
+msgstr "Propriëtaire code"
+
+#: 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 ""
+"De broncode is niet openbaar, kan dus niet onafhankelijk gecontroleerd "
+"worden en is mogelijk onveilig"
+
+#. 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 "Controleerbare code"
+
+#: 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 ""
+"De broncode is openbaar en kan onafhankelijk gecontroleerd worden, waardoor "
+"het waarschijnlijker is dat de toepassing veilig is"
+
+#. 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 "Toepassingsontwikkelaar is geverifieerd"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Onveilige afhankelijkheden"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 is veilig"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s is onveilig"
+
+#. 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 "Veiligheid"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Bron"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Verouderde SDK-versie"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Geen schermafdruk beschikbaar"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Schermafdruk niet gevonden"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Schermafdruk ongeldig"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Zoek-pagina"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Zoeken naar apps"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Downloaden van updates mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Downloaden van updates mislukt: internettoegang vereist, maar niet "
+"beschikbaar"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Downloaden van updates mislukt: niet genoeg schijfruimte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Downloaden van updates mislukt: authenticatie vereist"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Downloaden van updates mislukt: authenticatie ongeldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Verkrijgen van lijst met updates mislukt"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr ""
+"Installeren van %s niet mogelijk omdat het downloaden van %s is mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Installeren van %s niet mogelijk omdat het downloaden is mislukt"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Installeren van %s niet mogelijk omdat runtime %s niet beschikbaar is"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Installeren van %s niet mogelijk omdat het niet wordt ondersteund"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr "Installeren mislukt: internettoegang vereist, maar niet beschikbaar"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Installeren mislukt: de toepassing heeft een ongeldig formaat"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Installeren van %s mislukt: niet genoeg schijfruimte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Installeren van %s mislukt: authenticatie vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Installeren van %s mislukt: authenticatie ongeldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Installeren van %s mislukt: wisselstroomvermogen vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Installeren van %s mislukt: accuniveau is te laag"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Installeren van %s 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" or
+#. * "Fedora Project [fedoraproject.org]"
+#: src/gs-shell.c:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Bijwerken van %s niet mogelijk omdat het downloaden van %s is mislukt"
+
+#. 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 update %s as download failed"
+msgstr "Bijwerken van %s niet mogelijk omdat het downloaden is 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Installeren van updates uit %s niet mogelijk omdat het downloaden is mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Installeren van updates niet mogelijk omdat het downloaden is mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr "Bijwerken mislukt: internettoegang vereist, maar niet beschikbaar"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Installeren van updates mislukt: niet genoeg schijfruimte"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Bijwerken van %s mislukt: authenticatie vereist"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Installeren van updates mislukt: authenticatie vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Bijwerken van %s mislukt: authenticatie ongeldig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Installeren van updates mislukt: authenticatie ongeldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Bijwerken van %s mislukt: wisselstroomvermogen vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Installeren van updates mislukt: wisselstroomvermogen vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Bijwerken van %s mislukt: accuniveau is te laag"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Installeren van updates mislukt: accuniveau is te laag"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Bijwerken van %s mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Installeren van updates 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:1658
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "%s opwaarderen 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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Opwaarderen naar %s niet mogelijk omdat het downloaden is mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr "Opwaarderen naar %s 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Opwaarderen naar %s 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Opwaarderen naar %s 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:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Opwaarderen naar %s mislukt: wisselstroomvermogen vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Opwaarderen naar %s mislukt: accuniveau is 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:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Opwaarderen naar %s mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Verwijderen van %s mislukt: authenticatie vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Verwijderen van %s mislukt: authenticatie ongeldig"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Verwijderen van %s mislukt: wisselstroomvermogen vereist"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Verwijderen van %s mislukt: accuniveau is te laag"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Verwijderen van %s mislukt"
+
+#. 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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Er is niet genoeg opslagruimte — maak wat ruimte vrij en probeer het opnieuw"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Helaas, er ging iets mis"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Installeren van bestand mislukt: niet ondersteund"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Installeren van bestand mislukt: authenticatie mislukt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Installeren mislukt: niet ondersteund"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Installeren mislukt: authenticatie 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 application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr ""
+"Het programma moet opnieuw gestart worden om nieuwe plug-ins te gebruiken."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Wisselstroomvermogen vereist"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Het accuniveau is te laag"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Softwarebronnen"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Updatevoorkeuren"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Schijf nakijken"
+
+#. 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 "Netwerkinstellingen"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Nu herstarten"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Meer informatie"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Zoeken"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Primair menu"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Kom _meer te weten"
+
+#. 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 "Updates"
+
+#. 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 "Application Data"
+msgstr "Toepassingsgegevens"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Gedeelde systeemonderdelen die door deze toepassing vereist worden"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Onbekend"
+
+#. 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 "Opslag"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Gecachete gegevens kunnen gewist worden vanuit de <a href=\"dummy"
+"\">toep_assingsinstellingen</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (geïnstalleerd)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (wordt geïnstalleerd)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (wordt verwijderd)"
+
+#. 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 "Geïnstalleerde updates"
+
+#. 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 "Geïnstalleerd op %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Geen updates geïnstalleerd"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Software-updates zijn verouderd"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Gelieve te controleren of er software-updates zijn."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritieke software-update klaar om te installeren"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr ""
+"Een belangrijke software-update staat klaar om geïnstalleerd te worden."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritieke software-updates beschikbaar om te downloaden"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Belangrijk: kritieke software-updates staan klaar."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Software-updates staan klaar om geïnstalleerd te worden"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Software-update staat klaar om geïnstalleerd te worden."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Software-updates beschikbaar om te downloaden"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Gelieve klaarstaande software-updates te downloaden."
+
+#. 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 toepassing bijgewerkt — Herstarten vereist"
+msgstr[1] "%u toepassingen bijgewerkt — Herstarten vereist"
+
+#. 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 toepassing bijgewerkt"
+msgstr[1] "%u toepassingen bijgewerkt"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s is bijgewerkt."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Herstart de toepassing."
+
+#. 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 en %s zijn bijgewerkt."
+
+#. 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 toepassing vereist een herstart."
+msgstr[1] "%u toepassingen vereisen een herstart."
+
+#. 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 "Bevat %s, %s en %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 "Updates voor besturingssysteem niet beschikbaar"
+
+#. 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 "Opwaardeer uw systeem om beveiligingsupdates te ontvangen."
+
+#. 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 "Er is een nieuwe versie van %s beschikbaar om te installeren"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Software-upgrade beschikbaar"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Software-updates mislukt"
+
+#. 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 "De installatie van een belangrijke systeemupdate is mislukt."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Gegevens tonen"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Bekijken"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Bijwerken mislukt"
+
+#. 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 "Het systeem was al bijgewerkt."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Laatst gecontroleerd: %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 wordt niet meer ondersteund."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Uw besturingssysteem wordt niet meer ondersteund."
+
+#. 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 "Dit betekent dat het geen beveiligingsupdates meer ontvangt."
+
+#. 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 ""
+"Het wordt aanbevolen om uw besturingssysteem bij te werken naar een meer "
+"recente versie."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+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:853
+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:857
+msgid "Check _Anyway"
+msgstr "_Toch controleren"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Geen netwerk"
+
+#. 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 "Internettoegang is vereist voor het controleren op updates."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Controleren op updates"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Updates"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Updates-pagina"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Updates laden…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Up-to-date"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Mobiele gegevens gebruiken?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "Toch _controleren"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Geen verbinding"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Ga online om te controleren op updates."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Netwerkinstellingen"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Fout"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Updates worden automatisch beheerd."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Herstarten & bijwerken"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Alles bijwerken"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Toepassingsupdates"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Apparaatfirmware"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s is beschikbaar"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Kom meer te weten over de nieuwe versie"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Downloaden…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% gedownload"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Hersta_rten & opwaarderen"
+
+#: src/gs-upgrade-banner.ui:201
+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."
+
+#: 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 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;Bronnen;Repositories;Preferences;Voorkeuren;Install;"
+"Installeren;Uninstall;Verwijderen;Program;Programma;Software;App;Toepassing;"
+"Applicatie;Store;Winkel;Pakketbronnen;Softwarebronnen;Broncode;Opslagbronnen;"
+
+#. 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 "Systeemupdates"
+
+#. 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 ""
+"Algemene systeemupdates, zoals beveiligings- en probleemoplossingsupdates, "
+"en prestatieverbeteringen."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Afbeeldingen worden gedownload…"
+
+#. 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-update met nieuwe functies en verbeteringen."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "Gnome Web"
+
+#: plugins/epiphany/org.gnome.Software.Plugin.Epiphany.metainfo.xml.in:6
+msgid "Web Apps Support"
+msgstr "Ondersteuning voor webapps"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Opwaarderingsinformatie wordt gedownload…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Systeemmap %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Persoonlijke submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Systeemmappen van host"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Systeemconfiguratie van host in /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Bureaublad-map"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Bureaublad-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Documenten-map"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Documenten-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Muziek-map"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Muziek-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Afbeeldingen-map"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Afbeeldingen-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Openbaar-map"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Openbaar-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Video’s-map"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Video’s-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Sjablonen-map"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Sjablonen-submap %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Cachemap van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Cache-submap %s van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Configuratiemap van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Configuratie-submap %s van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Gegevensmap van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Gegevens-submap %s van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Runtime-map van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Runtime-submap %s van gebruiker"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Flatpak-metadata voor %s worden opgehaald…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Externe server ‘%s’ verhindert de installatie van ‘%s’, mogelijk door de "
+"filter. Verwijder de filter en herhaal de installatie. Gedetailleerde "
+"foutmelding: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, c-format
+msgid "%s Battery Update"
+msgstr "Batterijupdate voor %s"
+
+#. 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 "Camera-update voor %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "TPM-update voor %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Touchpadupdate voor %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Muisupdate voor %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Toetsenbordupdate voor %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 "Update voor opslagcontroller %s"
+
+#. 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 "Update voor netwerkinterface %s"
+
+#. 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 "Schermupdate voor %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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Update van USB-ontvanger voor %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Niet-ondertekende software installeren?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Niet-ondertekende software downloaden?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Niet-ondertekende software bijwerken?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pakketten"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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 "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 "_Installed"
+#~ msgstr "_Geïnstalleerd"
+
+#~ msgid "_Updates"
+#~ msgstr "_Updates"
+
+#~ 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 "Reference"
+#~ msgstr "Referentie"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Onbekende softwarelicentie"
+
+#~ 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 "Remove"
+#~ msgstr "Verwijderen"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Geen aanvullende softwarebronnen"
+
+#~ msgid "_Enable"
+#~ msgstr "_Inschakelen"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Nu herstarten"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s klaar om te worden geïnstalleerd"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Opslaan van bestand mislukt"
+
+#~ 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 "App ID"
+#~ msgstr "App-ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Ontwerp verwijderen"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "OS-opwaardering"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "%s kopen mislukt"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Ik ben mijn wachtwoord vergeten"
+
+#~ 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 "U_pdate All"
+#~ msgstr "Alles _bijwerken"
+
+#~ 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"
+
+#~| msgid "_Install"
+#~ msgid "_Install All"
+#~ msgstr "Alles i_nstalleren"
+
+#~| 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 "web app"
+#~ msgstr "webapp"
+
+#~ 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..a6f9d47
--- /dev/null
+++ b/po/oc.po
@@ -0,0 +1,7404 @@
+# 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) <cvalmary@yahoo.fr>, 2015.
+# Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>, 2016, 2017, 2018.
+# Cedric <cvalmary@yahoo.fr>, 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: 2022-11-23 16:17+0000\n"
+"PO-Revision-Date: 2023-01-05 18:18+0100\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.2.2\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 "Logicials"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+#, fuzzy
+#| msgid "Installed Updates"
+msgid "Install and update apps"
+msgstr "Mesas a jorn installadas"
+
+#: 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 ""
+"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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Lo projècte GNOME"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Lo servidor a utilizar per las apreciacions d'aplicacions"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "La marca minimum per las apreciacions"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Prepausa de mesas a jorn per las versions en tèst"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://fr.wikipedia.org/wiki/Logicial_propri%C3%A9taire'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+#, 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:135
+#, 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:139
+#, 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."
+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:146
+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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Evaluacion per edat"
+
+#: 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 "How to add missing information"
+msgid "How to contribute missing information"
+msgstr "Cossí apondre d’informacions absentas"
+
+#: lib/gs-app.c:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+msgid "Package"
+msgstr "Paquet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "En espèra"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Installacion en espèra"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Supression en espèra"
+
+#: 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 "Installada"
+
+#. 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 "Installacion en cors"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Supression en cors"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstallar"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Ret"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Pòt comunicar a travèrs la ret"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Servicis sistèma"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Servicis de session"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Periferics"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Pòt accedir als fichièrs del sistèma"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Dorsièr personal"
+
+#: 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 "Pòt veire, editar e crear de fichièrs"
+
+#: 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 "Pòt veire los fichièrs"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Dorsièr de telecargament"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Paramètres"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Pòt veire e modificar quin paramètre que siá"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistèma d’afichatge desuet"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Utiliza un vièlh sistèma d’afichatge non securizat"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Fugida del nauc de sabla"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Se pòt escapar del nauc de sabla e contornar d’autras restriccions"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detalhs de la mesa a jorn"
+
+#. 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 "Cap de descripcion de la mesa a jorn es pas estada provesida."
+
+#: 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 "Tornar en arrièr"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+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:855
+msgid "Reviews"
+msgstr "Avaloracions"
+
+#: src/gs-app-reviews-dialog.ui:25
+#, fuzzy
+#| msgid "Sorry! There are no details for that application."
+msgid "No reviews were found for this application."
+msgstr "O planhèm, i a pas cap d'informacion sus aquesta aplicacion."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Cap d’avaloracion"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Istoric de versions"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novetats dins la version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Afichar un fichièr local metainfo o appdata"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Afichar las informacions detalhadas de desbugatge"
+
+#: 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 update preferences"
+msgstr "Afichar las preferéncias de mesa a jorn"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 Los contributors de GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>, 2015-2017."
+
+#. 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 "A prepaus de Logicials"
+
+#. 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 "Una faiçon eleganta de gerir las aplicacions de vòstre sistèma."
+
+#. 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 "O planhèm, i a pas cap d'informacion sus aquesta aplicacion."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Pòt accedir als periferics materials"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Pòt accedir als fichièr arbitràriament"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Pòt aquerir d’autorizacions arbitràrias"
+
+#. 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 "Repassat per vòstra distribucion"
+
+#. 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 "Provesit per una tèrça part"
+
+#. 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 "Còdi proprietari"
+
+#. 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 "Còdi analisable"
+
+#. 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 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 "Logicial pas mai pres en carga"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Pas segur"
+
+#: 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 "Mobil solament"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Fonciona solament sus un ecran pichon"
+
+#: 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 "Ordenador de burèu solament"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Fonciona solament sus un ecran grand"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Incoeréncia de talha d'ecran"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Pren pas en cargar la talha d’ecran actuala"
+
+#: 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 "Requerís un ecran tactil"
+
+#: 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 "Requerís un clavièr"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requerís una mirga"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Maneta requerida"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptatiu"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Fonciona suls mobils, tauletas e ordenadors de burèu"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Requerís probablament un clavièr o una mirga"
+
+#: src/gs-app-context-bar.c:662
+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:705
+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:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visitar lo site 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:159
+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:167 src/gs-updates-section.ui:62
+msgid "Cancel"
+msgstr "Anullar"
+
+#. 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 "Installar"
+
+#. 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 "Metre a jorn"
+
+#. 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 "Desinstallar"
+
+#. 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 "Desinstallacion"
+
+#. 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 "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:337 src/gs-shell-search-provider.c:264
+#, 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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "S'apelava %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ajudar a traduire %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 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:5
+msgid "Translations"
+msgstr "Traduccion"
+
+#: src/gs-app-translation-dialog.ui:92
+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:13
+msgid "Login Required"
+msgstr "Autentificacion requerida"
+
+#: 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 "A_nullar"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Connexion"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Utilizaire"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Senhal"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Novetats e actualizacions"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Autres logicial"
+
+#. 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 "Picatz una chifra de 1 a %u : "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Causissètz una aplicacion :"
+
+#: 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 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 es ara installada"
+
+#. 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 "Una reaviada es necessària per acabar l’installacion."
+
+#. 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 "L'aplicacion es ara operacionala."
+
+#. 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 "Las mesas a jorn del sistèma operatiu son ara installadas"
+
+#. 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 "Las mesas a jorn installadas recentament son ara consultablas"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reaviar"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Aviar"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Installar lo logicial tèrç ?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Activar los depauses logicials tèrces ?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s es pas un <a href=\"https://fr.wikipedia.org/wiki/Free/"
+"Libre_Open_Font_Software\">logicial liure e dobèrt</a> e es distribuit per « "
+"%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 es distribuit per « %s »."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "M'avertir pas mai"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Aquí los detalhs de las errors del gestionari de paquets :"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalhs"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Acceptar"
+
+#. 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] "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 removed some apps
+#: src/gs-common.c:760
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "Una aplicacion es estada suprimida"
+msgstr[1] "D’aplicacions son estadas suprimidas"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Pas ara"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Ara meteis"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "A_fichar mai"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Ne veire _mens"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Supression en cors…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Requerís una reaviada per acabar l’installacion"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Mesa a jorn en espèra…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparacion…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Desinstallacion…"
+
+#. 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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Installar"
+
+#: src/gs-details-page.c:889
+msgid "_Restart"
+msgstr "_Reaviar"
+
+#. 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:913
+msgid "_Install…"
+msgstr "_Installar…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, fuzzy, c-format
+#| msgid "Other Apps"
+msgid "Other Apps by %s"
+msgstr "Autras aplicacions"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+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:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Impossible de trobar « %s »"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Pagina de las descripcions"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Cargament dels detalhs de l'aplicacion…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Ajudar a _traduire"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Dobrir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Mesa a jorn"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Telecargament"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Extensions"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Las extensions seleccionadas seràn installadas amb l'aplicacion."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Depaus de logicials inclús"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Pas cap de depaus de logicials inclús"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Depaus de logicials identificat"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Utilizetz sonque los depauses de logicials que vos i fisatz."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Cap de metadonadas"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Site _Web del projècte"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "Far un _don"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribuir _Traduccions"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Senhalar una avaria"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Ajuda"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:907
+msgid "_Write Review"
+msgstr "_Redigir una avaloracion"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+msgid "All Reviews"
+msgstr "Totas las avaloracions"
+
+#. 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:142
+msgid " and "
+msgstr " e "
+
+#. 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] "Poliça disponibla per l'escript en %s"
+msgstr[1] "Poliças disponiblas per l'escript en %s"
+
+#. 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] "Logicial disponible per %s"
+msgstr[1] "Logicials disponibles per %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Cap de logicial es pas estat trobat"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s son introbables"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "sul site 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:354
+#, c-format
+msgid "No applications 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: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 ""
+"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 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 "Cap d'aplicacion pas disponibla per prene en carga %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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, 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:874
+#, c-format
+msgid "%s file format"
+msgstr "Format de fichièr %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Impossible de trobar lo logicial demandat"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Pagina de Codecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Presa en carga burèu"
+
+#: 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 "Se pòt pas utilizar sus un ecran grand"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Presa en carga burèu desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requerís un ecran grand"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Ordenador de burèu pas pres en carga"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Presa en carga mobil"
+
+#: 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 "Se pòt pas utilizar sus un ecran pichon"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Presa en carga mobil desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requerís un ecran pichon"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobil pas pres en carga"
+
+#: src/gs-hardware-support-context-dialog.c:610
+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:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Presa en carga clavièr"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Presa en carga clavièr desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Clavièr requerit"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Pren en carga los clavièrs"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Clavièr pas pres en carga"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Se pòt pas utilizar amb un clavièr"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Presa en carga de la mirga"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requerís una mirga o un dispositiu de puntatge"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Presa en carga de la mirga desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Mirga requerida"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Mirgas e dispositius de puntatge preses en carga"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mirga pas presa en carga"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Ecran tactil pres en carga"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Presa en carga ecran tactil desconeguda"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Ecran tactil requerit"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Pren en carga los ecrans tactils"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Ecran tactil pas pres en carga"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Se pòt pas utilizar sus un ecran tactil"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Maneta requerida"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Requerís una maneta"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Presa en carga maneta"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s fonciona 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Presa en carga materiala"
+
+#. 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 "Installadas"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Pagina installada"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicacions"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Web Aplicacions"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicacions sistèma"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Construch per la comunautat"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, 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 a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute 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: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 ""
+"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."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietari"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Ne saber mai"
+
+#: src/gs-license-tile.c:135
+#, 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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Telecargament del catalòg de logicials"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Pagina de Codecs"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Mesa en plaça de las mesas a jorn en cors…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Mesas a jorn automaticas en pausa"
+
+#: 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 ""
+"La ret actuala es ligada a un quòta. Las connexions mesuradas possedisson de "
+"limitas 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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Dobrir los paramètre_s ret"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderar la pagina"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "I a pas d'avaloracion a moderar"
+
+#: 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: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 "Utilizaire"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Apondons"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Supressions"
+
+#. 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 "Mesas a jorn"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Degradacions"
+
+#. 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 "sorgas extèrnas seleccionadas"
+
+#. 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 ""
+"Provesís l'accès a de logicials suplementaris de %s estant. D’unes logicials "
+"proprietaris son incluses."
+
+#. 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 "Activar"
+
+#. 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 "Explorar"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Apercebut de la pagina"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Activar los depauses logicials tèrces ?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Autras categorias"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Cap de donada d'aplicacion pas trobada"
+
+#: lib/gs-plugin-loader.c:2837
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "L’utilizaire a refusat l’installacion"
+
+#. 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 "Preparar %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 "Volètz vertadièrament suprimir lo depaus %s ?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Volètz vertadièrament desinstallar %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 serà suprimida e la vos caldrà reïnstallar per la poder utilizar tornamai."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferéncias de mesa a jorn"
+
+#: 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 ""
+"Per evitar de despensas e de quòta ret, las mesas a jorn de logicials son "
+"pas automaticament telecargadas sus connexion mobil o limitadas."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Mesas a jorn automaticas"
+
+#: src/gs-prefs-dialog.ui:20
+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."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificacions de mesa a jorn automatica"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Afichar de notificacions quand de mesas a jorn son estadas installadas "
+"automaticament."
+
+#. 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 ""
+"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:4
+msgid "Incompatible Software"
+msgstr "Logicial incompatible"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Contunhar"
+
+#. 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 ""
+"Lo logicial installat a partir de « %s » quitarà de recebre de mesas a jorn."
+
+#: 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:254
+msgid "_Disable"
+msgstr "_Desactivar"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Suprimir"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Activar de depauses de logicials novèls"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Aquestes depauses complètan lo logicial per defaut provesit per %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Depauses de Logicials"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Cap de depaus"
+
+#. 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 aplicacion installada"
+msgstr[1] "%u aplicacions installadas"
+
+#. 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 extension installada"
+msgstr[1] "%u extensions installadas"
+
+#. 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 aplicacion"
+msgstr[1] "%u aplicacions"
+
+#. 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 extension"
+msgstr[1] "%u extensions"
+
+#. 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 e %s installada"
+msgstr[1] "%s e %s installadas"
+
+#. 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 "Detèsti"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Passable"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Acceptable"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "M'agrada"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Adòri"
+
+#. 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 "Consacratz mai de temps a la redaccion de l'apreciacion"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Causissètz una apreciacion"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Lo resumit es tròp cort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Lo resumit es tròp long"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "La descripcion es tròp corta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Mandar l'apreciacion"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Mandar"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Avaloracion"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resumit"
+
+#: src/gs-review-dialog.ui:97
+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 »."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Repassar"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+#, fuzzy
+#| msgid ""
+#| "Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+#| "\">privacy policy</a>."
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Trobaretz la lista de las donadas transmesas dins nòstra <a href=\"https://"
+"odrs.gnome.org/privacy\">politica de confidencialitat</a>."
+
+#: 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:93
+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:56
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "Desconegut"
+
+#. 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 ""
+"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:225
+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:239
+msgid "Report Review?"
+msgstr "Senhalar un abús ?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Senhalar"
+
+#. 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 "Aquesta apreciacion vos es estada utila ?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Òc"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Non"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Bòf"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Senhalar…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Suprimir…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Verificatz que vos fisatz del vendeire, perque l’aplicacion es pas isolada"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Cap d’autorizacion"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Accès a la ret"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Cap d’accès a la ret"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Utiliza los servicis sistèma"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Utiliza los servicis de session"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Accès al periferic"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Cap d'accès al periferic"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Accès en lectura e escritura al repertòri personal"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Accès complet al sistèma de fichièrs"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Accès complet al repertòri personal"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Accès en lectura e escritura sul dossièr de telecargaments"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Accès en lectura sul dorsièr de telecargaments"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+#, 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:310
+#, 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:326
+msgid "No File System Access"
+msgstr "Cap d’accès al sistèma de fichièrs"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Pòt pas accedir als fichièrs del sistèma del tot"
+
+#. 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 "Còdi proprietari"
+
+#: 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 ""
+"Lo còdi font es pas public, pòt pas èsser auditat d’un biais independent e "
+"pòt èsser perilhós"
+
+#. 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 "Còdi analisable"
+
+#: 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 ""
+"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: 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 "Lo desvolopaire de l’aplicacion es verificat"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependéncias pas seguras"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 es segur"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s es pas segur"
+
+#. 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 "Seguretat"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Font"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Version de SDK obsolèta"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Cap de captura d'ecran pas provesida"
+
+#. 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 "Captura d'ecran introbabla"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+msgid "Screenshot not valid"
+msgstr "Captura d'ecran invalida"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:797
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Pagina de recèrca"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Recercar d'aplicacions"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 ""
+"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:1281
+#, 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:1288 src/gs-shell.c:1328
+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:1293
+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"
+
+#. 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 ""
+"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:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Impossible de telecargar las mesas a jorn : espaci de disc insufisent"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Impossible de telecargar las mesas a jorn : autentificacion requesida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Impossible de telecargar las mesas a jorn : autentificacion invalida"
+
+#. 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 ""
+"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:1331
+msgid "Unable to get list of updates"
+msgstr "Impossible d'obténer la lista de las mesas a jorn"
+
+#. 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 "Impossible d'installar %s : lo telecargament dempuèi %s a fracassat"
+
+#. 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 "Impossible d'installar %s : lo telecargament a fracassat"
+
+#. 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 ""
+"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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Impossible d'installar %s : es pas pres en carga"
+
+#. 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 ""
+"Installacion impossibla : l'accès a Internet es necessari mas indisponible"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Installacion impossibla : lo format de l'aplicacion es pas valid"
+
+#. 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 "Impossible d'installar %s : i a pas pro d'espaci de disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Impossible d'installar %s : autentificacion requesida"
+
+#. 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 "Impossible d'installar %s : autentificacion invalida"
+
+#. 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 ""
+"Impossible d'installar %s : avètz pas la permission d'installar de logicials"
+
+#. 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 "Impossible d'installar %s : brancatz lo sector"
+
+#. 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 "Impossible d’installar %s : la batariá es pas pro cargada"
+
+#. 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 "Impossible d'installar %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 ""
+"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 application name (e.g. "GIMP")
+#: src/gs-shell.c:1504
+#, c-format
+msgid "Unable to update %s as 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:1511
+#, c-format
+msgid "Unable to install updates from %s as 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:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Impossible d’installar las mesas a jorn, perque lo telecargament a fracassat"
+
+#. 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 ""
+"Impossible de metre a jorn : l'accès a Internet es necessari mas indisponible"
+
+#. 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 "Impossible de metre a jorn %s : i a pas pro d'espaci de disc"
+
+#. 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 "Impossible d’installar las mesas a jorn : espaci de disc insufisent"
+
+#. 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 "Impossible de metre a jorn %s : autentificacion requesida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr ""
+"Impossible d’installar las mesas a jorn : una autentificacion èra requesida"
+
+#. 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 "Impossible de metre a jorn %s : autentificacion invalida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Impossible d’installar las mesas a jorn : l’autentificacion èra pas valida"
+
+#. 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 ""
+"Impossible de metre a jorn %s : avètz pas la permission de metre a jorn los "
+"logicials"
+
+#. 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 ""
+"Impossible d’installar las mesas a jorn : avètz pas la permission de metre a "
+"jorn los logicials"
+
+#. 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 "Impossible de metre a jorn %s : brancatz lo sector"
+
+#. 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 ""
+"Impossible d’installar las mesas a jorn : brancatz l’alimentacion sector"
+
+#. 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 "Impossible de metre a jorn %s : la batariá es pas pro cargada"
+
+#. 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 ""
+"Impossible d’installar las mesas a jorn : la batariá es pas pro cargada"
+
+#. 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 "Impossible de metre a jorn %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Impossible d’installar las mesas a jorn"
+
+#. 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 "Impossible de metre a nivèl cap a %s dempuèi %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 "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 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 ""
+"Impossible de metre a nivèl cap a %s : l’accès a Internet èra necessari mas "
+"èra pas disponible"
+
+#. 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 "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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+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:1700
+#, c-format
+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"
+
+#. 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 "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:1712
+#, c-format
+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"
+
+#. 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 "Impossible de metre a nivèl cap a %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 "Impossible de desinstallar %s : autentificacion requesida"
+
+#. 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 "Impossible de desinstallar %s : autentificacion invalida"
+
+#. 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 ""
+"Impossible de desinstallar %s : avètz pas la permission de desinstallar lo "
+"logicial"
+
+#. 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 "Impossible de desinstallar %s : brancatz lo sector"
+
+#. 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 "Impossible de desinstallar %s : la batariá es pas pro cargada"
+
+#. 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 "Impossible de desinstallar %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 "Impossible de lancer %s : %s es pas installat"
+
+#. 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 "O planhèm, quicòm a pas foncionat"
+
+#. 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 "Espaci de disc insufisent — liberatz-ne e ensajatz tornarmai"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Impossible d’installar lo fichièr : es pas pres en carga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1891
+msgid "Failed to install file: authentication failed"
+msgstr "Impossible d'installar lo fichièr : l'autentificacion a fracassat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1926
+msgid "Failed to install: not supported"
+msgstr "Impossible d’installar : pas pres en carga"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1929
+msgid "Failed to install: authentication failed"
+msgstr "Impossible d’installar : l’autentificacion a fracassat"
+
+#. 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 "Impossible de contactar %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 "Logicials deu èsser reaviat per utilizar los novèls empeutons."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1984
+msgid "AC power is required"
+msgstr "Brancatz lo sector"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "La batariá es pas pro cargada"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Depauses de Logicials"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferéncias de _mesa a jorn"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examinar lo disc"
+
+#. 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 "Paramètres ret"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reaviar ara"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Mai d'informacions"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Recercar"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menú principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Ne saber _mai"
+
+#. 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 "Mesas a jorn"
+
+#. 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 "Application Data"
+msgstr "Donadas de l'aplicacion"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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
+msgid "Data created by you in the application"
+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 application 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
+msgid "Shared system components required by this application"
+msgstr "Compausants sistèma partejats requerits per aquesta aplicacion"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Desconegut"
+
+#. 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 "Emmagazinatge"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Las donadas en cache se pòdon escafar als <a href=\"dummy\">_paramètres de "
+"l’aplicacion</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (installada)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (installacion en cors)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (supression en cors)"
+
+#. 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 "Mesas a jorn installadas"
+
+#. 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 "Installadas sus %s"
+
+#: src/gs-update-dialog.ui:77
+#, fuzzy
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "No Updates Installed"
+msgstr "Mesa a jorn logiciala installada"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Las mesas a jorn logicialas son passadas de validitat"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Verificatz las mesas a jorn logicialas."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Mesa a jorn logiciala criticas d'installar"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Una importanta mesa a jorn logiciala es prèsta per l’installacion."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "De mesas a jorn logicialas importantas son disponiblas"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Important : de mesas a jorn criticas son en espèra."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Mesas a jorn logiciala d'installar"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Mesas a jorn logicials en espèra e prèsta per l’installacion."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "De mesas a jorn logicialas son disponiblas"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Telecargatz las mesas a jorn logicials en espèra."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u aplicacion mesa a jorn"
+msgstr[1] "%u aplicacions mesas a jorn"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s es estada mesa a jorn."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Reaviatz l’aplicacion."
+
+#. 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 e %s son estadas mesas a jorn."
+
+#. 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 aplicacion necessita una reaviada."
+msgstr[1] "%u aplicacions necessitan una reaviada."
+
+#. 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 "Inclutz %s, %s e %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 "Las mesas a jorn del sistèma operatiu son indisponiblas"
+
+#. 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 ""
+"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:728
+#, 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:732
+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:1137
+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:1139
+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."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Afichar los detalhs"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Passar en revista"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Darrièra verificacion : %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 es pas mai pres en carga."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Vòstre sistèma operatiu es pas mai pres en carga."
+
+#. 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 "Aquò significa que recep pas mai de mesas a jorn de seguretat."
+
+#. 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 "Es recomandat de metre al nivèl cap a una version mai recenta."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "I pòt aver facturacion"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Recercar m_algrat tot"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Pas cap de ret"
+
+#. 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 "L'accès a Internet es necessari per recercar de mesas a jorn."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Recercar de mesas a jorn"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Mesas a jorn"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Pagina de las mesas a jorn"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Cargament de las mesas a jorn…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "A jorn"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Utilizar la connexion mobila ?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Recercar malgrat tot"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Cap de connexion"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Se connectar per recercar de mesas a jorn."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Paramètres de la _ret"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Error"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Las mesas a jorn son geridas automaticament."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reaviar e metre a jorn"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Tot metre a jorn"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Mesas a jorn de l'aplicacion"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Micrologicial del periferic"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponible"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Ne saber mai tocant la version novèla"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Telecargament…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% telecargat"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reaviar e metre a jorn"
+
+#: src/gs-upgrade-banner.ui:201
+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."
+
+#: 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 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 ""
+"Actualizacion;mesas a jorn;mesa a nivèl;fonts;depauses;preferéncias;"
+"installar;desinstallar;programa;aplicacion;logicial;magazin;"
+
+#. 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 "Misas a jorn sistèma"
+
+#. 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 ""
+"Mesas a jorn sistèma generalas, talas coma las correccions de seguretat o "
+"d’anomalia, e los melhoraments de performanças."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Telecargament dels imatges meses en avant…"
+
+#. Translators: The '%s' is replaced with the OS name, like "Endless OS"
+#: plugins/eos-updater/gs-plugin-eos-updater.c:637
+#, 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:970
+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:498
+msgid "GNOME Web"
+msgstr "Web GNOME"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Telecargament de las informacions de mesa al nivèl…"
+
+#. 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 ""
+"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
+msgid "Flatpak is a framework for desktop applications 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:313
+#, fuzzy, c-format
+#| msgid "System Updates"
+msgid "System folder %s"
+msgstr "Misas a jorn sistèma"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, fuzzy, c-format
+#| msgid "Home folder"
+msgid "Home subfolder %s"
+msgstr "Dorsièr personal"
+
+#: plugins/flatpak/gs-flatpak.c:316
+#, fuzzy
+#| msgid "Home folder"
+msgid "Host system folders"
+msgstr "Dorsièr personal"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr ""
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, fuzzy
+#| msgid "Desktop Only"
+msgid "Desktop folder"
+msgstr "Ordenador de burèu solament"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, fuzzy, c-format
+#| msgid "Desktop Support"
+msgid "Desktop subfolder %s"
+msgstr "Presa en carga burèu"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, fuzzy
+#| msgid "Home folder"
+msgid "Documents folder"
+msgstr "Dorsièr personal"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, fuzzy, c-format
+#| msgid "Home folder"
+msgid "Documents subfolder %s"
+msgstr "Dorsièr personal"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Dorsièr de musica"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, fuzzy, c-format
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music subfolder %s"
+msgstr "Lectors de musica"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Dorsièr d'imatges"
+
+#: 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 "Dorsièr vidèo"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, fuzzy, c-format
+#| msgid "%s is suitable for %s"
+msgid "Videos subfolder %s"
+msgstr "%s es adeqüat per %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Dorsièr de modèls"
+
+#: 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
+#, fuzzy
+#| msgid "%s Configuration Update"
+msgid "User configuration folder"
+msgstr "%s mesa a jorn de configuracion"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, fuzzy, c-format
+#| msgid "%s Configuration Update"
+msgid "User configuration subfolder %s"
+msgstr "%s mesa a jorn de configuracion"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, fuzzy
+#| msgid "User Data"
+msgid "User data folder"
+msgstr "Donadas utilizaire"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr ""
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, fuzzy
+#| msgid "Home folder"
+msgid "User runtime folder"
+msgstr "Dorsièr personal"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr ""
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, fuzzy, c-format
+#| msgid "No File System Access"
+msgid "Filesystem access to %s"
+msgstr "Cap d’accès al sistèma de fichièrs"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Telecargament de las metadonadas de Flatpak per %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+
+#. 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 "Misa 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:139
+#, c-format
+msgid "%s System Update"
+msgstr "Misa 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, fuzzy, c-format
+#| msgid "%s Device Update"
+msgid "%s USB Receiver Update"
+msgstr "Misa a jorn del periferic « %s »"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Micrologicial"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Installar un logicial non signat ?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Telecargar un logicial non signat ?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Actualizar lo logicial non signat ?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paquet"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2696
+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 "Application manager for GNOME"
+#~ msgstr "Gestionari d'aplicacions per GNOME"
+
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ 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 "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 "No updates have been installed on this system."
+#~ msgstr "Cap de de mesa a jorn pas installada sus aqueste sistèma."
+
+#~ 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 "Remove"
+#~ msgstr "Suprimir"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Pas cap de depaus suplementari"
+
+#~ msgid "_Enable"
+#~ msgstr "_Activar"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s e %s prèstes a èsser installadas"
+
+#~ msgid "Select All"
+#~ msgstr "Seleccionar tot"
+
+#~ msgid "Select None"
+#~ msgstr "Seleccionar pas res"
+
+#~ msgid "_Installed"
+#~ msgstr "_Installadas"
+
+#~ msgid "_Updates"
+#~ msgstr "Me_sas a jorn"
+
+#~ 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 "Reference"
+#~ msgstr "Referéncia"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Licéncia del logicial desconeguda"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Fracàs d’enregistrament del fichièr"
+
+#~ 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 "App ID"
+#~ msgstr "Identificant de l’aplicacion"
+
+#~ 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 "Delete Design"
+#~ msgstr "Suprimir lo dessenh"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Mesas al nivèl del sistèma operatiu"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Ai doblidat mon senhal"
+
+#~ 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 "Unable to update %s"
+#~ msgid "Unable to purchase %s"
+#~ msgstr "Impossible de metre a jorn %s"
+
+#~ 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 "U_pdate All"
+#~ msgstr "Tot metre a j_orn"
+
+#~ 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 "_Install All"
+#~ msgstr "_Installar"
+
+#~ 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 "web app"
+#~ msgstr "Aplicacion Web"
+
+#~ 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 "The update could not be completed."
+#~ msgstr "La mesa a jorn a fracassat."
+
+#~ 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 "No sources found."
+#~ msgstr "Aucune source trobada."
+
+#~ msgid "OK"
+#~ msgstr "Valider"
+
+#~ 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..b68beaf
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,7495 @@
+# 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.
+#
+# A S Alam <aalam@users.sf.net>, 2013, 2014, 2016, 2017, 2018, 2019, 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: 2022-10-16 21:02+0000\n"
+"PO-Revision-Date: 2022-10-16 18:10-0700\n"
+"Last-Translator: A S Alam <aalam@satluj.org>\n"
+"Language-Team: Punjabi <kde-i18n-doc@kde.org>\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 22.08.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 "Installed Updates"
+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 ""
+#| "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 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 "ਗਨੋਮ ਪਰੋਜੈੱਕਟ"
+
+#: 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 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 ""
+"ਵੱਡੀ ਗਿਣਤੀ ਦਾ ਅਰਥ ਹੈ ਕਿ ਰਿਮੋਟ ਸਰਵਰ ਲਈ ਘੱਟ ਫੇਰੇ ਲਾਉਣੇ ਪੈਣਗੇ, ਪਰ ਵਰਤੋਂਕਾਰ ਨੂੰ"
+" ਸਕਰੀਨਸ਼ਾਟ ਲਈ "
+"ਅੱਪਡੇਟ ਵਿਖਾਉਣ ਲਈ ਵੱਧ ਵੇਲਾ ਲੱਗੇਗਾ। 0 ਦਾ ਅਰਥ ਹੋਵੇਗਾ ਕਿ ਜੇ ਚਿੱਤਰ ਪਹਿਲਾਂ ਹੀ ਕੈਸ਼"
+" 'ਚ ਮੌਜੂਦ ਹੋਵੇਗਾ "
+"ਤਾਂ ਸਰਵਰ ਦੀ ਕਦੇ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ।"
+
+#: 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 ""
+"ਅਧਿਕਾਰਿਤ ਰਿਪੋਜ਼ਟਰੀਆਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ 3ਜੀ ਧਿਰ ਨਹੀਂ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ"
+
+#: data/org.gnome.software.gschema.xml:94
+#, 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 ""
+"ਅਧਿਕਾਰਿਤ ਰਿਪੋਜ਼ਟਰੀਆਂ ਦੀ ਸੂਚੀ, ਜਿਹਨਾਂ ਨੂੰ 3ਜੀ ਧਿਰ ਨਹੀਂ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ"
+
+#: 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 "ਜਦੋਂ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਮੁਕਤ ਸਾਫਟਵੇਅਰ ਮੰਨਿਆ ਜਾਵੇ ਤਾਂ ਵਰਤਣ ਲਈ ਲਸੰਸ URL"
+
+#: 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 ""
+"ਵਰਤੋਂਕਾਰ ਨੂੰ ਜਾਣਕਾਰੀ ਦੇਣ ਲਈ ਕੁਝ UI ਭਾਗ ਵੇਖਾਓ, ਜਦੋਂ ਕਿ ਐਪ ਦੀ ਗ਼ੈਰ-ਮੁਕਤ ਹੋਵੇ"
+
+#: 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://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "URI, ਜੋ ਕਿ ਗ਼ੈਰ-ਆਜ਼ਾਦ ਅਤੇ ਪਰੋਪਰੈਟਰੀ ਸਾਫ਼ਟਵੇਅਰਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦਿੰਦਾ ਹੈ"
+
+#: data/org.gnome.software.gschema.xml:131
+#, 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 ""
+"ਐਪਸਟਰੀਮ ਫਾਇਲਾਂ ਨੂੰ ਦਰਸਾਉਂਦੇ URL ਦੀ ਸੂਚੀ, ਜਿਸ ਤੋਂ ਇਸ ਨੂੰ ਐਪ-ਜਾਣਕਾਰੀ ਫੋਲਡਰ 'ਚ"
+" ਡਾਊਨਲੋਡ ਕੀਤਾ "
+"ਜਾ ਸਕਦਾ ਹੈ।"
+
+#: data/org.gnome.software.gschema.xml:135
+#, 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 "ਐਪ-ਸਟਰੀਮ ਫਾਇਲਾਂ ਨੂੰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਸਿਸਟਮ ਰੂਪੀ ਟਿਕਾਣੇ ਲਈ ਇੰਸਟਾਲ ਕਰੋ"
+
+#: 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 "ਲਾਗਇਨ ਕਰਨ ਲਈ gnome-online-account ਪਛਾਣ ਨੂੰ ਸੰਭਾਲਣ ਵਾਲੀ ਸਤਰ"
+
+#. 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 "ਇਹ ਪਰੋਗਰਾਮ ਕੇਵਲ ਰੂਟ (root) ਵਰਤੋਂਕਾਰਾਂ ਵਲੋਂ ਹੀ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, c-format
+#| msgid "Failed to validate content type"
+msgid "Failed to validate content type: %s"
+msgstr "ਸਮੱਗਰੀ ਕਿਸਮ ਪਰਮਾਣਿਤ ਲਈ ਅਸਫ਼ਲ ਹੈ: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, c-format
+#| msgid "Unable to remove %s"
+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 "No cartoon violence"
+msgid "Cartoon Violence"
+msgstr "ਕਾਰਟੂਨ ਤਸ਼ਦੱਦ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:136
+#| msgid "No cartoon violence"
+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 "No fantasy violence"
+msgid "Fantasy Violence"
+msgstr "ਕਲਪਨਿਕ ਤਸ਼ਦੱਦ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:146
+#| msgid "No fantasy violence"
+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 "No realistic violence"
+msgid "Realistic Violence"
+msgstr "ਅਸਲੀ ਤਸ਼ਦੱਦ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:156
+#| msgid "No realistic violence"
+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 "No sexual violence"
+msgid "Sexual Violence"
+msgstr "ਜਿਨਸੀ ਧੱਕਾ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:176
+#| msgid "No sexual violence"
+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 references to alcohol"
+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 references to illicit drugs"
+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 references to tobacco products"
+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 nudity of any sort"
+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
+#, fuzzy
+#| msgid "No references to or depictions of sexual nature"
+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
+#, fuzzy
+#| msgid "No profanity of any kind"
+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
+#, fuzzy
+#| msgid "No inappropriate humor"
+msgid "Inappropriate Humor"
+msgstr "ਕੋਈ ਅਢੁੱਕਵਾਂ ਮਜ਼ਾਕ ਨਹੀਂ"
+
+#. 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 "ਕੋਈ ਅਢੁੱਕਵਾਂ ਮਜ਼ਾਕ ਨਹੀਂ"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:254
+#| msgid "Documentation"
+msgid "Discrimination"
+msgstr "ਭੇਦਭਾਵ"
+
+#. 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 "ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੀ ਪੱਖਪਾਤੀ ਭਾਸ਼ਾ ਨਹੀਂ"
+
+#. 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 advertising of any kind"
+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 "Enabling"
+msgid "Gambling"
+msgstr "ਜੂਆ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:276
+#| msgid "No gambling of any kind"
+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 "Purchase"
+msgid "Purchasing"
+msgstr "ਖਰੀਦਦਾਰੀ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:286
+#| msgid "No ability to spend money"
+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 way to chat with other users"
+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
+#, fuzzy
+#| msgid "No way to talk with other users"
+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 "Source Details"
+msgid "Contact Details"
+msgstr "ਸੰਪਰਕ ਵੇਰਵੇ"
+
+#. 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 "ਸਮਾਜਿਕ ਨੈੱਟਵਰਕ ਵਰਤੋਂਕਾਰ ਜਾਂ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਸਾਂਝੇ ਨਹੀਂ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:324
+#| msgid "More Information"
+msgid "Identifying Information"
+msgstr "ਪਛਾਣ ਕਰਨ ਵਾਲੀ ਜਾਣਕਾਰੀ"
+
+#. 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 "ਤੀਜੀਆਂ ਧਿਰਾਂ ਨਾਲ ਵਰਤੋਂਕਾਰ ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ"
+
+#. 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 "ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਨਾਲ ਭੂਗੋਲਿਕ ਟਿਕਾਣਾ ਨਹੀਂ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"
+
+#. 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 references to homosexuality"
+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
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Construction"
+msgid "Prostitution"
+msgstr ""
+
+#. 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 "ਕੋਈ ਕੰਜਰਪੁਣੇ ਲਈ ਹਵਾਲੇ ਨਹੀਂ"
+
+#. 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 "ਕੇਵਲ ਬਾਲਗ"
+
+#. 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 "ਕੋਈ ਬਦਕਾਰੀ ਲਈ ਹਵਾਲੇ ਨਹੀਂ"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:390
+#| msgid "No sexualized characters"
+msgid "Sexualized Characters"
+msgstr "ਕਾਮਕਤਾ ਪਾਤਰ"
+
+#. TRANSLATORS: content rating description, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:392
+#| msgid "No sexualized characters"
+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
+#, fuzzy
+#| msgid "No references to desecration"
+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
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Humanities"
+msgid "Human Remains"
+msgstr "ਇਨਸਾਨੀ ਅੰਗ"
+
+#. 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 "ਕੋਈ ਮਰੇ ਹੋਏ ਮਨੁੱਖੀ ਬਚੇ ਹੋਏ ਸਰੀਰਿਕ ਹਿੱਸੇ ਨਹੀਂ"
+
+#. 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 references to slavery"
+msgid "No information regarding references to slavery"
+msgstr "ਗੁਲਾਮੀ ਦੇ ਹਵਾਲੇ ਸੰਬੰਧੀ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ"
+
+#: src/gs-age-rating-context-dialog.c:494
+#, fuzzy
+#| msgid "No references to illicit drugs"
+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
+#, fuzzy
+#| msgid "Uncontrolled chat functionality between users"
+msgid "Does not include uncontrolled chat functionality"
+msgstr "ਵਰਤੋਂਕਾਰਾਂ 'ਚ ਬਿਨਾਂ-ਕੰਟਰੋਲ ਗੱਲਬਾਤ ਸਹੂਲਤ"
+
+#: src/gs-age-rating-context-dialog.c:504
+#, fuzzy
+#| msgid "No realistic violence"
+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
+#| msgctxt "Menu of Education & Science"
+#| msgid "Languages"
+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 "Science"
+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
+#| msgid "All"
+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 "%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:1027
+#, 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:1031
+#, 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 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 ਅੱਲੜ੍ਹਾਂ ਲਈ ਢੁੱਕਵੀਂ ਹੈ"
+
+#. 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 file 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:1048
+#, 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: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
+#, fuzzy
+#| msgid "Show verbose debugging information"
+msgid "How to contribute missing information"
+msgstr "ਵੇਰਵੇ ਸਮੇਤ ਡੀਬੱਗ ਜਾਣਕਾਰੀ ਵੇਖਾਓ"
+
+#: lib/gs-app.c:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 installation…"
+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"
+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
+#| msgid "Installed"
+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 "ਅਣ-ਇੰਸਟਾਲ(_U)"
+
+#: 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 "The update details"
+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 "Sorry! There are no details for that application."
+msgid "No reviews were found for this application."
+msgstr "ਇਸ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਕੋਈ ਪੜਤਾਲਾਂ ਨਹੀਂ ਹਨ।"
+
+#: src/gs-app-reviews-dialog.ui:27
+#| msgid "Reviews"
+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 "ਵਰਜ਼ਨ %s ਵਿੱਚ ਨਵਾਂ"
+
+#: 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 "ਸ਼ੁਰੂ ਢੰਗ: ‘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 "Install the application (using application ID)"
+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: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 "AppStream ਲਈ ਲੋਕਲ ਫਾਇਲ ਸਰੋਤ ਨੂੰ ਪਹਿਲ"
+
+#: 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 ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਯੋਗਦਾਨੀ"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ\n"
+"ਪੰਜਾਬੀ ਓਪਨਸੋਰਸ ਟੀਮ (POST)"
+
+#. 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 "ਸਾਫਟਵੇਅਰ ਬਾਰੇ"
+
+#. 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
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data and %s of cache"
+msgstr "%s, %s ਅਤੇ %s ਸ਼ਾਮਲ ਹਨ।"
+
+#: src/gs-app-context-bar.c:168
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data"
+msgstr "%s, %s ਅਤੇ %s ਸ਼ਾਮਲ ਹਨ।"
+
+#: src/gs-app-context-bar.c:171
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of cache"
+msgstr "%s, %s ਅਤੇ %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 "%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:282
+#| msgid "Permissions"
+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 "System Services"
+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 "Session Services"
+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 system device files"
+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
+#, fuzzy
+#| msgid "Can access system device files"
+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
+#, fuzzy
+#| msgid "Can view and change any settings"
+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
+#, fuzzy
+#| msgid "Uses an old, insecure display system"
+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
+#, fuzzy
+#| msgid "Requires additional permissions"
+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"
+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 Repository Identified"
+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
+#, fuzzy
+#| msgid "Your OS is no longer supported."
+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 Restart"
+msgid "Requires a keyboard"
+msgstr "ਕੀਬੋਰਡ ਚਾਹੀਦਾ ਹੈ"
+
+#: src/gs-app-context-bar.c:607
+#| msgid "Requires Restart"
+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
+#, fuzzy
+#| msgid "The application contains no age-inappropriate content."
+msgid "Contains no age-inappropriate content"
+msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਕੋਈ ਉਮਰ ਲਈ ਅਢੁੱਕਵੀਂ ਸਮੱਗਰੀ ਨਹੀਂ ਹੈ।"
+
+#: src/gs-app-context-bar.c:753
+#, fuzzy
+#| msgid "No update description available."
+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"
+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 "ਸਰੋਤ: %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 "%s ਤੋਂ ਨਾਂ ਬਦਲਿਆ ਗਿਆ"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "%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 "Installation"
+msgid "Translations"
+msgstr "ਉਲੱਥਾ"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "ਵੈੱਬਸਾਈਟ ਉਲੱਥਾ(_T)"
+
+#. 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: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 "ਰੱਦ ਕਰੋ(_C)"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "ਲਾਗਇਨ(_L)"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "ਵਰਤੋਂਕਾਰ(_U)"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "ਪਾਸਵਰਡ(_P)"
+
+#. 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
+#| msgid "All"
+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 Pick"
+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 "Updated"
+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 "Free Software"
+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 "1 ਤੋਂ %u ਲਈ ਕੋਈ ਨੰਬਰ ਦਿਓ: "
+
+#. 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 "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
+#| msgctxt "Menu subcategory of Video"
+#| msgid "Players"
+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 More"
+msgid "Learn"
+msgstr "ਸਿੱਖੋ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:295
+#| msgid "Developer"
+msgid "Develop"
+msgstr "ਡਿਵੈਲਪ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:298
+#| msgctxt "Menu of Add-ons"
+#| msgid "Codecs"
+msgid "Codecs"
+msgstr "ਕੋਡਕਸ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:300
+#| msgctxt "Menu of Add-ons"
+#| msgid "Hardware Drivers"
+msgid "Hardware Drivers"
+msgstr "ਹਾਰਡਵੇਅਰ ਡਰਾਇਵਰ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:302
+#| msgctxt "Menu of Add-ons"
+#| msgid "Fonts"
+msgid "Fonts"
+msgstr "ਫ਼ੌਂਟ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:304
+#| msgctxt "Menu of Add-ons"
+#| msgid "Input Sources"
+msgid "Input Sources"
+msgstr "ਇਨਪੁੱਟ ਸਰੋਤ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:306
+#| msgctxt "Menu of Add-ons"
+#| msgid "Language Packs"
+msgid "Language Packs"
+msgstr "ਭਾਸ਼ਾ ਪੈਕ"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:308
+#| msgctxt "Menu of Add-ons"
+#| msgid "Localization"
+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 "%s ਹੁਣ ਇੰਸਟਾਲ ਹੈ"
+
+#. 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 "OS updates are now installed"
+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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">ਮੁਫ਼ਤ ਅਤੇ ਆਜ਼ਾਦ ਸਰੋਤ ਸਾਫ਼ਟਵੇਅਰ</a> ਨਹੀਂ ਹੈ ਅਤੇ “%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 ਨੂੰ “%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 "ਕੁਝ ਦੇਸ਼ਾਂ 'ਚ %s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ ਜਾਂ ਵਰਤਣਾ ਗ਼ੈਰਕਨੂੰਨੀ ਹੋ ਸਕਦਾ ਹੈ।"
+
+#. 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 "ਮਨਜ਼ੂਰ(_A)"
+
+#. 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 "Enter GApplication service mode"
+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] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
+msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
+msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
+msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
+msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d ਮਹੀਨਾ ਪਹਿਲਾਂ"
+msgstr[1] "%d ਮਹੀਨੇ ਪਹਿਲਾਂ"
+
+#: src/gs-common.c:891
+#, 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: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 "ਐਪਲੀਕੇਸ਼ਨ"
+
+#. 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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "ਹੋਰ ਵੇਖੋ(_S)"
+
+#: src/gs-description-box.c:67
+#| msgid "_Show More"
+msgid "_Show Less"
+msgstr "ਘੱਟ ਵੇਖੋ(_S)"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "...ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/gs-details-page.c:367
+#| msgid "Requires Restart"
+msgid "Requires restart to finish install"
+msgstr "ਇੰਸਟਾਲ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਸਤੇ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
+
+#: src/gs-details-page.c:374
+#| msgid "Requires Restart"
+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"
+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 "ਇੰਸਟਾਲ ਕਰੋ(_I)"
+
+#: src/gs-details-page.c:886
+#| msgid "Restart"
+msgid "_Restart"
+msgstr "ਮੁੜ-ਚਾਲੂ ਕਰੋ(_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:910
+msgid "_Install…"
+msgstr "...ਇੰਸਟਾਲ ਕਰੋ(_I)"
+
+#. 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 "%s ਵਲੋਂ ਹੋਰ ਐਪਾਂ"
+
+#. 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:1734 src/gs-details-page.c:1750
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "“%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 "ਉਲੱਥੇ ਲਈ ਮਦਦ ਕਰੋ(_T)"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "ਖੋਲ੍ਹੋ(_O)"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "ਅੱਪਡੇਟ ਕਰੋ(_U)"
+
+#: 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 "_Website"
+msgid "Project _Website"
+msgstr "ਪਰੋਜੈਕਟ ਵੈੱਬਸਾਈਟ(_W)"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "ਦਾਨ ਦਿਓ(_D)"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "ਉਲੱਥੇ ਲਈ ਯੋਗਦਾਨ(_T)"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ(_R)"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "ਮਦਦ(_H)"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:907
+#| msgid "_Write a Review"
+msgid "_Write Review"
+msgstr "ਪੜਤਾਲ ਲਿਖੋ(_W)"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+#| msgid "Reviews"
+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] "%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: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: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 "%s ਨਹੀਂ ਲੱਭਿਆ"
+
+#. 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 "%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 ""
+"%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"%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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"%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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"%s ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇ ਨਾਲ ਨਾਲ ਚੋਣਾਂ ਕਿ ਇਸ ਪਰਿੰਟਰ ਲਈ ਸਹਾਇਕ ਡਰਾਇਵਰ ਕਿਵੇਂ ਲਿਆ ਜਾ"
+" ਸਕਦਾ ਹੈ, "
+"ਬਾਰੇ %s ਲੱਭਿਆ ਜਾ ਸਕਦਾ ਹੈ।"
+
+#. 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] ""
+"%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: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] ""
+"%s ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਲੱਭ ਰਹੇ ਸੀ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇਖੋ।"
+msgstr[1] ""
+"%s ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਲੱਭ ਰਹੇ ਸੀ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ %s ਨੂੰ ਵੇਖੋ।"
+
+#: 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"
+msgid "Failed to find any search results: %s"
+msgstr "ਕੋਈ ਵੀ ਖੋਜ ਨਤੀਜੇ ਲੱਭਣ ਲਈ ਫੇਲ੍ਹ: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s ਫਾਇਲ ਫਾਰਮੈਟ"
+
+#: 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 "Open Desktop Ratings Support"
+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 Restart"
+msgid "Requires a large screen"
+msgstr "ਵੱਡੀ ਸਕਰੀਨ ਚਾਹੀਦੀ ਹੈ"
+
+#: src/gs-hardware-support-context-dialog.c:589
+#| msgid "Open Desktop Ratings Support"
+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 "Limba Support"
+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 Restart"
+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 "Limba Support"
+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 "Login Required"
+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 "Steam Support"
+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 "Login Required"
+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
+#, fuzzy
+#| msgid "Login Required"
+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
+#, fuzzy
+#| msgid "Login Required"
+msgid "Gamepad Required"
+msgstr "ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ"
+
+#: src/gs-hardware-support-context-dialog.c:700
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a gamepad"
+msgstr "ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
+
+#: src/gs-hardware-support-context-dialog.c:702
+#, fuzzy
+#| msgid "Snap Support"
+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 "%s ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਸ਼ਾਇਦ ਕੰਮ ਕਰਦੀ ਹੈ"
+
+#. 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 ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੰਮ ਕਰਦੀ ਹੈ"
+
+#. 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 ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਠੀਕ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰੇਗੀ"
+
+#. 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 ਇਸ ਡਿਵਾਈਸ ਉੱਤੇ ਕੰਮ ਨਹੀਂ ਕਰੇਗੀ"
+
+#. 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 "Firmware Upgrade Support"
+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
+#| msgid "Installed"
+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 "An application"
+msgid "Applications"
+msgstr "ਐਪਲੀਕੇਸ਼ਨਾਂ"
+
+#: src/gs-installed-page.ui:95
+#| msgid "System Applications"
+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 "ਹਿੱਸਾ ਬਣੋ(_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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\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 "ਹੋਰ ਜਾਣੋ(_L)"
+
+#: 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 featured images…"
+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 ""
+"ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਮੀਟਰ ਵਾਲਾ ਹੈ। ਮੀਟਰ ਵਾਲੇ ਕਨੈਕਸ਼ਨ ਲਈ ਡਾਟਾ ਹੱਦ ਹੁੰਦੀ ਹੈ ਜਾਂ ਉਹਨਾਂ"
+" ਨਾਲ ਖ਼ਰਚੇ ਲਾਗੇ "
+"ਹੁੰਦੇ ਹਨ। ਡਾਟਾ ਬਚਾਉਣ ਲਈ ਆਟੋਮੈਟਿਕ ਅੱਪਡੇਟਾਂ ਨੂੰ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ।\n"
+"\n"
+"ਜਦੋਂ ਵੀ ਬਿਨਾਂ-ਮੀਟਰ ਵਾਲਾ ਨੈੱਟਵਰਕ ਮਿਲਿਆ ਤਾਂ ਆਟੋਮੈਟਿਕ ਅੱਪਡੇਟ ਮੁੜ-ਸ਼ੁਰੂ ਕੀਤੇ"
+" ਜਾਣਗੇ। ਉਦੋਂ ਤੱਕ ਅੱਪਡੇਟਾਂ "
+"ਨੂੰ ਖੁਦ ਇੰਸਟਾਲ ਕਰਨਾ ਹਾਲੇ ਵੀ ਸੰਭਵ ਹੋਵੇਗਾ।\n"
+"\n"
+"ਬਦਲਵੇਂ ਰੂਪ ਵਿੱਚ ਜੇ ਮੌਜੂਦਾ ਨੈੱਟਵਰਕ ਨੂੰ ਗਲਤੀ ਨਾਲ ਮੀਟਰ ਵਾਲੇ ਵਜੋਂ ਪਛਾਣਿਆ ਗਿਆ ਹੈ"
+" ਤਾਂ ਇਸ ਸੈਟਿੰਗ ਨੂੰ "
+"ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।"
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ(_S)"
+
+#: 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
+#| msgctxt "origin"
+#| msgid "Unknown"
+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"
+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
+#| msgid "Updates"
+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
+#, fuzzy, c-format
+#| msgid ""
+#| "Provides access to additional software, including web browsers and games."
+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"
+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 "Categories"
+msgid "Other Categories"
+msgstr "ਹੋਰ ਕੈਟਾਗਰੀਆਂ"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਡਾਟਾ ਨਹੀਂ ਲੱਭਿਆ"
+
+#: lib/gs-plugin-loader.c:2829
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "ਅਣਪਛਾਤਾ"
+
+#: src/gs-page.c:274
+#| msgid "Pending installation…"
+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 "ਕੀ ਤੁਸੀਂ %s ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#. 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 ""
+"%s ਤੋਂ ਸਭ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਤੁਹਾਨੂੰ ਇਹਨਾਂ ਨੂੰ ਵਰਤਣ ਲਈ"
+" ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਮੁੜ-"
+"ਇੰਸਟਾਲ ਕਰਨਾ ਪਵੇਗਾ।"
+
+#. 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 "ਕੀ ਤੁਸੀਂ %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 ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਕੀਤਾ ਜਾਵੇਗਾ ਅਤੇ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਵਰਤਣ ਲਈ ਫੇਰ ਇੰਸਟਾਲ ਕਰਨਾ ਪਵੇਗਾ।"
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "ਅੱਪਡੇਟ ਪਸੰਦਾਂ"
+
+#: 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 "ਜਦੋਂ ਮੋਬਾਈਲ ਮੀਟਰ ਵਾਲਾ ਕਨੈਕਸ਼ਨ ਹੋਵੇ ਤਾਂ ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਕਰਨਾ ਅਸਮਰੱਥ ਹੈ।"
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "ਆਪਣੇ-ਆਪ ਅੱਪਡੇਟ ਕਰੋ"
+
+#: 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 "ਕਿਸੇ ਵੀ ਬਾਕੀ ਰਹਿੰਦੇ ਅੱਪਡੇਟਾਂ ਨੂੰ ਬੈਕਗਰਾਊਂਡ ਵਿੱਚ ਇੰਸਟਾਲ ਕਰਦਾ ਹੈ"
+
+#: 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 ""
+"ਇਸ ਵੇਲੇ ਇੰਸਟਾਲ ਹੋਏ ਕੁਝ ਸਾਫ਼ਟਵੇਅਰ %s ਨਾਲ ਮਾਫ਼ਕ ਨਹੀਂ ਹਨ। ਜੇ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਿਆ"
+" ਤਾਂ ਅੱਪਗਰੇਡ ਕਰਨ ਦੇ "
+"ਦੌਰਾਨ ਅੱਗੇ ਦਿੱਤੇ ਆਪਣੇ-ਆਪ ਹਟਾਏ ਜਾਣਗੇ:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "ਨਾ-ਮਾਫ਼ਕ ਸਾਫਟਵੇਅਰ"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "ਜਾਰੀ ਰੱਖੋ(_C)"
+
+#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64"
+#: src/gs-repos-dialog.c:239
+#, 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 ""
+"ਇਸ ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਇੰਸਟਾਲ ਕੀਤੇ ਸਾਫ਼ਟਵੇਅਰ ਅੱਪਡੇਟ, ਸੁਰੱਖਿਆ ਸੁਧਾਰਾਂ ਸਮੇਤ, ਪ੍ਰਾਪਤ"
+" ਨਹੀਂ ਕਰ ਸਕਣਗੇ।"
+
+#: src/gs-repos-dialog.c:248
+#| msgid "Software Repositories"
+msgid "Disable Repository?"
+msgstr "ਰਿਪੋਜ਼ਟਰੀ ਅਸਮਰੱਥ ਕਰਨੀ ਹੈ?"
+
+#: src/gs-repos-dialog.c:248
+#| msgid "Software Repositories"
+msgid "Remove Repository?"
+msgstr "ਰਿਪੋਰਜ਼ਟਰੀ ਹਟਾਉਣੀ ਹੈ?"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:254
+#| msgid "Disable"
+msgid "_Disable"
+msgstr "ਅਸਮਰੱਥ(_D)"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "ਹਟਾਓ(_R)"
+
+#: src/gs-repos-dialog.c:508
+#| msgid "Software Repositories"
+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"
+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
+#, fuzzy, c-format
+#| msgid "Access additional software from selected third party sources."
+msgid "Additional repositories from selected third parties — %s."
+msgstr "ਚੁਣੇ ਗਏ ਤੀਜੀ ਧਿਰ ਸਰੋਤਾਂ ਤੋਂ ਵਧੀਕ ਸਾਫਟਵੇਅਰਾਂ ਲਈ ਪਹੁੰਚ।"
+
+#: src/gs-repos-dialog.c:528
+#| msgid "Third Party Repositories"
+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 "ਇਹ ਰਿਪੋਜ਼ਟਰੀਆਂ %s ਵਲੋਂ ਦਿੱਤੇ ਮੂਲ ਸਾਫਟਵੇਅਰਾਂ ਦਾ ਸਹਾਇਕ ਹਿੱਸਾ ਹਨ।"
+
+#. 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 "Software Repositories"
+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] "%u ਐਪਲੀਕੇਸ਼ਨ ਇੰਸਟਾਲ ਹੈ"
+msgstr[1] "%u ਐਪਲੀਕੇਸ਼ਨ ਇੰਸਟਾਲ ਹਨ"
+
+#. 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 ਐਡ-ਆਨ ਇੰਸਟਾਲ ਹੈ"
+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-repo-row.c:175
+#, 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 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 ਐਡ-ਆਨ"
+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-repo-row.c:188
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "%s ਅਤੇ %s ਇੰਸਟਾਲ ਹੈ"
+msgstr[1] "%s ਅਤੇ %s ਇੰਸਟਾਲ ਹਨ"
+
+#. 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 "ਇਸ ਨਾਲ ਨਫ਼ਰਤ ਹੈ"
+
+#. 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 "ਭੇਜੋ(_P)"
+
+#: 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
+#, fuzzy
+#| msgid ""
+#| "Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+#| "\">privacy policy</a>."
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"<a href=\"https://odrs.gnome.org/privacy\">ਪਰਦੇਦਾਰੀ ਨੀਤੀ</a> ਵਿੱਚ ਵੇਖੋ ਕਿ"
+" ਕਿਹੜਾ "
+"ਡਾਟਾ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ।"
+
+#: 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 "About Software"
+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: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 "Permissions"
+msgid "No Permissions"
+msgstr "ਕੋਈ ਮਨਜ਼ੂਰੀ ਨਹੀਂ"
+
+#: src/gs-safety-context-dialog.c:161
+#, fuzzy
+#| msgid "This application is fully sandboxed."
+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 Settings"
+msgid "Network Access"
+msgstr "ਨੈੱਟਵਰਕ ਪਹੁੰਚ"
+
+#: src/gs-safety-context-dialog.c:173
+#, fuzzy
+#| msgid "Can access system device files"
+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"
+msgid "No Network Access"
+msgstr "ਕੋਈ ਨੈੱਟਵਰਕ ਪਹੁੰਚ ਨਹੀਂ"
+
+#: src/gs-safety-context-dialog.c:177
+#, fuzzy
+#| msgid "Can access system device files"
+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 "System Services"
+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 "Session Services"
+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 "Devices"
+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
+#| msgctxt "Menu subcategory of Internet"
+#| msgid "Remote Access"
+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
+#, fuzzy
+#| msgid "Legacy display system"
+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
+#, fuzzy
+#| msgid "Permissions"
+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 "Settings"
+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 "Downloads folder"
+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 "File system"
+msgid "No File System Access"
+msgstr "ਕੋਈ ਫਾਇਲ ਸਿਸਟਮ ਪਹੁੰਚ ਨਹੀਂ"
+
+#: src/gs-safety-context-dialog.c:327
+#| msgid "Can access system device files"
+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"
+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 now installed"
+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 now installed"
+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:390
+#, c-format
+#| msgid "%s is now installed"
+msgid "%s is unsafe"
+msgstr "%s ਅਸੁਰੱਖਿਅਤ"
+
+#. 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 "Screenshot"
+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 "Screenshot"
+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] "%u ਹੋਰ ਮੇਲ"
+msgstr[1] "%u ਹੋਰ ਮੇਲ"
+
+#: src/gs-search-page.ui:6
+msgid "Search page"
+msgstr "ਖੋਜ ਸਫ਼ਾ"
+
+#: src/gs-search-page.ui:17
+#| msgid "Search for applications"
+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”"
+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 "%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 "%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 "ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ"
+
+#. 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 "%s ਤੋਂ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ"
+
+#. 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 "%2$s ਤੋਂ ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਰਹਿਣ ਕਰਕੇ %1$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 "ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਰਹਿਣ ਕਰਕੇ %1$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:1391
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "ਰਨਟਾਈਨ %2$s ਮੌਜੂਦ ਨਾ ਹੋਣ ਕਰਕੇ %1$s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#. 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 "ਸਹਾਇਕ ਨਾ ਹੋਣ ਕਰਕੇ %s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#. 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 "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ"
+
+#. 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 "%s ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ"
+
+#. 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 "%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 "ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਰਹਿਣ ਕਰਕੇ %2$s ਤੋਂ %1$s ਅੱਪਡੇਟ ਲਈ ਅਸਮਰੱਥ"
+
+#. 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 "ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਰਹਿਣ ਕਰਕੇ %1$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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "ਡਾਊਨਲੋਡ ਅਸਫ਼ਲ ਰਹਿਣ ਕਰਕੇ %1$s ਤੋਂ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#. 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 "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਲੋੜੀਂਦੀ ਡਿਸਕ ਥਾਂ ਮੌਜੂਦ ਨਹੀਂ ਹੈ"
+
+#. 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 "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਸੀ"
+
+#. 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 "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਅਯੋਗ ਸੀ"
+
+#. 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 ""
+"%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"
+
+#. 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 "%s ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ"
+
+#. 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 "ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ"
+
+#. 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 "%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: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 "%s ਅੱਪਡੇਟ ਲਈ ਅਸਮਰੱਥ"
+
+#. 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 "%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:1665
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1673
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1681
+#, c-format
+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:1688
+#, c-format
+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:1694
+#, c-format
+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:1700
+#, c-format
+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:1706
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "%s ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ"
+
+#. 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 "%s ਅੱਪਗਰੇਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ"
+
+#. 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 "%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 "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਚਾਹੀਦੀ ਸੀ"
+
+#. 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 "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਪਰਮਾਣਕਿਤਾ ਗ਼ਲਤ ਸੀ"
+
+#. 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 "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਤੁਹਾਨੂੰ ਸਾਫਟਵੇਅਰ ਹਟਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"
+
+#. 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 "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ: AC ਪਾਵਰ ਚਾਹੀਦੀ ਹੈ"
+
+#. 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 "%s ਹਟਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ: ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ"
+
+#. 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 "%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 "%s ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ"
+
+#. 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 "ਅਫਸੋਸ, ਕੁਝ ਗ਼ਲਤ ਵਾਪਰਿਆ"
+
+#. 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 "ਲੋੜ ਮੁਤਾਬਕ ਡਿਸਕ ਥਾਂ ਨਹੀਂ ਹੈ — ਕੁਝ ਹੋਰ ਥਾਂ ਖਾਲੀ ਕਰਕੇ ਕੋਸ਼ਿਸ਼ ਕਰੋ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "ਫਾਇਲ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਫ਼ਲ: ਸਹਾਇਕ ਨਹੀਂ ਹੈ"
+
+#. 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 "ਫਾਇਲ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਅਸਫ਼ਲ: ਪਰਮਾਣਕਿਤਾ ਅਸਫ਼ਲ ਹੈ"
+
+#. 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 "%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 "AC ਊਰਜਾ ਦੀ ਲੋੜ ਹੈ"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "ਬੈਟਰੀ ਪੱਧਰ ਬਹੁਤ ਘੱਟ ਹੈ"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "ਸਾਫਟਵੇਅਰ ਰਿਪੋਜ਼ਟਰੀਆਂ(_S)"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "ਅੱਪਡੇਟ ਪਸੰਦਾਂ(_U)"
+
+#. 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 "ਹੋਰ ਲੱਭੋ(_M)"
+
+#. 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 "ਅੱਪਡੇਟ"
+
+#. 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
+#| msgctxt "App permissions"
+#| msgid "None"
+msgid "None"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+#: src/gs-storage-context-dialog.c:139
+#| msgid "Application Updates"
+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 "Please restart the application."
+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 "%u application installed"
+#| msgid_plural "%u applications installed"
+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 "origin"
+#| msgid "Unknown"
+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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"ਕੈਸ਼ ਕੀਤੇ ਡਾਟੇ ਨੂੰ <a href=\"dummy\">ਐਪਲੀਕੇਸ਼ ਸੈਟਿੰਗਾਂ(_a)</a> ਤੋਂ ਮਿਟਾਇਆ ਜਾ"
+" ਸਕਦਾ ਹੈ।"
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (ਇੰਸਟਾਲ ਹੈ)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ)"
+
+#. 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 "%s ਨੂੰ ਇੰਸਟਾਲ ਕੀਤਾ"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+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] "%u ਐਪਲੀਕੇਸ਼ਨ ਅੱਪਡੇਟ ਕੀਤੀ — ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
+msgstr[1] "%u ਐਪਲੀਕੇਸ਼ਨਾਂ ਅੱਪਡੇਟ ਕੀਤੀਆਂ — ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ"
+
+#. 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 ਐਪਲੀਕੇਸ਼ਨ ਅੱਪਡੇਟ ਕੀਤੀ"
+msgstr[1] "%u ਐਪਲੀਕੇਸ਼ਨਾਂ ਅੱਪਡੇਟ ਕੀਤੀਆਂ"
+
+#. 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 "%s ਅਤੇ %s ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ।"
+
+#. 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 ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"
+msgstr[1] "%u ਐਪਲੀਕੇਸ਼ਨਾਂ ਲਈ ਮੁੜ-ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"
+
+#. 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 "%s ਦਾ ਨਵਾਂ ਵਰਜ਼ਨ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਮੌਜੂਦ ਹੈ"
+
+#. 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 OS update failed to be installed."
+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 "%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 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] "ਇੱਕ ਜ਼ਰੂਰੀ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਅੱਪਡੇਟ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
+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 "ਆਖਰੀ ਜਾਂਚ ਕੀਤੀ: %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 ਹੁਣ ਸਹਾਇਕ ਨਹੀਂ ਰਿਹਾ ਹੈ।"
+
+#: src/gs-updates-page.c:563
+#| msgid "Your OS is no longer supported."
+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 "ਕਿਵੇਂ ਵੀ ਚੈੱਕ ਕਰੋ(_A)"
+
+#. 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
+#| msgid "Updates"
+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 "Pending update…"
+msgid "Loading Updates…"
+msgstr "…ਅੱਪਡੇਟ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+#| msgid "(This could take a while)"
+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
+#, 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 ""
+"ਮੋਬਾਇਲ ਬਰਾਂਡਬੈਂਡ ਦੀ ਵਰਤੋਂ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਲਈ ਚੈੱਕ ਕਰਨ ਦੌਰਾਨ ਤੁਹਾਨੂੰ ਵਾਧੂ ਖਰਚਾ"
+" ਹੋ ਸਕਦਾ ਹੈ।"
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "ਕਿਵੇਂ ਵੀ ਚੈੱਕ ਕਰੋ(_C)"
+
+#: src/gs-updates-page.ui:262
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Construction"
+msgid "No Connection"
+msgstr "ਕੋਈ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਹੈ"
+
+#: src/gs-updates-page.ui:263
+#| msgid "Go online to check for updates"
+msgid "Go online to check for updates."
+msgstr "ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਆਨਲਾਈਨ ਜਾਓ।"
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ(_N)"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "ਗਲਤੀ"
+
+#: src/gs-updates-page.ui:296
+#| msgid "Updates are automatically managed"
+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 "ਡਾਊਨਲੋਡ ਕਰੋ(_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:90
+#, c-format
+#| msgid "%s %s Now Available"
+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:95
+#, c-format
+#| msgid "%s %s Now Available"
+msgid "%s Available"
+msgstr "%s ਮੌਜੂਦ ਹੈ"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "ਨਵੇਂ ਵਰਜ਼ਨ ਬਾਰੇ ਜਾਣੋ"
+
+#: src/gs-upgrade-banner.c:167
+#| msgid "Downloading"
+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 "%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:189
+#, 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 & Update"
+msgid "_Restart & Upgrade"
+msgstr "ਮੁੜ-ਚਾਲੂ ਤੇ ਅੱਪਗਰੇਡ ਕਰੋ(_R)"
+
+#: src/gs-upgrade-banner.ui:201
+#| msgid ""
+#| "It is recommended that you back up your data and files before upgrading."
+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 ""
+"ਅੱਪਡੇਟ;ਸਰੋਤ;ਰਿਪੋਜ਼ਟਰੀ;ਪਸੰਦ,ਇੰਸਟਾਲ;ਸਟੋਰ;ਅੱਪਗਰੇਡ;Updates;Upgrade;Sources;Reposito"
+"ries;"
+"Preferences;Install;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:67
+#| msgid "%s System Update"
+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 "An Endless OS update with new features and fixes."
+msgid "%s update with new features and fixes."
+msgstr "ਨਵੇਂ ਫ਼ੀਚਰਾਂ ਅਤੇ ਕੀਤੇ ਸੁਧਾਰਾਂ ਨਾਲ %s ਅੱਪਡੇਟ ਹੈ।"
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS ਅੱਪਡੇਟ ਸੇਵਾ ਅੱਪਡੇਟ ਲੱਭ ਅਤੇ ਲਾਗੂ ਨਹੀਂ ਕਰ ਸਕੀ ਹੈ।"
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+#| msgid "GNOME Software"
+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 "ਫਲੈਟਪਕ ਸਹਿਯੋਗ"
+
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7
+msgid "Flatpak is a framework for desktop applications on Linux"
+msgstr "ਫਲੈਟਪਕ (Flatpak) ਲੀਨਕਸ 'ਤੇ ਡੈਸਕਟਾਪ ਐਪਲੀਕੇਸ਼ਨਾਂ ਲਈ ਢਾਂਚਾ ਹੈ।"
+
+#. Reference: https://docs.flatpak.org/en/latest/flatpak-command-reference.html#idm45858571325264
+#: plugins/flatpak/gs-flatpak.c:313
+#, c-format
+#| msgid "System Services"
+msgid "System folder %s"
+msgstr "ਸਿਸਟਮ ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+#| msgid "Home folder"
+msgid "Home subfolder %s"
+msgstr "ਘਰ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+#| msgid "Home folder"
+msgid "Host system folders"
+msgstr "ਹੋਸਟ ਸਿਸਟਮ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "/etc ਤੋਂ ਹੋਸਟ ਸਿਸਟਮ ਸੰਰਚਨਾ"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#| msgid "Home folder"
+msgid "Desktop folder"
+msgstr "ਡੈਸਕਟਾਪ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "ਡੈਸਕਟਾਪ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#| msgid "Home folder"
+msgid "Documents folder"
+msgstr "ਦਸਤਾਵੇਜ਼ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+#| msgid "Home folder"
+msgid "Documents subfolder %s"
+msgstr "ਦਸਤਾਵੇਜ਼ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music folder"
+msgstr "ਸੰਗੀਤ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+#| msgctxt "Menu of Audio & Video"
+#| msgid "Music Players"
+msgid "Music subfolder %s"
+msgstr "ਸੰਗੀਤ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#| msgid "Home folder"
+msgid "Pictures folder"
+msgstr "ਤਸਵੀਰ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "ਤਸਵੀਰ ਸਬ-ਫੋਲਡਰ %s"
+
+#: 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 "ਪਬਲਿਕ ਸ਼ੇਅਰ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#| msgid "Home folder"
+msgid "Videos folder"
+msgstr "ਵੀਡੀਓ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "ਵੀਡੀਓ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#| msgid "Home folder"
+msgid "Templates folder"
+msgstr "ਟੈਂਪਲੇਟ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "ਟੈਂਪਲੇਟ ਸਬ-ਫੋਲਡਰ %s"
+
+#: 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 "ਵਰਤੋਂਕਾਰ ਕੈਸ਼ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#| msgid "%s Configuration Update"
+msgid "User configuration folder"
+msgstr "ਵਰਤੋਂਕਾਰ ਸੰਰਚਨਾ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+#| msgid "%s Configuration Update"
+msgid "User configuration subfolder %s"
+msgstr "ਵਰਤੋਂਕਾਰ ਸੰਰਚਨਾ ਸਬ-ਫੋਲਡਰ %s"
+
+#: 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 "ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਸਬ-ਫੋਲਡਰ %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#| msgid "Home folder"
+msgid "User runtime folder"
+msgstr "ਵਰਤੋਂਕਾਰ ਰਨਟਾਈਮ ਫੋਲਡਰ"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "ਵਰਤੋਂਕਾਰ ਰਨਟਾਈਮ ਸਬ-ਫੋਲਡਰ %s"
+
+#: 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 "…%s ਲਈ ਫਲੈਟਪਕ ਮੇਟਾਡਾਟਾ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, c-format
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr "‘%s’ ਐਡ-ਆਨ ਸੋਧਣ ਲਈ ਫੇਲ੍ਹ ਹੈ: %s"
+
+#: plugins/flatpak/gs-flatpak-utils.c:94
+#| msgid "Installation"
+msgid "User Installation"
+msgstr "ਵਰਤੋਂਕਾਰ ਇੰਸਟਾਲੇਸ਼ਨ"
+
+#: plugins/flatpak/gs-flatpak-utils.c:94
+#| msgid "System Integration"
+msgid "System Installation"
+msgstr "ਸਿਸਟਮ ਇੰਸਟਾਲੇਸ਼ਨ"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "‘%s’ ਐਡ-ਆਨ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਜੋੜਨ ਵਾਸਤੇ ਫੇਲ੍ਹ: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "‘%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 ""
+
+#. 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 ਡਿਵਾਈਸ ਅੱਪਡੇਟ"
+
+#. 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 ਸਿਸਟਮ ਅੱਪਡੇਟ"
+
+#. 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 ਇੰਬੈੱਡਡ ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ"
+
+#. 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 ਅੱਪਡੇਟ"
+
+#. 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 ਅੱਪਡੇਟ"
+
+#. 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 ਅੱਪਡੇਟ"
+
+#. 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 ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ"
+
+#. 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 ਥੰਡਰਬੋਲਟ ਕੰਟਰੋਲਰ ਅੱਪਡੇਟ"
+
+#. 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 CPU ਮਾਈਕਰੋਕੋਡ ਅੱਪਡੇਟ"
+
+#. 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 ਸੰਰਚਨਾ ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, c-format
+#| msgid "%s System Update"
+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:190
+#, c-format
+#| msgid "%s Consumer ME Update"
+msgid "%s Camera Update"
+msgstr "%s ਕੈਮਰਾ ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s TPM Update"
+msgstr "%s TPM ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Touchpad Update"
+msgstr "%s ਟੱਚਪੈਡ ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Mouse Update"
+msgstr "%s ਮਾਊਸ ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Keyboard Update"
+msgstr "%s ਕੀਬੋਰਡ ਅੱਪਡੇਟ"
+
+#. TRANSLATORS: Storage Controller is typically a RAID or SAS adapter
+#: plugins/fwupd/gs-fwupd-app.c:210
+#, c-format
+#| msgid "%s Controller Update"
+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:215
+#, c-format
+#| msgid "%s Controller Update"
+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:220
+#, c-format
+#| msgid "%s Device Update"
+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:225
+#, c-format
+#| msgid "%s ME Update"
+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:230
+#, c-format
+#| msgid "%s Device Update"
+msgid "%s USB Receiver Update"
+msgstr "%s USB ਰਿਸੀਵਰ ਅੱਪਡੇਟ"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+#| msgid "Device Firmware"
+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 Third-Party Software?"
+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
+#, fuzzy
+#| msgid "Find in Software"
+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
+#, fuzzy
+#| msgid "Find in Software"
+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 "Package"
+msgid "Packages"
+msgstr "ਪੈਕੇਜ"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+#| msgid "Operating System Updates Unavailable"
+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 "ਸਨੈਪ ਯੂਨੀਵਰਸਲ ਲੀਨਕਸ ਪੈਕੇਜ ਹੈ"
+
+#~ 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 "ਕੋਈ ਨਾ ਚੁਣੋ"
+
+#~ msgid "_Installed"
+#~ msgstr "ਇੰਸਟਾਲ ਕੀਤੇ(_I)"
+
+#~ msgid "_Updates"
+#~ msgstr "ਅੱਪਡੇਟ(_U)"
+
+#, 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "system"
+#~ 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 "Remove"
+#~ msgstr "ਹਟਾਓ"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "ਕੋਈ ਹੋਰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਨਹੀਂ"
+
+#~ msgid "_Enable"
+#~ msgstr "ਸਮਰੱਥ ਕਰੋ(_E)"
+
+#~ 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 "_Restart Now"
+#~ msgstr "ਹੁਣੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ(_R)"
+
+#~ 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 ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#, c-format
+#~ msgid "%s %s Ready to be Installed"
+#~ 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, %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 "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 "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 "ਗਨੋਮ ਸਾਫਟਵੇਅਰ ਬੈਨਰ ਡਿਜ਼ਾਇਨਰ"
+
+#~ msgid "No Designs"
+#~ msgstr "ਕੋਈ ਡਿਜਾਇਨ ਨਹੀਂ"
+
+#~ msgid "Error message here"
+#~ msgstr "ਇੱਥੇ ਗਲਤੀ ਸੁਨੇਹੇ"
+
+#~ msgid "App ID"
+#~ msgstr "ਐਪ ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "ਡਿਜ਼ਾਇਨ ਨੂੰ ਹਟਾਓ"
+
+#~ msgid "OS Upgrade"
+#~ 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 "I have forgotten my password"
+#~ 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 "U_pdate All"
+#~ msgstr "ਸਾਰੇ ਅੱਪਡੇਟ ਕਰੋ(_A)"
+
+#~ 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 "Web app"
+#~ msgid "web app"
+#~ msgstr "ਵੈੱਬ ਐਪ"
+
+#~ 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 "_Install"
+#~ msgid "_Install All"
+#~ msgstr "ਸਭ ਨੂੰ ਇੰਸਟਾਲ ਕਰੋ(_I)"
+
+#~| 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 "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 "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 sources found."
+#~ msgstr "ਕੋਈ ਸਰੋਤ ਨਹੀਂ ਲੱਭਿਆ।"
+
+#~ msgid "OK"
+#~ msgstr "ਠੀਕ ਹੈ"
+
+#~ 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..b2ed213
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,5377 @@
+# Polish translation for gnome-software.
+# Copyright © 2012-2022 the gnome-software authors.
+# This file is distributed under the same license as the gnome-software package.
+# Piotr Drąg <piotrdrag@gmail.com>, 2012-2022.
+# Aviary.pl <community-poland@mozilla.org>, 2012-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: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-08-28 16:42+0200\n"
+"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
+"Language-Team: Polish <community-poland@mozilla.org>\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:21
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"Ostatnia data, kiedy system był w trybie online i otrzymał jakieś "
+"aktualizacje"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Serwer używany do wyświetlania recenzji programów"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Minimalna karma recenzji"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Zezwolenie na używanie okna repozytoriów oprogramowania"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Oferowanie aktualizacji do wydań testowych"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://pl.wikipedia.org/wiki/Zamknięte_oprogramowanie'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Instalator plików AppStream w systemie"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 "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:1027
+#, 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:1031
+#, 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 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 "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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Klasyfikacja wiekowa"
+
+#: 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 "Jak dodać brakujące informacje"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pakiet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Oczekujące"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Oczekuje na instalację"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Oczekuje na usunięcie"
+
+#: 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 "Zainstalowane"
+
+#. 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 "Instalowanie"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Usuwanie"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Odinstaluj"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Sieć"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Może komunikować się przez sieć"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Usługi systemowe"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Usługi sesji"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Urządzenia"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Ma dostęp do plików na urządzeniach systemowych"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Katalog domowy"
+
+#: 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 wyświetlać, modyfikować i tworzyć pliki"
+
+#: 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 wyświetlać pliki"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Katalog pobierania"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Może wyświetlać i zmieniać dowolne ustawienia"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Przestarzały system wyświetlania"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Używa starego, niezabezpieczonego systemu wyświetlania"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Wyjście z izolacji"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Może opuszczać izolację i omijać inne ograniczenia"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Informacje o aktualizacji"
+
+#. 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 "Brak opisu aktualizacji."
+
+#: 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 "Wstecz"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Wymaga dodatkowych uprawnień."
+
+#. 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 "Recenzje"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Nie odnaleziono recenzji tego programu."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Brak recenzji"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Historia wersji"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nowości w wersji %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Wersja %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Wyświetla lokalny plik Metainfo lub AppData"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Wyświetla więcej informacji o debugowaniu"
+
+#: 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 update preferences"
+msgstr "Wyświetla preferencje aktualizacji"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016-2022 współtwórcy Menedżera oprogramowania GNOME"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Piotr Drąg <piotrdrag@gmail.com>, 2012-2022\n"
+"Aviary.pl <community-poland@mozilla.org>, 2012-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:2147
+msgid "About Software"
+msgstr "O programie"
+
+#. 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 "Łatwy sposób na zarządzanie oprogramowaniem na komputerze."
+
+#. 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 "Nie ma informacji o tym programie."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Ma dostęp do urządzeń sprzętowych"
+
+#. 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 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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Ma dostęp do dowolnych 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Może uzyskać dowolne uprawnienia"
+
+#. 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 "Zatwierdzone przez używaną dystrybucję"
+
+#. 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 "Dostarczane przez stronę trzecią"
+
+#. 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 "Kod własnościowy"
+
+#. 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 "Kod do wglądu"
+
+#. 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 "Zweryfikowany autor oprogramowania"
+
+#. 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 "Oprogramowanie nie jest już wspierane"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Niebezpieczne"
+
+#: 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 "Tylko dla telefonów"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Działa tylko na małym ekranie"
+
+#: 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 "Tylko dla komputerów"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Działa tylko na dużym ekranie"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Niepasujący rozmiar ekranu"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Nie obsługuje rozmiaru obecnego ekranu"
+
+#: 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 "Wymaga ekranu dotykowego"
+
+#: 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 "Wymaga klawiatury"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Wymaga myszy"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Kontroler jest wymagany"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptacyjny"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Działa na telefonach, tabletach i komputerach"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Prawdopodobnie wymaga klawiatury lub myszy"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Nie zawiera treści nieodpowiednich dla dzieci"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Witryna"
+
+#. 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 "Zainstaluj…"
+
+#. 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 "Anuluj"
+
+#. 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 "Zainstaluj"
+
+#. 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 "Zaktualizuj"
+
+#. 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 "Odinstaluj"
+
+#. 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 "Odinstalowywanie"
+
+#. 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 "Nie można używać urządzenia podczas aktualizacji."
+
+#. 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 "Ź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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Zmieniono nazwę z „%s”"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Pomóż tłumaczyć program %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 ""
+"Program %s jest projektowany, tworzony i tłumaczony przez międzynarodową "
+"społeczność ochotników.\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:5
+msgid "Translations"
+msgstr "Tłumaczenia"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Witryna tłu_maczeń"
+
+#. 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 "Repozytorium %s wymaga zalogowania (obszar %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Wymagane jest zalogowanie"
+
+#: 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 "_Anuluj"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Zaloguj się"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Użytkownik"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Hasło"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nowe i zaktualizowane"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Inne oprogramowanie"
+
+#. 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 "Proszę wpisać liczbę 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 "Proszę wybrać program:"
+
+#: 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 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 "Zainstalowano program %s"
+
+#. 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 "Wymagane jest ponowne uruchomienie, aby zastosować zmiany."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Zainstalowano aktualizacje systemu"
+
+#. 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 "Można przejrzeć ostatnio zainstalowane aktualizacje"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Uruchom ponownie"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Uruchom"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Zainstalować oprogramowanie dostarczane przez stronę trzecią?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Włączyć repozytorium oprogramowania dostarczane przez stronę trzecią?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"Program %s nie jest <a href=\"https://pl.wikipedia.org/wiki/"
+"Wolne_i_Otwarte_Oprogramowanie\">wolnym i otwartym oprogramowaniem</a>, "
+"a jest dostarczany przez źródło „%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 "Program %s jest dostarczany przez źródło „%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Bez ostrzegania ponownie"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Informacje o błędach z menedżera pakietów:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Informacje"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "Z_aakceptuj"
+
+#. 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] "Zainstalowano aktualizację"
+msgstr[1] "Zainstalowano aktualizacje"
+msgstr[2] "Zainstalowano aktualizacje"
+
+#. 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] "Usunięto program"
+msgstr[1] "Usunięto programy"
+msgstr[2] "Usunięto programy"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Nie teraz"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Przed chwilą"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Znajdź w menedżerze oprogramowania"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Więcej"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mniej"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Usuwanie…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Dokończenie instalacji wymaga ponownego uruchomienia"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Oczekująca aktualizacja…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Przygotowywanie…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Odinstalowywanie…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Zainstaluj"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Uruchom ponownie"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Zainstaluj…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Inne programy od: %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Wymagany jest dostęp do Internetu, aby napisać recenzję"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nie można odnaleźć „%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Strona informacji"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Wczytywanie informacji o programie…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"To oprogramowanie nie jest dostępne w używanym języku i będzie w języku "
+"angielskim."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "_Pomóż tłumaczyć"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Otwórz"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "Z_aktualizuj"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Pobieranie"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Dodatki"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Zaznaczone dodatki zostaną zainstalowane wraz z programem."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Dołączono repozytorium oprogramowania"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Nie dołączono repozytorium oprogramowania"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Rozpoznano repozytorium oprogramowania"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Należy używać tylko zaufanych repozytoriów oprogramowania."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Brak metadanych"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "_Witryna projektu"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "W_spomóż"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Pomóż tłu_maczyć"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Zgłoś problem"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "Pomo_c"
+
+#. 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 "_Napisz recenzję"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Wszystkie recenzje"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Dostępne czcionki dla pisma „%s”"
+msgstr[1] "Dostępne czcionki dla pism: %s"
+msgstr[2] "Dostępne czcionki dla pism: %s"
+
+#. 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] "Dostępne oprogramowanie dla „%s”"
+msgstr[1] "Dostępne oprogramowanie dla: %s"
+msgstr[2] "Dostępne oprogramowanie dla: %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Nie odnaleziono wymaganego oprogramowania"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "Nie odnaleziono „%s”"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "na stronie WWW"
+
+#. 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 "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: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 ""
+"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 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 "Brak programów do obsługi „%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:376
+#, 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] "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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Wyszukanie się nie powiodło: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Format plików %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Nie można odnaleźć wymaganego oprogramowania"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Strona kodeków"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Obsługa komputerów"
+
+#: 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 "Obsługuje używanie na dużym ekranie"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Nieznana obsługa komputerów"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Wymaga dużego ekranu"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Komputery nie są obsługiwane"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Obsługa telefonów"
+
+#: 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 "Obsługuje używanie na małym ekranie"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Nieznana obsługa telefonów"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Wymaga małego ekranu"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Telefony nie są obsługiwane"
+
+#: src/gs-hardware-support-context-dialog.c:610
+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:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Obsługa klawiatury"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Obsługa klawiatury jest nieznana"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Wymagana jest klawiatura"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Obsługuje klawiatury"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Klawiatury nie są obsługiwane"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Nie może być używane za pomocą klawiatury"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Obsługa myszy"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Wymaga myszy lub urządzenia wskazującego"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Obsługa myszy jest nieznana"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Wymagana jest mysz"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Obsługuje myszy i urządzenia wskazujące"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Myszy nie są obsługiwane"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Obsługa ekranów dotykowych"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Obsługa ekranów dotykowych jest nieznana"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Wymagany jest ekran dotykowy"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Obsługuje ekrany dotykowe"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Ekrany dotykowe nie są obsługiwane"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Nie można używać za pomocą ekranu dotykowego"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Wymagany jest kontroler"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Wymaga kontrolera"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Obsługa kontrolera"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "Program %s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Obsługa sprzętu"
+
+#. 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 "Zainstalowane"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Strona zainstalowanych"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Programy"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Programy WWW"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Programy systemowe"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Tworzone przez społeczność"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"To oprogramowanie jest publicznie tworzone przez społeczność ochotników "
+"i wydane na warunkach <a href=\"%s\">licencji %s</a>.\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: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 ""
+"To oprogramowanie jest publicznie tworzone przez społeczność ochotników "
+"i wydane na warunkach licencji %s.\n"
+"\n"
+"Można dołączyć do społeczności i pomóc jeszcze bardziej je ulepszyć."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Własnościowe"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Więcej informacji"
+
+#: 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 ""
+"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 go ulepszać."
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Pobieranie katalogu oprogramowania"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Wczytywanie strony"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Uruchamianie…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Wstrzymano automatyczne aktualizacje"
+
+#: 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 ""
+"Obecna sieć jest taryfowa. Połączenia taryfowe mają ograniczenia danych lub "
+"związane z nimi opłaty. Aby zaoszczędzić dane, automatyczne aktualizacje "
+"zostały wstrzymane.\n"
+"\n"
+"Automatyczne aktualizacje zostaną wznowione po przejściu na sieć "
+"nietaryfową. Do tego czasu nadal można ręcznie instalować aktualizacje.\n"
+"\n"
+"Można też zmienić to ustawienie, jeśli obecna sieć została niepoprawnie "
+"zidentyfikowana jako taryfowa."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Otwórz _ustawienia sieci"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Strona moderacji"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Brak recenzji do moderacji"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Użytkownika"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Dodawane"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Usuwane"
+
+#. 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 "Aktualizowane"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Instalowanie poprzedniej wersji"
+
+#. 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 "wybranych źródeł zewnętrznych"
+
+#. 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 ""
+"Zapewnia dostęp do dodatkowego oprogramowania z %s. Część oprogramowania "
+"jest własnościowa."
+
+#. 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 "Włącz"
+
+#. 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 "Odkrywaj"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Strona przeglądu"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Włączyć repozytoria oprogramowania dostarczane przez stronę trzecią?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Inne kategorie"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nie odnaleziono danych programu"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Nieznana"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Użytkownik odmówił instalacji"
+
+#. 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 "Przygotuj program %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 "Na pewno usunąć repozytorium „%s”?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Na pewno odinstalować program %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 ""
+"Program %s zostanie odinstalowany. Należy go zainstalować, aby móc używać go "
+"ponownie."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferencje aktualizacji"
+
+#: 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 ""
+"Aby uniknąć opłat i przekroczenia limitów sieci, aktualizacje oprogramowania "
+"nie są automatycznie pobierane na połączeniach komórkowych i taryfowych."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatyczne aktualizacje"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Pobiera i instaluje aktualizacje oprogramowania w tle, kiedy to możliwe."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Powiadomienia o automatycznej aktualizacji"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Wyświetlanie powiadomień po automatycznej instalacji aktualizacji."
+
+#. 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 ""
+"Część obecnie zainstalowanego oprogramowania jest niezgodna z systemem %s. "
+"Kontynuacja aktualizacji spowoduje automatyczne usunięcie poniższych "
+"programów:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Niezgodne oprogramowanie"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Kontynuuj"
+
+#. 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 ""
+"Oprogramowanie zainstalowane z repozytorium „%s” nie będzie już "
+"aktualizowane."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Wyłączyć repozytorium?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Usuń"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Włączanie nowych repozytoriów"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Dodatkowe repozytoria od wybranych stron trzecich. %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Te repozytoria uzupełniają domyślne oprogramowanie dostarczane przez system "
+"%s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repozytoria oprogramowania"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Brak repozytoriów"
+
+#. 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] "Zainstalowano %u program"
+msgstr[1] "Zainstalowano %u programy"
+msgstr[2] "Zainstalowano %u programów"
+
+#. 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] "Zainstalowano %u dodatek"
+msgstr[1] "Zainstalowano %u dodatki"
+msgstr[2] "Zainstalowano %u dodatków"
+
+#. 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 program"
+msgstr[1] "%u programy"
+msgstr[2] "%u programów"
+
+#. 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 dodatek"
+msgstr[1] "%u dodatki"
+msgstr[2] "%u dodatków"
+
+#. 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] "Zainstalowano %s i %s"
+msgstr[1] "Zainstalowano %s i %s"
+msgstr[2] "Zainstalowano %s i %s"
+
+#. 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 "Zły"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Słaby"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "W porządku"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Dobry"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Wspaniały"
+
+#. 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 "Proszę poświęcić więcej czasu na napisanie recenzji"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Proszę wybrać ocenę"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Podsumowanie jest za krótkie"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Podsumowanie jest za długie"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Opis jest za krótki"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publikacja recenzji"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Opublikuj"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Ocena"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Podsumowanie"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Proszę wpisać krótkie podsumowanie recenzji, na przykład: „Świetny program, "
+"polecam”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Recenzja"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Co sądzisz o tym programie? Proszę uzasadnić swoje zdanie."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"<a href=\"https://odrs.gnome.org/privacy\">Zasady ochrony prywatności</a> "
+"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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Zgłosić recenzję?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Zgłoś"
+
+#. 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 "Czy ta recenzja jest przydatna?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Tak"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nie"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Średnio"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Zgłoś…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Usuń…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Proszę sprawdzić, czy dostawca jest zaufany, jako że program nie jest "
+"izolowany"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Brak uprawnień"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Dostęp do sieci"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Brak dostępu do sieci"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Używa usług systemowych"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Używa usług sesji"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Dostęp do urządzeń"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Brak dostępu do urządzeń"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Dostęp do katalogu domowego do odczytu i zapisu"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Dostęp do pełnego systemu plików do odczytu"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Dostęp do katalogu domowego do odczytu"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Dostęp do katalogu pobierania do odczytu i zapisu"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Dostęp do katalogu pobierania do odczytu"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Może odczytywać dowolne dane w katalogu pobierania"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Brak dostępu do systemu plików"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "W ogóle nie ma dostępu do systemu plików"
+
+#. 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 "Kod własnościowy"
+
+#: 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 ""
+"Kod źródłowy nie jest publiczny, więc nie może być niezależnie badany i może "
+"być niebezpieczny"
+
+#. 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 "Kod do wglądu"
+
+#: 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 ""
+"Kod źródłowy jest publiczny i może być niezależnie badany, więc "
+"bezpieczeństwo programu jest pewniejsze"
+
+#. 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 "Zweryfikowany autor programu"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Niezabezpieczone zależności"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 "Program %s jest bezpieczny"
+
+#. 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 "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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "Program %s jest niebezpieczny"
+
+#. 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 "Bezpieczeństwo"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Źródło"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "Środowisko programistyczne"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Przestarzała wersja środowiska programistycznego"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+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:362 src/gs-screenshot-image.c:419
+#: src/gs-screenshot-image.c:622
+msgid "Screenshot not found"
+msgstr "Nie odnaleziono zrzutu ekranu"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Nieprawidłowy zrzut ekranu"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Strona wyszukiwania"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Wyszukiwanie programów"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Nie można pobrać aktualizacji"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Nie można pobrać aktualizacji: wymagany jest dostęp do Internetu, ale nie "
+"jest on dostępny"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nie można pobrać aktualizacji: za mało miejsca na dysku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Nie można pobrać aktualizacji: wymagane jest uwierzytelnienie"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nie można pobrać aktualizacji: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+msgid ""
+"Unable to download updates: you do not have permission to install software"
+msgstr ""
+"Nie można pobrać aktualizacji: brak uprawnień do instalacji oprogramowania"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1329
+msgid "Unable to get list of updates"
+msgstr "Nie można pobrać listy aktualizacji"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr ""
+"Nie można zainstalować programu %s, ponieważ pobieranie z „%s” się nie "
+"powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr ""
+"Nie można zainstalować programu %s, ponieważ pobieranie się nie powiodło"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"Nie można zainstalować programu %s, ponieważ środowisko wykonawcze „%s” jest "
+"niedostępne"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Nie można zainstalować programu %s, ponieważ nie jest on obsługiwany"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Nie można zainstalować: wymagany jest dostęp do Internetu, ale nie jest on "
+"dostępny"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nie można zainstalować: program ma nieprawidłowy format"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Nie można zainstalować programu %s: za mało miejsca na dysku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Nie można zainstalować programu %s: wymagane jest uwierzytelnienie"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr ""
+"Nie można zainstalować programu %s: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install software"
+msgstr ""
+"Nie można zainstalować programu %s: brak uprawnień do instalacji "
+"oprogramowania"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Nie można zainstalować programu %s: wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr ""
+"Nie można zainstalować programu %s: poziom naładowania akumulatora jest za "
+"niski"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Nie można zainstalować programu %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr ""
+"Nie można zaktualizować programu %s z „%s”, ponieważ pobieranie się nie "
+"powiodło"
+
+#. 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 update %s as download failed"
+msgstr ""
+"Nie można zaktualizować programu %s, ponieważ pobieranie 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Nie można zainstalować aktualizacji z „%s”, ponieważ pobieranie się nie "
+"powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr ""
+"Nie można zainstalować aktualizacji, ponieważ pobieranie się nie powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Nie można zaktualizować: wymagany jest dostęp do Internetu, ale nie jest on "
+"dostępny"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Nie można zainstalować aktualizacji: za mało miejsca na dysku"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Nie można zaktualizować programu %s: wymagane jest uwierzytelnienie"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nie można zainstalować aktualizacji: wymagane jest uwierzytelnienie"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr ""
+"Nie można zaktualizować programu %s: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Nie można zainstalować aktualizacji: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr ""
+"Nie można zaktualizować programu %s: brak uprawnień do aktualizacji "
+"oprogramowania"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, c-format
+msgid ""
+"Unable to install updates: you do not have permission to update software"
+msgstr ""
+"Nie można zainstalować aktualizacji: brak uprawnień do aktualizacji "
+"oprogramowania"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Nie można zaktualizować programu %s: wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Nie można zainstalować aktualizacji: wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr ""
+"Nie można zaktualizować programu %s: poziom naładowania akumulatora jest za "
+"niski"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr ""
+"Nie można zainstalować aktualizacji: poziom naładowania akumulatora jest za "
+"niski"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nie można zainstalować aktualizacji"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr ""
+"Nie można zaktualizować do systemu %s, ponieważ pobieranie się nie powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+msgstr ""
+"Nie można zaktualizować do systemu %s: wymagany jest dostęp do Internetu, "
+"ale nie jest on dostępny"
+
+#. 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: 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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nie można zaktualizować do systemu %s: 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr ""
+"Nie można zaktualizować do systemu %s: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1698
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr "Nie można zaktualizować do systemu %s: brak uprawnień do aktualizacji"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr ""
+"Nie można zaktualizować do systemu %s: wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr ""
+"Nie można zaktualizować do systemu %s: poziom naładowania akumulatora jest "
+"za niski"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Nie można zaktualizować do systemu %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Nie można usunąć programu %s: wymagane jest uwierzytelnienie"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Nie można usunąć programu %s: uwierzytelnienie jest nieprawidłowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, c-format
+msgid "Unable to remove %s: you do not have permission to remove software"
+msgstr ""
+"Nie można usunąć programu %s: brak uprawnień do usuwania oprogramowania"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Nie można usunąć programu %s: wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr ""
+"Nie można usunąć programu %s: poziom naładowania akumulatora jest za niski"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Nie można usunąć programu %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:1831
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr "Nie można uruchomić programu %s: „%s” nie jest zainstalowane"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Za mało miejsca na dysku — proszę zwolnić trochę miejsca i spróbować ponownie"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Coś się nie powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Instalacja pliku się nie powiodła: nieobsługiwane"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Instalacja pliku się nie powiodła: uwierzytelnienie się nie powiodło"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Instalacja się nie powiodła: nieobsługiwane"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Instalacja się nie powiodła: uwierzytelnienie się nie powiodło"
+
+#. 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 "Nie można skontaktować się z „%s”"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted 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:1975
+msgid "AC power is required"
+msgstr "Wymagane jest zasilanie sieciowe"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "Poziom naładowania akumulatora jest za niski"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Repozytoria oprogramowania"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferencje _aktualizacji"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Sprawdź dysk"
+
+#. 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 "Ustawienia sieci"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Uruchom ponownie"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Więcej informacji"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Wyszukaj"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu główne"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "_Więcej informacji"
+
+#. 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 "Aktualizacje"
+
+#. 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 "Application Data"
+msgstr "Dane programu"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Miejsce na dysku"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Dane w pamięci podręcznej można usunąć w <a href=\"dummy\">_ustawieniach "
+"programu</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (zainstalowane)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (instalowanie)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (usuwanie)"
+
+#. 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 "Zainstalowane aktualizacje"
+
+#. 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 "Zainstalowano w dniu %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Nie zainstalowano żadnych aktualizacji"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Aktualizacje oprogramowania są nieaktualne"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Proszę wyszukać aktualizacje oprogramowania."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Krytyczna aktualizacja oprogramowania jest gotowa do instalacji"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Ważna aktualizacja oprogramowania jest gotowa do zainstalowania."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Krytyczne aktualizacje oprogramowania są dostępne do pobrania"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Ważne: krytyczne aktualizacje oprogramowania oczekują na instalację."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Aktualizacje oprogramowania są gotowe do instalacji"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Aktualizacje oprogramowania oczekują na instalację."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Aktualizacje oprogramowania są dostępne do pobrania"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Proszę pobrać oczekujące aktualizacje oprogramowania."
+
+#. 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] "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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "Zaktualizowano %u program"
+msgstr[1] "Zaktualizowano %u programy"
+msgstr[2] "Zaktualizowano %u programów"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "Program %s został zaktualizowany."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Proszę uruchomić go ponownie."
+
+#. 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 "Programy %s i %s zostały zaktualizowane."
+
+#. 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 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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:401
+#, 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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Dostępne są aktualizacje systemu operacyjnego"
+
+#. 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 ""
+"Należy zaktualizować, aby nadal otrzymywać aktualizacje bezpieczeństwa."
+
+#. 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 "Nowa wersja systemu %s jest gotowa do zainstalowania"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Dostępna jest aktualizacja oprogramowania"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Aktualizacje oprogramowania się nie powiodły"
+
+#. 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 ""
+"Zainstalowanie ważnej aktualizacji systemu operacyjnego się nie powiodło."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Wyświetl informacje"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Przejrzyj"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Ostatnio wyszukano: %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 "System %s %s nie jest już wspierany."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Używany system operacyjny nie jest już wspierany."
+
+#. 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 "Oznacza to, że nie będzie otrzymywał aktualizacji bezpieczeństwa."
+
+#. 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 "Zalecane jest zaktualizowanie do nowszej wersji."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Możliwe opłaty"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Wyszukaj _mimo to"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Brak sieci"
+
+#. 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 "Wymagany jest dostęp do Internetu, aby wyszukać aktualizacje."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Wyszukaj aktualizacje"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Aktualizacje"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Strona aktualizacji"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Wczytywanie aktualizacji…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Oprogramowanie jest aktualne"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Użyć połączenia komórkowego?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Wyszukaj mimo to"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Brak połączenia"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Należy przejść do trybu online, aby wyszukać aktualizacje."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Ustawienia _sieci"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Błąd"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Aktualizacje są automatycznie zarządzane."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Uruchom ponownie i zaktualizuj"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Zaktualizuj wszystko"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Aktualizacje programów"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Oprogramowanie sprzętowe urządzenia"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "System %s jest dostępny"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Więcej informacji o nowej wersji"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Pobieranie…"
+
+#. 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 "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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Pobrano %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Uruchom ponownie i zaktualizuj"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Przed aktualizacją należy utworzyć kopię zapasową danych i plików."
+
+#: 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 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 ""
+"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: 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 "Aktualizacje systemu"
+
+#. 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 ""
+"Ogólne aktualizacje systemu, takie jak poprawki zabezpieczeń i błędów oraz "
+"ulepszenia wydajności."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Pobieranie obrazów polecanych programów…"
+
+#. 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 "Aktualizacja systemu %s, dodająca nowe funkcje i naprawiająca błędy."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "Przeglądarka WWW dla GNOME"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Pobieranie informacji o aktualizacji…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Katalog systemu %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Podkatalog domowy %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Katalogi systemu"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Konfiguracja systemu z /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Katalog pulpitu"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Podkatalog pulpitu %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Katalog dokumentów"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Podkatalog dokumentów %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Katalog muzyki"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Podkatalog muzyki %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Katalog obrazów"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Podkatalog obrazów %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Katalog publicznie udostępnianych"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Podkatalog publicznie udostępnianych %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Katalog wideo"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Podkatalog wideo %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Katalog szablonów"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Podkatalog szablonów %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Katalog pamięci podręcznej użytkownika"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Podkatalog pamięci podręcznej użytkownika %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Katalog konfiguracji użytkownika"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Podkatalog konfiguracji użytkownika %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Katalog danych użytkownika"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Podkatalog danych użytkownika %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Katalog wykonawczy użytkownika"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Podkatalog wykonawczy użytkownika %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Pobieranie metadanych Flatpak dla %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Repozytorium „%s” nie pozwala zainstalować „%s”, prawdopodobnie z powodu "
+"jego filtru. Proszę usunąć filtr i powtórzyć instalację. Informacje "
+"o błędzie: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Aktualizacja konfiguracji urządzenia %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Aktualizacja aparatu %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Aktualizacja TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Aktualizacja odbiornika USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Oprogramowanie sprzętowe"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Zainstalować niepodpisane oprogramowanie?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Pobrać niepodpisane oprogramowanie?"
+
+#: 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 ""
+"Dostępne są niepodpisane aktualizacje. Bez podpisu nie można sprawdzić "
+"pochodzenia aktualizacji ani czy jest ona nienaruszona."
+
+#: plugins/packagekit/gs-packagekit-task.c:158
+msgid "Update Unsigned Software?"
+msgstr "Zaktualizować niepodpisane oprogramowanie?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pakiety"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#: 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"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..e92b406
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,6562 @@
+# Portuguese translation for gnome-software.
+# Copyright © 2014 gnome-software
+# This file is distributed under the same license as the gnome-software package.
+# Tiago Santos <tiagofsantos81@sapo.pt>, 2014, 2015, 2016.
+# Pedro Albuquerque <palbuquerque73@gmail.com>, 2015.
+# Sérgio Cardeira <scardeira.sergio@gmail.com>, 2016.
+# João Nuno Matos <joaonmatos@gmail.com>, 2020.
+# Juliano de Souza Camargo <julianosc@pm.me>, 2020.
+# Hugo Carvalho <hugokarvalho@hotmail.com, 2020, 2021, 2022.
+# André Cerqueira <acerqueira021@gmail.com>, 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: 2022-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-08-28 14:04+0100\n"
+"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
+"Language-Team: Portuguese <https://l10n.gnome.org/teams/pt/>\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.1.1\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:21
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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 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 das 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 das atualizações"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:49
+msgid "The update details"
+msgstr "Detalhes sobre as atualizações"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "O Projeto GNOME"
+
+#: data/org.gnome.software.external-appstream.policy.in.in:11
+msgid "Install an appstream file into a system location"
+msgstr "Instalar um ficheiro <i>appstream</i> 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 <i>appstream</i> 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 recarrega 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "O valor mínimo de karma para as análises"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Permitir acesso ao diálogo Fontes de Software"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Oferecer atualizações para pré-lançamentos"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Instalador global AppStream do GNOME Software"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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 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 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: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 "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 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 é 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:1027
+#, 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:1031
+#, 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 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 é 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Classificação Etária"
+
+#: 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 "Como contribuir com informação em falta"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pacote"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pendente"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalação pendente"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Remoção pendente"
+
+#: 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 "Instalado"
+
+#. 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 "A instalar"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "A remover"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstalar"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Rede"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Pode comunicar através da rede"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Serviços do Sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Serviços da Sessão"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Pode aceder diretamente aos dispositivos do sistema"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Pasta pessoal"
+
+#: 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 "Pode ver, editar, e criar ficheiros"
+
+#: 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 "Pode ver ficheiros"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Pasta das transferências"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Definições"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Pode ver e modificar quaisquer definições"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema de visualização antigo"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa um sistema de visualização antigo e inseguro"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Evasão da sandbox"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Pode sair da sandbox e evitar quaisquer outras restrições à execução"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detalhes da atualização"
+
+#. 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 "Nenhuma descrição de atualização foi fornecida."
+
+#: 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 "Recuar"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Requer permissões adicionais"
+
+#. 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 "Análises"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Não foram encontradas análises sobre esta aplicação."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Sem análises"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Histórico da versão"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novidade na versão %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versão %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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 "PROCURA"
+
+#: src/gs-application.c:128
+msgid "Show application details (using application ID)"
+msgstr "Mostrar detalhes da aplicação (utilizando 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 (utilizando 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 "Instalar aplicação (utilizando 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 "NOMEFICHEIRO"
+
+#: 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Mostra um ficheiro metainfo ou appdata local"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Mostra informação de depuração detalhada"
+
+#: 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 update preferences"
+msgstr "Mostrar definições de atualização"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Direitos de autor © 2016-2022 Colaboradores do GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Hugo Carvalho <hugokarvalho@hotmail.com>\n"
+"Tiago Santos <tiagofsantos81@sapo.pt>\n"
+"Pedro Albuquerque <palbuquerque73@gmail.com>\n"
+"João Nuno Matos <joaonmatos@gmail.com>\n"
+"Juliano de Souza Camargo <julianosc@pm.me>"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Acerca do Software"
+
+#. 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 "Um modo agradável de gerir as aplicações no sistema."
+
+#. 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 "Ups! Não foram encontrados detalhes sobre a aplicação."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Pode aceder aos dispositivos do equipamento"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Pode aceder a ficheiros arbitrários"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Pode adquirir permissões arbitrárias"
+
+#. 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 "Revisto pela sua distribuição"
+
+#. 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 "Fornecido por terceiros"
+
+#. 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 "Código proprietário"
+
+#. 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 "Código auditável"
+
+#. 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 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 "Software já não suportado"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Inseguro"
+
+#: 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 "Apenas no telemóvel"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Apenas funciona num ecrã pequeno"
+
+#: 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 "Apenas no computador"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Apenas funciona num ecrã grande"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Incompatibilidade de tamanho do ecrã"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Não suporta o tamanho atual do ecrã"
+
+#: 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 "Requer um ecrã sensível ao toque"
+
+#: 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 "Requer um teclado"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requer um rato"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "É necessário um controlador"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptável"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funciona em telefones, tablets e computadores"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Provavelmente requer um teclado ou rato"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Não contém conteúdo impróprio para a idade"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visitar a página 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:159
+msgid "Install…"
+msgstr "Instalar…"
+
+#. 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 "Cancelar"
+
+#. 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 "Instalar"
+
+#. 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 "Atualizar"
+
+#. 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 "Desinstalar"
+
+#. 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 "A desinstalar"
+
+#. 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 "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:337 src/gs-shell-search-provider.c:264
+#, 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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renomeado de %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ajudar a traduzir %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 é 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:5
+msgid "Translations"
+msgstr "Traduções"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Website de tradução"
+
+#. 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 "Autenticação remota necessária %s (domínio %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Autenticação necessária"
+
+#: 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 "_Cancelar"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Início de sessão"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Utilizador"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Palavra-passe"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Novo e Atualizado"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Outro software"
+
+#. 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 "Introduza um número de 1 a %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Escolha uma aplicação:"
+
+#: 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 "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 "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 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 está agora instalada"
+
+#. 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 ""
+"É necessário reiniciar o dispositivo para que as mudanças tenham efeito."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "As atualizações do sistema estão agora instaladas"
+
+#. 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 "Há atualizações recentes que podem ser revistas"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Iniciar"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalar aplicações de terceiros?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Ativar fontes de software de terceiros?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s não é um <a href=\"https://pt.wikipedia.org/wiki/"
+"Software_livre_e_de_código_aberto\">programa livre e de código aberto</a>, e "
+"é fornecido por “%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 é fornecido por “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Não avisar novamente"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Seguem os erros detalhados do gestor de pacotes:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalhes"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Aceitar"
+
+#. 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] "Foi instalada uma atualização"
+msgstr[1] "Foram instaladas aplicações"
+
+#. 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] "Uma aplicação foi removida"
+msgstr[1] "As aplicações foram removidas"
+
+#. 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] ""
+"É necessário reiniciar o dispositivo para que a mudança tenha efeito."
+msgstr[1] ""
+"É necessário reiniciar o dispositivo para que as mudanças tenham efeito."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Agora não"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Agora mesmo"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Localizar em Software"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Mostrar mai_s"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Mostrar menos"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "A remover…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "É necessário reiniciar para terminar a instalação"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Atualização pendente…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "A preparar…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "A desinstalar…"
+
+#. 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalar"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "_Reiniciar"
+
+#. 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:897
+msgid "_Install…"
+msgstr "_Instalar…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Outras aplicações por %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+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:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Impossível encontrar «%s»"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Página de detalhes"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "A carregar os detalhes das aplicações…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Ajude a _traduzir"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Abrir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Atualizar"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "A transferir"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Complementos"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Os complementos selecionados serão instalados com a aplicação."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Esta aplicação só pode ser usada se tiver uma ligação à Internet ativa."
+
+#: src/gs-details-page.ui:587
+msgid "Software Repository Included"
+msgstr "Fonte de software incluída"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"Esta aplicação inclui uma fonte de software que fornece atualizações, assim "
+"como acesso a outras aplicações."
+
+#: src/gs-details-page.ui:605
+msgid "No Software Repository Included"
+msgstr "Sem fontes de software incluídas"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Esta aplicação não inclui uma fonte de software. Não será atualizada com "
+"novas versões."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Fonte de software identificada"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Utilize apenas fontes de software em que confie."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Sem Metadados"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Página do _Website"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Doar"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Contribuir com _tradução"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Reportar um problema"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "Ajuda"
+
+#. 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 "_Escrever análise"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Todas as análises"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Tipos de letras disponíveis para a escrita %s"
+msgstr[1] "Tipos de letra disponíveis para as escritas %s"
+
+#. 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] "Software disponível para o %s"
+msgstr[1] "Software disponível para os %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Software solicitado não encontrado"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s não encontrado"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "na página 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:354
+#, c-format
+msgid "No applications are available that provide the file %s."
+msgstr "Não há 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: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 ""
+"Informações sobre %s, bem como as opções de como obter aplicações em falta "
+"podem ser encontradas %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 "Não há aplicações disponíveis para suporte a %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:376
+#, 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: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 ""
+"Informações sobre %s, bem como as opções de como obter uma aplicação que "
+"suporte este formato podem ser encontradas %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Falha ao localizar resultados da procura: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Formato de ficheiro %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Impossível encontrar o software solicitado"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Página de codecs"
+
+#: src/gs-featured-carousel.ui:43
+msgid "Previous"
+msgstr "Anterior"
+
+#: src/gs-featured-carousel.ui:66
+msgid "Next"
+msgstr "Próximo"
+
+#: src/gs-featured-carousel.ui:83
+msgid "Featured Apps List"
+msgstr "Lista de aplicações em destaque"
+
+#: src/gs-hardware-support-context-dialog.c:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Suporte a desktop"
+
+#: 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 "Suporta ser utilizado num ecrã grande"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Suporte desconhecido a desktop"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requer um ecrã grande"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Desktop não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Não pode ser usado num ecrã grande"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Suporte a dispositivo móvel"
+
+#: 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 "Suporta ser utilizado num ecrã pequeno"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Suporte desconhecido a dispositivo móvel"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requer um ecrã pequeno"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Dispositivo móvel não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Não pode ser utilizado num ecrã pequeno"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Suporte a teclado"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Suporte desconhecido a teclado"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Teclado necessário"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Tem suporte a teclados"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Teclado não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Não pode ser usado com um teclado"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Suporte ao rato"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requer um rato ou dispositivo apontador"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Suporte desconhecido ao rato"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Rato necessário"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Tem suporte a ratos e dispositivos apontadores"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Rato não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Suporte a ecrã tátil"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Suporte desconhecido a ecrã tátil"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Ecrã tátil necessário"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Tem suporte a ecrãs táteis"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Ecrã tátil não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:686
+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:699
+msgid "Gamepad Required"
+msgstr "Controlador de jogo necessário"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Requer um controlador de jogo"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Suporte a controlador de jogo"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Suporte a hardware"
+
+#. 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 "Instalado"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Página de instaladas"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicações"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicações Web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicações de sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Compilado pela comunidade"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Este software é desenvolvido abertamente por uma comunidade de voluntários e "
+"disponibilizado sob a licença <a href=\"%s\">%s licença</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: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 ""
+"Este software é desenvolvido abertamente por uma comunidade de voluntários e "
+"disponibilizada sob a licença %s.\n"
+"\n"
+"Pode contribuir e ajudar a torná-lo ainda melhor."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietário"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Saiba mais"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "A transferir o catálogo de software"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "A abrir página"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "A iniciar…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Atualizações automáticas interrompidas"
+
+#: 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 ""
+"A ligação atual é limitada. Ligações limitadas têm limites de dados ou "
+"custos associados com estes. Para poupar dados, as atualizações automáticas "
+"estão desligadas.\n"
+"\n"
+"As atualizações automáticas serão retomadas quando uma ligação sem limites "
+"fique disponível. Até lá, ainda pode instalar atualizações manualmente.\n"
+"\n"
+"Alternativamente, se a ligação atual foi identificada como limitada "
+"incorretamente, pode mudar essa classificação manualmente."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Abrir as _Definições de Rede"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Moderar página"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Não existem análises para moderar"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Utilizador"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Pacotes novos"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Pacotes a remover"
+
+#. 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 "Atualizações"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Pacotes a reverter"
+
+#. 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 "fontes externas selecionadas"
+
+#. 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 ""
+"Fornece acesso a software adicional a partir de %s. Está incluído algum "
+"software proprietário."
+
+#. 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 "Ativar"
+
+#. 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 "Explorar"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Página de visão geral"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Ativar fontes de software de terceiros?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Outras categorias"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nenhuns dados de aplicação encontrados"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Desconhecida"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "O utilizador recusou a instalação"
+
+#. 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 "Preparar %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 "Tem certeza que quer remover %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Tem certeza que deseja desinstalar %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 será desinstalada, e terá de a instalar para a utilizar novamente."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Definições de Atualização"
+
+#: 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 ""
+"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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Atualizações automáticas"
+
+#: src/gs-prefs-dialog.ui:20
+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."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificações de atualizações automáticas"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr ""
+"Mostrar notificações quando atualizações forem instaladas automaticamente."
+
+#. 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 ""
+"Parte do software atualmente instalado não é compatível com %s. Se "
+"continuar, os programas seguintes serão automaticamente removidos durante a "
+"atualização:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Software incompatível"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continuar"
+
+#. 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 ""
+"O software que foi instalado a partir do \"%s\" deixará de receber "
+"atualizações."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Desativar o repositório?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Remover"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Ativar novos repositórios"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Repositórios adicionais de terceiros selecionados - %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Estas fontes de software suplementam as fontes predefinidas do %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Fontes de Software"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Sem repositórios"
+
+#. 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 aplicação instalada"
+msgstr[1] "%u aplicações instaladas"
+
+#. 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 complemento instalado"
+msgstr[1] "%u complementos instalados"
+
+#. 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 aplicação"
+msgstr[1] "%u aplicações"
+
+#. 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 complemento"
+msgstr[1] "%u complementos"
+
+#. 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 e %s instaladas"
+msgstr[1] "%s e %s instaladas"
+
+#. 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 "Odeio"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Não gosto"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Tudo bem"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Gosto"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Muito boa"
+
+#. 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 "Demore mais tempo para escrever a sua análise"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Escolha uma avaliação em estrelas"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "O resumo é demasiado curto"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "O resumo é demasiado longo"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "A descrição é demasiado curta"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publicar análise"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Publicar"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Pontuação"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resumo"
+
+#: src/gs-review-dialog.ui:97
+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\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Análise"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Saiba que dados são enviados na nossa <a href=\"https://odrs.gnome.org/"
+"privacy\">política de privacidade</a>. 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:93
+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:220
+msgid "You can report reviews for abusive, rude, or discriminatory behavior."
+msgstr ""
+"Pode denunciar 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:225
+msgid ""
+"Once reported, a review will be hidden until it has been checked by an "
+"administrator."
+msgstr ""
+"Assim que denuncie, a análise será escondida até que seja verificada por um "
+"administrador."
+
+#. TRANSLATORS: window title when
+#. * reporting a user-submitted review
+#. * for moderation
+#: src/gs-review-row.c:239
+msgid "Report Review?"
+msgstr "Denunciar Análise?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Denunciar"
+
+#. 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 "Esta análise foi-lhe útil?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sim"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Não"
+
+#. 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 "Reporte…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Remover…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Verifique se confia no fornecedor, uma vez que a aplicação não passa por uma "
+"sandbox"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Sem permissões"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Acesso à rede"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Sem acesso à rede"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa serviços do sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa serviços da sessão"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Acesso ao dispositivo"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Sem acesso ao dispositivo"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Acesso de leitura/gravar a todo o sistema de ficheiros"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Acesso de leitura/gravar na pasta pessoal"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Acesso de leitura a todo o sistema de ficheiros"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Acesso de leitura da pasta pessoal"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Acesso de leitura/gravar à pasta de Transferências"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Acesso de leitura à pasta de Transferências"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Sem acesso ao sistema de ficheiros"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Não é possível aceder ao 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:341
+msgid "Proprietary Code"
+msgstr "Código proprietário"
+
+#: 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 ""
+"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: 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 "Código auditável"
+
+#: 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 ""
+"O código fonte é público e pode ser auditado independentemente, o que torna "
+"a aplicação mais segura"
+
+#. 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 "O programador da aplicação está verificado"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependências inseguras"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 é segura"
+
+#. 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 é potencialmente inseguro"
+
+#. 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 é inseguro"
+
+#. 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 "Segurança"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Fonte"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versão SDK desatualizada"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+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:362 src/gs-screenshot-image.c:419
+#: src/gs-screenshot-image.c:622
+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:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Captura de ecrã inválida"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Página de procura"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Procurar por Aplicações"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Não foi possível descarregar 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Não foi possível descarregar atualizações de %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Não foi possível descarregar atualizações"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, c-format
+msgid "Unable to download updates from %s: not enough disk space"
+msgstr "Não foi possível descarregar atualizações de %s: sem espaço suficiente"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Não foi possível descarregar atualizações: sem espaço suficiente"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Não foi possível descarregar atualizações: autenticação necessária"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Não foi possível descarregar atualizações: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+msgid ""
+"Unable to download updates: you do not have permission to install software"
+msgstr ""
+"Não foi possível descarregar atualizações: não tem permissões para instalar "
+"software"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1329
+msgid "Unable to get list of updates"
+msgstr "Não foi possível obter a lista de atualizações"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Não foi possível instalar %s porque a transferência de %s falhou"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Não foi possível instalar %s porque a transferência falhou"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"Não foi possível instalar %s porque o tempo de execução %s não está "
+"disponível"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Não foi possível instalar %s porque a aplicação não é suportada"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Não foi possível instalar: acesso à Internet é necessário mas não está "
+"disponível"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Não foi possível instalar: a aplicação tem um formato inválido"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Não foi possível instalar %s: sem espaço em disco"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Não foi possível instalar %s: autenticação é necessária"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Não foi possível instalar %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Não foi possível instalar %s: necessària a ligação à corrente elétrica"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Não foi possível instalar %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr ""
+"Não foi possível atualizar %s a partir da fonte %s porque a transferência "
+"falhou"
+
+#. 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 update %s as download failed"
+msgstr "Não foi possível atualizar %s porque a transferência 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Não foi possível instalar atualizações a partir da fonte %s porque a "
+"transferência falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Não foi possível instalar atualizações porque a transferência falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Não foi possível atualizar: acesso à Internet é necessário mas não está "
+"disponível"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Não foi possível atualizar %s: autenticação obrigatória"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Não foi possível instalar atualizações: autenticação obrigatória"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Não foi possível atualizar %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Não foi possível instalar atualizações: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Não foi possível atualizar %s: necessária ligação à corrente elétrica"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Não foi possível instalar atualizações"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Não foi possível atualizar para o %s porque a transferência falhou"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: not enough disk space"
+msgstr ""
+"Não foi possível atualizar para o %s: 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:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Não foi possível atualizar para o %s: autenticação obrigatória"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Não foi possível atualizar para o %s: 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:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr ""
+"Não foi possível atualizar para o %s: necessária ligação à corrente elétrica"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, 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,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Não foi possível remover %s: autenticação obrigatória"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Não foi possível remover %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Não foi possível remover %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Não há espaço suficiente em disco. Liberte algum espaço e tente novamente"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Desculpe, alguma coisa correu mal"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Falha ao instalar o ficheiro: não é suportado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Falha ao instalar o ficheiro: a autenticação falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Falha ao instalar: não suportado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Falha ao instalar: a autenticação falhou"
+
+#. 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 "Não foi possível ligar-se a %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "O Software necessita de ser reiniciado para usar os novos plugins."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Necessária ligação à corrente elétrica"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "A bateria não tem carga suficiente"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Fontes de software"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Definições de atualização"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examinar Disco"
+
+#. 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 "Definições de rede"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reiniciar"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Mais informação"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Pesquisa"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Saber _mais"
+
+#. 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 "Atualizações"
+
+#. 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 "Application Data"
+msgstr "Dados de aplicações"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Armazenamento"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Os dados em cache podem ser removidos das <a href=\"dummy\">definições da "
+"_aplicação</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalada)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (A instalar)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (A remover)"
+
+#. 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 "Atualizações instaladas"
+
+#. 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 "Instalada em %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Sem atualizações instaladas"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "As atualizações de software estão desatualizadas"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Procurar atualizações."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Atualização crítica pronta para instalar"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Uma atualização importante está pronta para ser instalada."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Atualizações críticas disponíveis para transferir"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Importante: atualizações críticas estão em espera."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Atualizações prontas para instalar"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Atualizações estão em espera e prontas para serem instaladas."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Atualizações disponíveis para transferir"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Transferir atualizações em espera."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u aplicação atualizada"
+msgstr[1] "%u aplicações atualizadas"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s foi atualizada."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Reinicie a aplicação."
+
+#. 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 e %s foram atualizadas."
+
+#. 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] "É necessário reiniciar %u aplicação."
+msgstr[1] "É necessário reiniciar %u aplicações."
+
+#. 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 "Inclui %s, %s e %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 "Atualizações do sistema operativo disponíveis"
+
+#. 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 "Atualize para continuar a receber atualizações de segurança."
+
+#. 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 "Está disponível uma nova versão de %s para instalar"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Atualização de software disponível"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Falha na atualização de software"
+
+#. 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 "Falha ao instalar uma atualização importante do sistema operativo."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostrar detalhes"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Análise"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"Lamentamos: a atualização falhou a instalaçã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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Última verificação: %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 "O %s %s não é mais suportado."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "O sistema operativo não é mais suportado."
+
+#. 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 "Isto significa que não recebe atualizações de segurança."
+
+#. 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 "É recomendável que atualize para uma versão mais recente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Podem ser aplicados custos adicionais"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Ainda assim procurar"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Sem rede"
+
+#. 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 "É necessário acesso à Internet para procurar atualizações."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Procurar atualizações"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Atualizações"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Página das atualizações"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "A carregar atualizações…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+msgid "This could take a while."
+msgstr "Isto pode levar algum tempo."
+
+#. 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 "Atualizado"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Usar dados móveis?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "Ainda assim pro_curar"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Sem ligação"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Procurar atualizações online."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Defi_nições de rede"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Erro"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "As atualizações são geridas automaticamente."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reiniciar e Atualizar"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Atualizar tudo"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application 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:465
+msgid "Device Firmware"
+msgstr "Firmware do Dispositivo"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s Disponível"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Saiba mais sobre a nova versão"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "A transferir…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% transferido"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reiniciar e Atualizar"
+
+#: src/gs-upgrade-banner.ui:201
+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/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 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 ""
+"Atualizações;Fontes;Origens;Repositórios;Preferências;Instalar;Desinstalar;"
+"Programa;Software;App;Loja;"
+
+#. 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 "Atualizações do sistema"
+
+#. 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 ""
+"Atualizações gerais do sistema, tais como correcções de segurança ou de "
+"erros inesperados e melhorias de desempenho."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "A transferir imagens destacadas…"
+
+#. 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 "Atualização do %s com novas funcionalidades e correções."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "A transferir informação sobre a atualização…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications on Linux"
+msgstr ""
+"Flatpak é uma framework(plataforma) para aplicações \"desktop\" no Linux"
+
+#. 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 "Pasta do sistema %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subpasta pessoal %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Pastas do sistema host"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuração do sistema host de /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Pasta da área de trabalho"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subpasta da área de trabalho %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Pasta de documentos"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subpasta de documentos %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Pasta de música"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subpasta de música %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Pasta de imagens"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subpasta de imagens %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Pasta de partilha pública"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subpasta de partilha pública %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Pasta de vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subpasta de vídeos %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Pasta de modelos"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Modelos de subpasta %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Pasta de cache do utilizador"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subpasta de cache do utilizador %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Pasta de configuração do utilizador"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subpasta de configuração do utilizador %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Pasta de dados do utilizador"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subpasta de dados do utilizador %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Pasta de tempo de execução do utilizador"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subpasta de tempo de execução do utilizador %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "A obter metadados flatpak para %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Atualização do receptor USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "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:148
+msgid "Install Unsigned Software?"
+msgstr "Instalar software não assinado?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Transferir software não assinado?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Atualizar software não assinado?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pacotes"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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 para 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"
+
+#~ 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 "system"
+#~ msgstr "sistema"
+
+#~ 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 "Remove"
+#~ msgstr "Remover"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Sem fontes adicionais"
+
+#~ msgid "_Enable"
+#~ msgstr "_Ativar"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Reiniciar Agora"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s pronto para ser instalado"
+
+#~ 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 "Navigation sidebar"
+#~ msgstr "Barra lateral de navegação"
+
+#~ 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 "Reference"
+#~ msgstr "Referência"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Licença da aplicações desconhecida"
+
+#~ 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 "_Installed"
+#~ msgstr "_Instaladas"
+
+#~ msgid "_Updates"
+#~ msgstr "_Atualizações"
+
+#~ 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, %R"
+#~ msgstr "Ontem, %R"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Esqueci-me da palavra passe"
+
+#~ 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 "_Install All"
+#~ msgstr "_Instalar todas"
+
+#~ 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 "web app"
+#~ msgstr "aplicação web"
+
+#~ 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..8d2416d
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,5558 @@
+# Brazilian Portuguese translation for gnome-software.
+# Copyright (C) 2022 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+# Juan Diego Martins da Costa Cruz <juan.martins@ifrn.edu.br>, 2013.
+# Georges Basile Stavracas Neto <georges.stavracas@gmail.com>, 2013, 2014.
+# Felipe Braga <fbobraga@gmail.com>, 2015.
+# Artur de Aquino Morais <artur.morais93@outlook.com>, 2016.
+# Fábio Nogueira <fnogueira@gnome.org>, 2015, 2016.
+# Gustavo Marques <gutodisse@gmail.com>, 2016.
+# Ricardo Silva Veloso <ricvelozo@gmail.com>, 2018.
+# Bruno Lopes <brunolopesdsilv@gmail.com>, 2018, 2021.
+# Enrico Nicoletto <hiko@duck.com>, 2013-2016, 2018, 2021-2022.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2022.
+# Matheus Barbosa <mdpb.matheus@gmail.com>, 2022.
+# Leônidas Araújo <leorusvellt@hotmail.com>, 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: 2022-08-31 10:52+0000\n"
+"PO-Revision-Date: 2022-08-31 09:28-0300\n"
+"Last-Translator: Leônidas Araújo <leorusvellt@hotmail.com>\n"
+"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\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 40.0\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:21
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1980
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "O projeto GNOME"
+
+#: 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "A pontuação carma mínima para ser avaliada"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Oferecer atualizações para pré-lançamentos"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://pt.wikipedia.org/wiki/Software_privativo'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"Ordem de prioridade dos formatos de empacotamento a serem preferidos, com os "
+"formatos mais importantes listados primeiro. Uma matriz vazia significa a "
+"ordem padrão. Os formatos omitidos são considerados listados por último. "
+"Exemplo de formatos de empacotamento são: deb, flatpak, rpm, snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Instalador geral de AppStream do GNOME Programas"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 é 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:1027
+#, 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:1031
+#, 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 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 é 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Classificação por idade"
+
+#: 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 "Como contribuir com informações ausentes"
+
+#: lib/gs-app.c:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+msgid "Package"
+msgstr "Pacote"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Pendente"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Instalação pendente"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Remoção pendente"
+
+#: 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 "Instalado"
+
+#. 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 "Instalando"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Removendo"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Desinstalar"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Rede"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Pode se comunicar pela rede"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Serviços de sistema"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Serviços de seção"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Pode acessar arquivos de dispositivo de sistema"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Pasta pessoal (home)"
+
+#: 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 "Pode ver, editar e criar arquivos"
+
+#: 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 "Pode ver arquivos"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Pasta de downloads"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Configurações"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Pode ver ou alterar quaisquer configurações"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Sistema de exibição legado"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Usa um sistema de exibição antigo e inseguro"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Escape sandbox"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Pode escapar da sandbox e contornar quaisquer outras restrições"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Detalhes da atualização"
+
+#. 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 "Não foi disponibilizada a descrição da atualização."
+
+#: 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 "Voltar"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Requer permissões adicionais"
+
+#. 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 "Avaliações"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Nenhuma avaliação foi encontrada para este aplicativo."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Sem avaliações"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Histórico de versões"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novo na versão %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Versão %s"
+
+#: src/gs-app-version-history-row.c:80
+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:94 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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Mostra um arquivo metainfo ou appdata local"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Mostra informações detalhadas de depuraçã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 update preferences"
+msgstr "Mostrar preferências de atualização"
+
+#: 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 "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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 Contribuidores do GNOME Programas"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Rafael Fontenelle <rafaelff@gnome.org>\n"
+"Enrico Nicoletto <hiko@duck.com>\n"
+"Georges Basile Stavracas Neto <georges.stavracas@gmail.com>\n"
+"Gustavo Marques <gutodisse@gmail.com>\n"
+"Ricardo Silva Veloso <ricvelozo@gmail.com>\n"
+"Bruno Lopes <brunolopesdsilv@gmail.com>\n"
+"Leônidas Araújo <lerousvellt@hotmail.com>\n"
+"Matheus Barbosa <mdpb.matheus@gmail.com>"
+
+#. 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:2147
+msgid "About Software"
+msgstr "Sobre o aplicativo Programas"
+
+#. 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 "Um modo agradável de gerenciar programas no seu sistema."
+
+#. 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 "Sinto muito! Não há detalhes para esse aplicativo."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Pode acessar dispositivo de hardware"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Pode acessar arquivos arbitrários"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Pode obter permissões arbitrárias"
+
+#. 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 "Avaliado por sua distribuição"
+
+#. 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 "Fornecido por um terceiro"
+
+#. 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 "Código privativo"
+
+#. 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 "Código auditável"
+
+#. 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 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 "O programa não possui mais suporte"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Inseguro"
+
+#: 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 "Móvel apenas"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Funciona apenas em uma tela pequena"
+
+#: 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 "Desktop apenas"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Funciona apenas em uma tela grande"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Tamanho de tela incompatível"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+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:593 src/gs-hardware-support-context-dialog.c:674
+#: src/gs-hardware-support-context-dialog.c:680
+msgid "Requires a touchscreen"
+msgstr "Requer um touchscreen"
+
+#: 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 "Requer um teclado"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Requer um mouse"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Precisa de gamepad"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptativo"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Funciona em telefones, tablets e desktops"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Provavelmente requer um teclado ou mouse"
+
+#: src/gs-app-context-bar.c:662
+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:705
+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:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Visitar o site"
+
+#. 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 "Instalar…"
+
+#. 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 "Cancelar"
+
+#. 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 "Instalar"
+
+#. 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 "Atualizar"
+
+#. 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 "Desinstalar"
+
+#. 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 "Desinstalando"
+
+#. 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 "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:337 src/gs-shell-search-provider.c:264
+#, 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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Renomeado de %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ajudar a traduzir %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 é 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:5
+msgid "Translations"
+msgstr "Traduções"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Site de _tradução"
+
+#. 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 "Autenticação necessária para remoto %s (reino %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Autenticação necessária"
+
+#: 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 "_Cancelar"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Autenticação"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Usuário"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Senha"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Novos & atualizados"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Outros programas"
+
+#. 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 "Por favor, insira um nível de 1 a %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Escolha um aplicativo:"
+
+#: 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 & 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 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 está agora instalado"
+
+#. 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 "Um reinício é necessário para que as alterações tenham efeito."
+
+#. 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 "Aplicativo pronto para ser usado."
+
+#. 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 "As atualizações do sistema estão agora instaladas"
+
+#. 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 ""
+"As atualizações recentemente instaladas estão disponíveis para avaliação"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Executar"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Instalar programa de terceiros?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Habilitar repositório de programas de terceiros?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s não é um <a href=\"https://pt.wikipedia.org/wiki/"
+"Software_livre_e_de_código_aberto\">programa de código aberto e livre</a>, e "
+"é fornecido por “%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 é fornecido por “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Não avisar novamente"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Seguem os erros detalhados do gerenciador de pacotes:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detalhes"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Aceitar"
+
+#. 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] "Uma atualização foi instalada"
+msgstr[1] "Atualizações foram instaladas"
+
+#. 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] "Um aplicativo foi removido"
+msgstr[1] "Aplicativos foram removidos"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Agora não"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Agora mesmo"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d hora atrás"
+msgstr[1] "%d horas atrás"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d ano atrás"
+msgstr[1] "%d anos 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:1246
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Localizar em Programas"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Mostrar mais"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Mostrar menos"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Removendo…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Requer reinício para finalizar a instalação"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Atualização pendente…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Preparando…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Desinstalando…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Instalar"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Reiniciar"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Instalar…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Outros aplicativos de %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+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:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Não foi possível localizar “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Página de detalhes"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Carregando detalhes do aplicativo…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Ajudar a _traduzir"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "A_brir"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Atualizar"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Baixando"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Complementos"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Os complementos selecionados serão instalados com o aplicativo."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Este aplicativo só pode ser usado quando há uma conexão ativa com a Internet."
+
+#: src/gs-details-page.ui:587
+msgid "Software Repository Included"
+msgstr "Repositório de programas incluído"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"Esse aplicativo inclui um repositório de programas que fornece atualizações, "
+"assim como acesso a outros programas."
+
+#: src/gs-details-page.ui:605
+msgid "No Software Repository Included"
+msgstr "Nenhum repositório de programas incluído"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Esse aplicativo não inclui um repositório de programas. Ele não será "
+"atualizado com novas versões."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Repositório de programas identificado"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Use apenas repositórios de programas que você confia."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Sem metadados"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "_Site do projeto"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Doar"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Contribuir com _tradução"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Relatar um problema"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "Aj_uda"
+
+#. 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 "_Escrever avaliação"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Todas as avaliações"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Fontes disponíveis para o script %s"
+msgstr[1] "Fontes disponíveis para os scripts %s"
+
+#. 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] "Programa disponível para %s"
+msgstr[1] "Programas disponíveis para %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "O programa requisitado não foi localizado"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s não foi encontrado"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "no site"
+
+#. 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 "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: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 ""
+"Informações sobre %s, bem como as opções de como obter aplicativos que "
+"estejam faltando podem ser encontradas %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 "Não há aplicativos disponíveis para suporte a %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:376
+#, 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: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 ""
+"Informações sobre %s, bem como as opções de como obter um aplicativo que "
+"pode oferecer suporte a este formato pode ser encontrado %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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Falha em localizar qualquer resultado de pesquisa: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Formato de arquivo %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Não foi possível localizar o programa requisitado"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Página de codecs"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Suporte a desktop"
+
+#: 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 "Tem suporte a ser usado em uma tela grande"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Suporte desconhecido a desktop"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Requer uma tela grande"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Desktop não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Suporte a dispositivo móvel"
+
+#: 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 "Tem suporte a ser usado em uma tela pequena"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Suporte desconhecido a dispositivo móvel"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Requer uma tela pequena"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Dispositivo móvel não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:610
+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:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Suporte a teclado"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Suporte desconhecido a teclado"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Teclado necessário"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Tem suporte a teclados"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Teclado não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Não pode ser usado com um teclado"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Suporte a mouse"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Requer um mouse ou dispositivo de apontamento"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Suporte desconhecido a mouse"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Mouse necessário"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Tem suporte a mouses e dispositivos de apontamento"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mouse não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Suporte a touchscreen"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Suporte desconhecido a touchscreen"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Touchscreen necessária"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Tem suporte a touchscreens"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Touchscreen não suportado"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Não pode ser usado com uma touchscreen"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Gamepad necessário"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Requer um gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Suporte a gamepad"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Suporte a hardware"
+
+#. 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 "Instalados"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Página de instalados"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Aplicativos"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Aplicativos web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Aplicativos de sistema"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Construído pela comunidade"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Este programa é desenvolvido abertamente por uma comunidade de voluntários e "
+"lançado sob a licença <a href=\"%s\">%s</a>.\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: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 ""
+"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."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Privativo"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "A_prenda mais"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Baixando o catálogo de programas"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Carregando página"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Iniciando…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Atualizações automáticas pausadas"
+
+#: 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 ""
+"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."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Abrir configuraçõe_s de rede"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Página moderada"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Não há avaliações para moderar"
+
+#: src/gs-origin-popover-row.c:104
+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: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 "Usuário"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Adições"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Remoções"
+
+#. 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 "Atualizações"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Downgrades"
+
+#. 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 "fontes externas selecionadas"
+
+#. 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 ""
+"Fornece acesso a programas adicionais a partir de %s. Alguns programas "
+"proprietários estão incluídos."
+
+#. 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 "Habilitar"
+
+#. 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 "Explorar"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Página de visão geral"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Habilitar repositórios de programas de terceiros?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Outras categorias"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Nenhum dado de aplicativo encontrado"
+
+#: lib/gs-plugin-loader.c:2824
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Desconhecida"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Instalação recusada pelo usuário"
+
+#. 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 "Preparar %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 "Você tem certeza de que deseja remover o repositório %s?"
+
+#. 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 ""
+"Todos os aplicativos de %s serão desinstalados e você precisará reinstalar o "
+"repositório para usá-los novamente."
+
+#. 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 "Você tem certeza de que deseja desinstalar %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 será desinstalado e você precisará instalar para usá-lo novamente."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferências de atualização"
+
+#: 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 ""
+"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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Atualizações automáticas"
+
+#: src/gs-prefs-dialog.ui:20
+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."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Notificações de atualização automática"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Mostrar notificações ao instalar atualizações automaticamente."
+
+#. 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 ""
+"Alguns dos programas atualmente instalados não são compatíveis com %s. Se "
+"você continuar, o seguinte será automaticamente removido durante a "
+"atualização:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Programa incompatível"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Continuar"
+
+#. 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 ""
+"Programas que foram instalados a partir de “%s” vão deixar de receber "
+"atualizações."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Desabilitar repositório?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Remover"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Habilitar novos repositórios"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Esses repositórios complementam o programa padrão fornecido por %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Repositórios de programas"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Nenhum repositório"
+
+#. 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 aplicativo instalado"
+msgstr[1] "%u aplicativos instalados"
+
+#. 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 complemento instalado"
+msgstr[1] "%u complementos instalados"
+
+#. 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 aplicativo"
+msgstr[1] "%u aplicativos"
+
+#. 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 complemento"
+msgstr[1] "%u complementos"
+
+#. 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 e %s instalado"
+msgstr[1] "%s e %s instalados"
+
+#. 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 "Odiei"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Não gostei"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "É bom"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Gostei"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Adorei"
+
+#. 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 "Por favor, leve mais tempo escrevendo a avaliação"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+msgid "The summary is too short"
+msgstr "A resenha está curta demais"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "A resenha está grande demais"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "A descrição está curta demais"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Publicar avaliação"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Publicar"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Classificação"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Resenha"
+
+#: src/gs-review-dialog.ui:97
+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”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Avaliação"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Encontre quais dados são enviados em nossa <a href=\"https://odrs.gnome.org/"
+"privacy\">política de privacidade</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Relatar avaliação?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Relatar"
+
+#. 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 "A avaliação foi útil para você?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Sim"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Não"
+
+#. 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 "Relatar…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Remover…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Certifique-se que você confia no fornecedor, pois o aplicativo não é "
+"executado em sandbox"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+"O aplicativo não é executado em sandbox, mas a distribuição conferir que ele "
+"não é malicioso"
+
+#. 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 "Sem permissões"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Acesso de rede"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Sem acesso à rede"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Usa serviços de sistema"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Usa serviços de seção"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Acesso a dispositivo"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Sem acesso a dispositivo"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Acesso de leitura/escrita a todo o sistema de arquivos"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Acesso de leitura/escrita à pasta Home"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Acesso de leitura a todo o sistema de arquivos"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Acesso de leitura à pasta Home"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Acesso de leitura/escrita a pasta Downloads"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Acesso de leitura à pasta downloads"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Sem acesso ao sistema de arquivos"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Não pode acessar o 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:341
+msgid "Proprietary Code"
+msgstr "Código privativo"
+
+#: 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 ""
+"O código-fonte não é público, portanto não pode ser auditado de forma "
+"independente e pode não ser seguro"
+
+#. 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 "Código auditável"
+
+#: 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 ""
+"O código-fonte é público, portanto pode ser auditado de forma independente, "
+"o que aumenta a probabilidade do aplicativo ser seguro"
+
+#. 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 "O desenvolvedor do aplicativo é verificado"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Dependências inseguras"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 é seguro"
+
+#. 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 é potencialmente inseguro"
+
+#. 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 é inseguro"
+
+#. 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 "Seguro"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Fonte"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Versão de SDK desatualizada"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Nenhuma captura de tela fornecida"
+
+#. 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:622
+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:438
+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:650
+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:732
+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:746
+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:796
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Página de pesquisa"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Pesquisa por Apps"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, 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:1286 src/gs-shell.c:1326
+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:1291
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1299
+#, 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:1304
+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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Não foi possível baixar atualizações: requer autenticação"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Não foi possível baixar atualizações: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+msgid "Unable to get list of updates"
+msgstr "Não foi possível obter a lista de atualizações"
+
+#. 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:1371
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Não foi possível instalar %s, pois o download de %s falhou"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1377
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Não foi possível instalar %s, pois o download falhou"
+
+#. 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:1389
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Não foi possível instalar %s, pois o runtime %s não está disponível"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Não foi possível instalar %s, pois não há suporte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Não foi possível instalar: foi solicitado acesso à Internet, mas o mesmo não "
+"está disponível"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1406
+msgid "Unable to install: the application has an invalid format"
+msgstr "Não foi possível instalar: o aplicativo tem um formato inválido"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1410
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Não foi possível instalar %s: requer autenticação"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1422
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Não foi possível instalar %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1428
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1435
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Não foi possível instalar %s: requer energia AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+msgid "Unable to install %s"
+msgstr "Não foi possível instalar %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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Não foi possível atualizar %s de %s, pois o download falhou"
+
+#. 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 update %s as download failed"
+msgstr "Não foi possível atualizar %s, pois 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Não foi possível instalar atualizações de %s, pois o download falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Não foi possível instalar atualizações, pois o download falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Não foi possível atualizar: foi solicitado acesso à Internet, mas a mesma "
+"não está disponível"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1527
+#, 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
+#: src/gs-shell.c:1532
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Não foi possível atualizar %s: requer autenticação"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Não foi possível instalar atualizações: requer autenticação"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Não foi possível atualizar %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Não foi possível instalar atualizações: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1567
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1582
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Não foi possível atualizar %s: requer energia AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Não foi possível instalar atualizações: requer energia AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1596
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1613
+#, 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:1616
+#, c-format
+msgid "Unable to install updates"
+msgstr "Não foi possível instalar atualizações"
+
+#. 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:1658
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Não foi possível atualizar %s pois o download falhou"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1671
+#, 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"
+
+#. 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: 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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1686
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Não foi possível atualizar para %s: 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:1692
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Não foi possível atualizar para %s: 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:1698
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1704
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Não foi possível atualizar para %s: requer energia AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1710
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1719
+#, 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,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Não foi possível remover %s: requer autenticação"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1761
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Não foi possível remover %s: autenticação inválida"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1766
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1772
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Não foi possível remover %s: requer energia AC"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1778
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Não foi possível remover %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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Não há espaço suficiente em disco — libere algum espaço e tente novamente"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Desculpe, alguma coisa deu errado"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Falha ao instalar o arquivo: não há suporte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Falha ao instalar o arquivo: a autenticação falhou"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Falha ao instalar: não há suporte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+msgid "Failed to install: authentication failed"
+msgstr "Falha ao instalar: a autenticação falhou"
+
+#. 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 "Não foi possível entrar em contato com %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted 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:1975
+msgid "AC power is required"
+msgstr "Energia AC é necessária"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "O nível da bateria está baixo demais"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "Repositório_s de programas"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferências de _atualização"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Examine o disco"
+
+#. 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 "Configurações de rede"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Reiniciar agora"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Mais informações"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Pesquisar"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Menu principal"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Saiba _mais"
+
+#. 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 "Atualizações"
+
+#. 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 "Application Data"
+msgstr "Dados do aplicativo"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Componentes de sistema compartilhados exigidos por este aplicativo"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#. 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 "Armazenamento"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Os dados em cache podem ser apagados a partir das <a href=\"dummy"
+"\">configurações do _aplicativo</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalado)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instalando)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Removendo)"
+
+#. 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 "Atualizações instaladas"
+
+#. 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 "Instalado em %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Nenhuma atualização instalada"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Atualizações de programa estão desatualizadas"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Verifique se há atualizações de programas."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Atualização crítica de programas pronta para instalação"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Uma atualização importante de programa está pronta para ser instalada."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Atualizações críticas de programas disponíveis para download"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Importante: atualizações críticas de programa estão aguardando."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Atualizações de programa prontas para instalação"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr ""
+"Atualizações de programa estão aguardando e prontas para serem instaladas."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Atualizações de programas disponíveis para download"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Baixe as atualizações de programas em espera."
+
+#. 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 aplicativo atualizado — é necessário reiniciar"
+msgstr[1] "%u aplicativos atualizados — é necessário reiniciar"
+
+#. 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 aplicativo atualizado"
+msgstr[1] "%u aplicativos atualizados"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s foi atualizado."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Por favor, reinicie o aplicativo."
+
+#. 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 e %s foram atualizados."
+
+#. 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 aplicativo requer reinicialização."
+msgstr[1] "%u aplicativos requerem reinicialização."
+
+#. 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 "Inclui %s, %s e %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 "Atualizações de sistema operacional indisponíveis"
+
+#. 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 "Atualize para continuar a receber atualizações de segurança."
+
+#. 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 "Uma nova versão de %s está disponível para instalação"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Atualizações de programas disponíveis"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+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:1139
+msgid "An important operating system update failed to be installed."
+msgstr "Uma atualização importante do sistema operacional para ser instalada."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Mostrar detalhes"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Verificar"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Última verificação: %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 não possui mais suporte."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Seu sistema operacional não possui mais suporte."
+
+#. 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 "Isso significa que ele não recebe atualizações de segurança."
+
+#. 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 "É recomendável que você atualize para uma versão mais recente."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Podem ser feitas cobranças"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Verificar mesmo _assim"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Nenhuma rede"
+
+#. 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 "Acesso à internet é necessário para verificar atualizações."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Verificação de atualizações"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Atualizações"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Página de atualizações"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Carregando atualizações…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Atualizado"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Usar dados móveis?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "Verifi_car mesmo assim"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Sem conexão"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Fique online para verificar atualizações."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "Co_nfigurações de rede"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Erro"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "As atualizações são gerenciadas automaticamente."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Reiniciar & atualizar"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Atualizar tudo"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Atualizações de aplicativos"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Firmware de dispositivo"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s disponível"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Saiba mais sobre a nova versão"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Baixando…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% baixado"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "_Reiniciar & atualizar"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Lembre-se de fazer backup dos dados e arquivos antes de atualizar."
+
+#: 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 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 ""
+"Atualizações;Upgrade;Atualização;Fontes;Repositórios;Preferências;Instalação;"
+"Instalar;Desinstalar;Programa;Software;Aplicativo;App;Loja;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:67
+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:72
+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: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Baixando imagens de destaques…"
+
+#. 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 "Atualização de %s com novos recursos e correções."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Baixando informação de atualização…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications on Linux"
+msgstr "Flatpak é um framework para aplicativos no Linux"
+
+#. 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 "Pasta do sistema %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Subpasta de pasta pessoal %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Pastas do sistema hospedeiro"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Configuração do sistema hospedeiro de /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Pasta da área de trabalho"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Subpasta da área de trabalho %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Pasta de documentos"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Subpasta de documentos %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Pasta de músicas"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Subpastas de músicas %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Pasta de fotos"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Subpasta de imagens %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Pasta de compartilhamento público"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Subpasta de compartilhamento público %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Pasta de vídeos"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Subpasta de vídeos %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Pasta de modelos"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Subpasta de modelos %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Pasta de cache do usuário"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Subpasta de cache do usuário %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Pasta de configuração do usuário"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Subpasta de configuração do usuário %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Pasta de dados do usuário"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Subpasta de dados do usuário %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Pasta de tempo de execução do usuário"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Subpasta de tempo de execução do usuário %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Obtendo metadados de flatpak para %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Atualização do configuração %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, c-format
+msgid "%s Battery Update"
+msgstr "Atualização de bateria %s"
+
+#. 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 "Atualização de câmera %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Atualização do receptor USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Instalar programa sem assinatura?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Baixar programa sem assinatura?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Atualizar programa sem assinatura?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Pacotes"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2687
+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"
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Gerenciador de aplicativos para o GNOME"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "system"
+#~ msgstr "sistema"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Reiniciar agora"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s pronto para ser instalado"
+
+#~ 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 "_Enable"
+#~ msgstr "_Habilitar"
+
+#~ 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..c4f1766
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,6842 @@
+# 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 <mintoi.bogdan@gmail.com>, 2014.
+# Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>, 2014-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: 2021-09-16 12:17+0000\n"
+"PO-Revision-Date: 2021-09-16 17:40+0200\n"
+"Last-Translator: Florentina Mușat <florentina.musat.28@gmail.com>\n"
+"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
+"sourceforge.net>\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: Poedit 3.0\n"
+"X-Project-Style: gnome\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:7
+msgid "GNOME Software"
+msgstr "Aplicații GNOME"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Administrator de aplicații pentru 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 ""
+"Aplicații vă permite să gasiți și să instalați aplicații noi și extensii de "
+"sistem sau să eliminați aplicații deja instalate."
+
+#: 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 ""
+"Aplicații GNOME prezintă aplicații recomandate și populare care conțin "
+"descrieri folositoare și capturi de ecran multiple pentru fiecare aplicație. "
+"Acestea pot fi găsite fie prin răsfoirea listei categoriilor fie printr-o "
+"simplă căutare. Vă permite, de asemenea, să actualizați sistemul prin "
+"intermediul unei actualizări în modul deconectat."
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "Panoul de ansamblu"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Details panel"
+msgstr "Panoul cu detalii"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Installed panel"
+msgstr "Panoul cu instalate"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+#: data/appdata/org.gnome.Software.appdata.xml.in:45
+msgid "Updates panel"
+msgstr "Panoul cu actualizări"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:49
+msgid "The update details"
+msgstr "Detaliile actualizărilor"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1818
+msgid "The GNOME Project"
+msgstr "Proiectul GNOME"
+
+#: 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ă se administrează actualizări și înnoiri î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ă dezactivat, Aplicații GNOME va ascunde panoul de actualizări și nu va "
+"exectua nicio acțiune de actualizare automată sau întreba de înnoiri."
+
+#: 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ă este activat, Aplicații GNOME va descărca actualizările în fundal "
+"automat, instalând de asemenea pe acelea ce 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 fundal"
+
+#: 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ă este activat, Aplicații GNOME va notifica utilizatorul despre "
+"actualizări 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 reîmprospăteze automat când sunteți pe 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ă este activată, Aplicații GNOME va reîmprospăta automat în fundal chiar "
+"și atunci când o conexiune contorizată este în uz (într-un final descărcând "
+"unele metadate, verificând după actualizări, etc., fapt ce poate produce "
+"costuri pentru utilizator)."
+
+#: data/org.gnome.software.gschema.xml:30
+msgid "Whether it’s the very first run of GNOME Software"
+msgstr "Dacă este prima rulare a lui 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 aplicații nelibere sunt instalate un dialog de avertizare poate fi "
+"arătat. Aceasta controloează dacă acel dialog este suprimat."
+
+#: data/org.gnome.software.gschema.xml:47
+msgid "A list of popular applications"
+msgstr "O listă de aplicații populare"
+
+#: data/org.gnome.software.gschema.xml:48
+msgid "A list of applications to use, overriding the system defined ones."
+msgstr "O listă de aplicații de folosit, înlocuind pe cele definite de sistem."
+
+#: data/org.gnome.software.gschema.xml:52
+msgid "The last update check timestamp"
+msgstr "Marcaj de timp pentru ultima verificare după actualizări"
+
+#: data/org.gnome.software.gschema.xml:56
+msgid "The last upgrade notification timestamp"
+msgstr "Marcaj de timp pentru ultima notificare de actualizare"
+
+#: data/org.gnome.software.gschema.xml:60
+msgid "The last update notification timestamp"
+msgstr "Marcaj de timp pentru ultima notificare de actualizare"
+
+#: data/org.gnome.software.gschema.xml:64
+msgid "The timestamp of the first security update, cleared after update"
+msgstr ""
+"Marcajul de timp al primei actualizări de securitate, restabilit după "
+"actualizare"
+
+#: data/org.gnome.software.gschema.xml:68
+msgid "The last update timestamp"
+msgstr "Marcaj de timp pentru ultima actualizare"
+
+#: data/org.gnome.software.gschema.xml:72
+msgid "The last timestamp when the system was online and got any updates"
+msgstr "Ultima datare la care sistemul a fost conectat și a primit actualizări"
+
+#: data/org.gnome.software.gschema.xml:76
+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:77
+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:86
+msgid "The server to use for application reviews"
+msgstr "Serverul de folosit pentru recenzii pentru aplicații"
+
+#: data/org.gnome.software.gschema.xml:90
+msgid "The minimum karma score for reviews"
+msgstr "Scorul minim karma pentru recenzii"
+
+#: data/org.gnome.software.gschema.xml:91
+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:95
+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:99
+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:103
+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:107
+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:111
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Permite accesul la dialogul Depozite de aplicații"
+
+#: data/org.gnome.software.gschema.xml:115
+msgid "Offer upgrades for pre-releases"
+msgstr "Oferă înnoiri pentru pre-lansate"
+
+#: data/org.gnome.software.gschema.xml:119
+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:123
+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:127
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://ro.wikipedia.org/wiki/Software_proprietar'"
+
+#: data/org.gnome.software.gschema.xml:128
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "URI-ul care explică programele nelibere și proprietare"
+
+#: 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 ""
+"O listă de URL-uri indicând către fișiere appstream care vor fi descărcate "
+"înt-un dosar app-info"
+
+#: data/org.gnome.software.gschema.xml:136
+msgid "Install the AppStream files to a system-wide location for all users"
+msgstr ""
+"Instalează fișierele AppStream într-o locație generală de sistem pentru toți "
+"utilizatorii"
+
+#: data/org.gnome.software.gschema.xml:140
+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."
+msgstr ""
+"Ordinea priorității a formatelor de împachetare de preferat, cu cele mai "
+"importante formate listate mai întâi. O matrice goală înseamnă ordinea "
+"implicită. Formatele omise se vor afișa la sfârșit."
+
+#: data/org.gnome.software.gschema.xml:145
+msgid "The URI that references the background for an upgrade banner."
+msgstr "URI-ul care face referință la fundalul unui banner de actualizare."
+
+#: data/org.gnome.software.gschema.xml:146
+msgid ""
+"The URI can contain up to three '%u', which will be replaced by the upgrade "
+"version."
+msgstr ""
+"URI-ul poate conține până la trei „%u”, care vor fi înlocuiți de versiunea "
+"actualizării."
+
+#: data/org.gnome.software.gschema.xml:152
+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 copying profiles system-wide
+#: gs-install-appstream/gs-install-appstream.c:141
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Instalator AppStream pentru Aplicații GNOME"
+
+#: gs-install-appstream/gs-install-appstream.c:143
+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:150
+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:157
+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:165
+#, 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:176
+#, c-format
+msgid "Failed to copy: %s"
+msgstr "Nu s-a putut copia: %s"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Instalare aplicații"
+
+#: src/gnome-software-local-file.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:78
+msgid "Cartoon Violence"
+msgstr "Violență animată"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:85
+msgid "Fantasy Violence"
+msgstr "Violență fantastică"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:92
+msgid "Realistic Violence"
+msgstr "Violență reală"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:99
+msgid "Violence Depicting Bloodshed"
+msgstr "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:106
+msgid "Sexual Violence"
+msgstr "Violență sexuală"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:113
+msgid "Alcohol"
+msgstr "Alcool"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:120
+msgid "Narcotics"
+msgstr "Narcotice"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:127
+msgid "Tobacco"
+msgstr "Tutun"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:134
+msgid "Nudity"
+msgstr "Nuditate"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:141
+msgid "Sexual Themes"
+msgstr "Teme sexuale"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:148
+msgid "Profanity"
+msgstr "Profanare"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:155
+msgid "Inappropriate Humor"
+msgstr "Umor inapropriat"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:162
+msgid "Discrimination"
+msgstr "Discriminare"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:169
+msgid "Advertising"
+msgstr "Reclame"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:176
+msgid "Gambling"
+msgstr "Jocuri de noroc"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:183
+msgid "Purchasing"
+msgstr "Cumpărături"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:190
+msgid "Chat Between Users"
+msgstr "Chat între utilizatori"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:197
+msgid "Audio Chat Between Users"
+msgstr "Chat audio între utilizatori"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:204
+msgid "Contact Details"
+msgstr "Detalii de contact"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:211
+msgid "Identifying Information"
+msgstr "Se identifică informațiile"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:218
+msgid "Location Sharing"
+msgstr "Partajarea locației"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:241
+msgid "Homosexuality"
+msgstr "Homosexualitate"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:248
+msgid "Prostitution"
+msgstr "Prostituție"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:255
+msgid "Adultery"
+msgstr "Adulter"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:262
+msgid "Sexualized Characters"
+msgstr "Caractere sexuale"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:269
+msgid "Desecration"
+msgstr "Profanare istorică"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:276
+msgid "Human Remains"
+msgstr "Rămășițe umane"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:283
+msgid "Slavery"
+msgstr "Sclavie"
+
+#. Translators: This refers to a content rating attribute which
+#. * has an unknown value. For example, the amount of violence in
+#. * an app is ‘Unknown’.
+#: src/gs-age-rating-context-dialog.c:338
+msgid "Unknown"
+msgstr "Necunoscută"
+
+#. 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.
+#. TRANSLATORS: this is a subcategory matching all the
+#. * different apps in the parent category, e.g. "Games"
+#: src/gs-age-rating-context-dialog.c:605 lib/gs-category.c:214
+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 application is not known. The bubble is small,
+#. * so the string should be as short as possible.
+#: src/gs-age-rating-context-dialog.c:618 src/gs-app-context-bar.c:187
+#: src/gs-storage-context-dialog.c:87
+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:684
+#, 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:688
+#, 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:692
+#, 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 people up to around age 18. The placeholder is the app name.
+#: src/gs-age-rating-context-dialog.c:700
+#, 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:704
+#, 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:709
+#, 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:9 src/gs-app-context-bar.ui:302
+msgid "Age Rating"
+msgstr "Categorie de vârstă"
+
+#: src/gs-age-rating-context-dialog.ui:116
+#: src/gs-hardware-support-context-dialog.ui:115
+#: src/gs-safety-context-dialog.ui:264
+msgid "How to add missing information"
+msgstr "Cum se adaugă informații lipsă"
+
+#: lib/gs-app.c:5607
+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:5623 src/gs-safety-context-dialog.c:391
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:5699
+msgid "Package"
+msgstr "Pachet"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:435
+msgid "Pending"
+msgstr "În așteptare"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:439 src/gs-details-page.c:359
+msgid "Pending install"
+msgstr "Instalare în așteptare"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:443 src/gs-details-page.c:366
+msgid "Pending remove"
+msgstr "Eliminare în așteptare"
+
+#. 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-app-addon-row.c:111 src/gs-app-row.ui:167 src/gs-app-tile.ui:51
+#: src/gs-feature-tile.c:381 src/gs-installed-page.c:592 src/gs-shell.ui:319
+msgid "Installed"
+msgstr "Instalat"
+
+#. 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:195 src/gs-details-page.c:352
+msgid "Installing"
+msgstr "Se instalează"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Se elimină"
+
+#: src/gs-app-addon-row.ui:70
+msgid "_Uninstall"
+msgstr "_Dezinstalează"
+
+#: src/gs-app-details-page.c:70
+msgid "Network"
+msgstr "Rețea"
+
+#: src/gs-app-details-page.c:70
+msgid "Can communicate over the network"
+msgstr "Pot comunica prin rețea"
+
+#: src/gs-app-details-page.c:71
+msgid "System Services"
+msgstr "Servicii ale sistemului"
+
+#: src/gs-app-details-page.c:71
+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:72
+msgid "Session Services"
+msgstr "Servicii de sesiune"
+
+#: src/gs-app-details-page.c:72
+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:73
+msgid "Devices"
+msgstr "Dispozitive"
+
+#: src/gs-app-details-page.c:73
+msgid "Can access system device files"
+msgstr "Pot accesa fișierele de sistem ale dispozitivelor"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+msgid "Home folder"
+msgstr "Dosar personal"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:76
+#: src/gs-app-details-page.c:78
+msgid "Can view, edit and create files"
+msgstr "Poate vedea, edita și crea fișiere"
+
+#: src/gs-app-details-page.c:75 src/gs-app-details-page.c:77
+#: src/gs-app-details-page.c:79
+msgid "Can view files"
+msgstr "Poate vedea fișiere"
+
+#: src/gs-app-details-page.c:76 src/gs-app-details-page.c:77
+msgid "File system"
+msgstr "Sistem de fișiere"
+
+#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:79
+msgid "Downloads folder"
+msgstr "Dosar descărcări"
+
+#: src/gs-app-details-page.c:80
+msgid "Settings"
+msgstr "Configurări"
+
+#: src/gs-app-details-page.c:80
+msgid "Can view and change any settings"
+msgstr "Poate vedea și modifica orice configurare"
+
+#: src/gs-app-details-page.c:81
+msgid "Legacy display system"
+msgstr "Sistem moștenit de afișare"
+
+#: src/gs-app-details-page.c:81
+msgid "Uses an old, insecure display system"
+msgstr "Folosește un sistem de afișare vechi și nesigur"
+
+#: src/gs-app-details-page.c:82
+msgid "Sandbox escape"
+msgstr "Evadare din modul sandbox"
+
+#: src/gs-app-details-page.c:82
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Poate evada din modul sandbox și împiedica orice alte restricții"
+
+#. Translators: This is the source and upgrade version of an
+#. * application, shown to the user when they view more detailed
+#. * information about pending updates. The source is of the form
+#. * ‘deja-dup’ (a package name) or
+#. * ‘app/org.gnome.Builder/x86_64/main’ (a flatpak ID), and the
+#. * version is of the form ‘40.4-1.fc34’ (a version number).
+#: src/gs-app-details-page.c:159
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-app-details-page.c:177
+msgid "No update description available."
+msgstr "Nu este disponibilă nicio descriere a actualizării."
+
+#: src/gs-app-details-page.ui:22 src/gs-os-update-page.ui:22
+#: src/gs-shell.ui:374 src/gs-shell.ui:462
+msgid "Go back"
+msgstr "Înapoi"
+
+#: src/gs-app-details-page.ui:109 src/gs-app-row.c:504
+msgid "Requires additional permissions"
+msgstr "Necesită permisiuni adiționale"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552
+msgid "Version History"
+msgstr "Istoricul versiunilor"
+
+#: src/gs-app-version-history-row.c:61
+#, c-format
+msgid "New in Version %s"
+msgstr "Noutăți în versiunea %s"
+
+#: src/gs-app-version-history-row.c:68
+#, c-format
+msgid "Version %s"
+msgstr "Versiunea %s"
+
+#: src/gs-app-version-history-row.c:70
+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:84 src/gs-review-row.c:65
+msgid "%e %B %Y"
+msgstr "%e %B %Y"
+
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:139
+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:139
+msgid "MODE"
+msgstr "MOD"
+
+#: src/gs-application.c:141
+msgid "Search for applications"
+msgstr "Căutați aplicații"
+
+#: src/gs-application.c:141
+msgid "SEARCH"
+msgstr "CAUTĂ"
+
+#: src/gs-application.c:143
+msgid "Show application details (using application ID)"
+msgstr "Arată detaliile aplicației (folosind ID-ul aplicației)"
+
+#: src/gs-application.c:143 src/gs-application.c:147
+msgid "ID"
+msgstr "ID"
+
+#: src/gs-application.c:145
+msgid "Show application details (using package name)"
+msgstr "Arată detaliile aplicației (folosind numele pachetului)"
+
+#: src/gs-application.c:145
+msgid "PKGNAME"
+msgstr "NUME PACHET"
+
+#: src/gs-application.c:147
+msgid "Install the application (using application ID)"
+msgstr "Instalează aplicația (folosind ID-ul aplicației)"
+
+#: src/gs-application.c:149
+msgid "Open a local package file"
+msgstr "Deschide un pachet local"
+
+#: src/gs-application.c:149
+msgid "FILENAME"
+msgstr "NUME FIȘIER"
+
+#: src/gs-application.c:151
+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:154
+msgid "Show verbose debugging information"
+msgstr "Arată informații detaliate de depanare"
+
+#: src/gs-application.c:156
+msgid "Installs any pending updates in the background"
+msgstr "Instalează orice actualizări apărute în fundal"
+
+#: src/gs-application.c:158
+msgid "Show update preferences"
+msgstr "Arată preferințele de actualizare"
+
+#: src/gs-application.c:160
+msgid "Quit the running instance"
+msgstr "Ieși din instanța în curs de rulare"
+
+#: src/gs-application.c:162
+msgid "Prefer local file sources to AppStream"
+msgstr "Preferă surse de fișiere locale pentru AppStream"
+
+#: src/gs-application.c:164
+msgid "Show version number"
+msgstr "Arată numărul de versiune"
+
+#: src/gs-application.c:358
+msgid "Copyright © 2016–2021 GNOME Software contributors"
+msgstr "Drepturi de autor © 2016–2021 contribuitorii lui „Aplicații GNOME”"
+
+#: src/gs-application.c:361
+msgid "translator-credits"
+msgstr ""
+"Bogdan Mințoi <mintoi [dot ] bogdan [at] gmail [dot] com>, 2014\n"
+"Adrian Gabor <raziel_theripper [at] yahoo [dot] com>, 2015\n"
+"Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>, 2016-2021\n"
+"Florentina Mușat <florentina [dot] musat [dot] 28 [at] gmail [dot] com>, "
+"2020-2021"
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:374 src/gs-shell.c:2137
+msgid "About Software"
+msgstr "Despre Aplicații"
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:377
+msgid "A nice way to manage the software on your system."
+msgstr "Un mod plăcut de a administra aplicații pentru sistemul dumneavoastră."
+
+#. TRANSLATORS: we tried to show an app that did not exist
+#: src/gs-application.c:566
+msgid "Sorry! There are no details for that application."
+msgstr "Nu există detalii pentru aplicația aceea."
+
+#. 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:148 src/gs-storage-context-dialog.c:128
+msgid "Installed Size"
+msgstr "Dimensiunea instalării"
+
+#: src/gs-app-context-bar.c:151
+#, 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:154
+#, c-format
+msgid "Includes %s of data"
+msgstr "Include %s de date"
+
+#: src/gs-app-context-bar.c:157
+#, c-format
+msgid "Includes %s of cache"
+msgstr "Include %s de cache"
+
+#: src/gs-app-context-bar.c:160
+msgid "Cache and data usage unknown"
+msgstr "Utilizarea datelor și a cache-ului necunoscută"
+
+#. 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:169 src/gs-storage-context-dialog.c:156
+msgid "Download Size"
+msgstr "Dimensiunea descărcării"
+
+#: src/gs-app-context-bar.c:172
+msgid "Needs no additional system downloads"
+msgstr "Nu necesită descărcări adiționale de sistem"
+
+#: src/gs-app-context-bar.c:174
+msgid "Needs an unknown size of additional system downloads"
+msgstr "Necesită o dimensiune necunoscută de descărcări de sistem adiționale"
+
+#. Translators: The placeholder is for a size string,
+#. * such as ‘150 MB’ or ‘1.5 GB’.
+#: src/gs-app-context-bar.c:179
+#, c-format
+msgid "Needs %s of additional system downloads"
+msgstr "Necesită %s de descărcări de sistem adiționale"
+
+#. 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:193
+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:257
+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:268
+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:275
+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:282
+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:289
+msgid "Can access hardware devices"
+msgstr "Poate accesa dispozitivele hardware"
+
+#. 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:301
+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:313
+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:320
+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:327
+msgid "Can read your downloads"
+msgstr "Poate să citească toate descărcările"
+
+#. 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:334 src/gs-safety-context-dialog.c:217
+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:341 src/gs-safety-context-dialog.c:201
+msgid "Uses a legacy windowing system"
+msgstr "Utilizează un sistem de fereastră moștenit"
+
+#. 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:348 src/gs-safety-context-dialog.c:209
+msgid "Can acquire arbitrary permissions"
+msgstr "Poate să dobândească permisiuni arbitrare"
+
+#. 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:374 src/gs-safety-context-dialog.c:142
+msgid "Reviewed by your distribution"
+msgstr "Recenzat de distribuția dumneavoastră"
+
+#. 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:381 src/gs-safety-context-dialog.c:139
+msgid "Provided by a third party"
+msgstr "Oferit de o parte terță"
+
+#. 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:393
+msgid "Proprietary code"
+msgstr "Cod proprietar"
+
+#. 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:399
+msgid "Auditable code"
+msgstr "Cod audibil"
+
+#. 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:406
+msgid "Software developer is verified"
+msgstr "Dezvoltatorul aplicației este verificat"
+
+#. 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:418 src/gs-app-context-bar.c:679
+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:426
+msgid "Safe"
+msgstr "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:433
+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:440
+msgid "Unsafe"
+msgstr "Nesigur"
+
+#: src/gs-app-context-bar.c:519 src/gs-app-context-bar.c:551
+#: src/gs-hardware-support-context-dialog.c:587
+msgid "Mobile Only"
+msgstr "Doar pe mobil"
+
+#: src/gs-app-context-bar.c:520
+msgid "Only works on a small screen"
+msgstr "Funcționează doar pe un ecran mic"
+
+#: src/gs-app-context-bar.c:525 src/gs-app-context-bar.c:558
+#: src/gs-app-context-bar.c:565 src/gs-app-context-bar.c:605
+#: src/gs-app-context-bar.c:610 src/gs-hardware-support-context-dialog.c:567
+msgid "Desktop Only"
+msgstr "Doar pe desktop"
+
+#: src/gs-app-context-bar.c:526
+msgid "Only works on a large screen"
+msgstr "Funcționează doar pe un ecran mare"
+
+#: src/gs-app-context-bar.c:530 src/gs-hardware-support-context-dialog.c:605
+msgid "Screen Size Mismatch"
+msgstr "Nepotrivire a dimensiunii ecranului"
+
+#: src/gs-app-context-bar.c:531 src/gs-hardware-support-context-dialog.c:606
+msgid "Doesn’t support your current screen size"
+msgstr "Nu suportă dimensiunea curentă a ecranului"
+
+#: src/gs-app-context-bar.c:552 src/gs-hardware-support-context-dialog.c:658
+#: src/gs-hardware-support-context-dialog.c:664
+msgid "Requires a touchscreen"
+msgstr "Necesită un ecran tactil"
+
+#: src/gs-app-context-bar.c:559 src/gs-hardware-support-context-dialog.c:618
+#: src/gs-hardware-support-context-dialog.c:624
+msgid "Requires a keyboard"
+msgstr "Necesită o tastatură"
+
+#: src/gs-app-context-bar.c:566
+msgid "Requires a mouse"
+msgstr "Necesită un maus"
+
+#: src/gs-app-context-bar.c:577
+msgid "Gamepad Needed"
+msgstr "Este necesar un gamepad"
+
+#: src/gs-app-context-bar.c:578
+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:592
+msgid "Adaptive"
+msgstr "Adaptiv"
+
+#: src/gs-app-context-bar.c:593
+msgid "Works on phones, tablets and desktops"
+msgstr "Funcționează pe telefoane, tablete și desktop-uri"
+
+#: src/gs-app-context-bar.c:606
+msgid "Probably requires a keyboard or mouse"
+msgstr "Probabil necesită o tastatură și un maus"
+
+#: src/gs-app-context-bar.c:611
+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:654
+msgid "Contains no age-inappropriate content"
+msgstr "Nu conține conținut neadecvat vârstei"
+
+#: src/gs-app-context-bar.c:703
+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 application to be easily installed
+#: src/gs-app-row.c:143
+msgid "Visit Website"
+msgstr "Vizitați situl 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:149
+msgid "Install…"
+msgstr "Instalează…"
+
+#. 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:157 src/gs-updates-section.ui:61
+msgid "Cancel"
+msgstr "Anulează"
+
+#. 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:165 src/gs-common.c:297 src/gs-page.c:365
+msgid "Install"
+msgstr "Instalează"
+
+#. TRANSLATORS: this is a button in the updates panel
+#. * that allows the app to be easily updated live
+#: src/gs-app-row.c:173
+msgid "Update"
+msgstr "Actualizează"
+
+#. 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:178 src/gs-app-row.c:188 src/gs-details-page.ui:296
+#: src/gs-page.c:523
+msgid "Uninstall"
+msgstr "Dezinstalează"
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * shows the status of an application being erased
+#: src/gs-app-row.c:202
+msgid "Uninstalling"
+msgstr "Se dezinstalează"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:312
+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:322 src/gs-shell-search-provider.c:264
+#, 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:511
+#, c-format
+msgid "Renamed from %s"
+msgstr "Redenumit de la %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Ajutați la traducerea %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 este concepută, dezvoltată, și tradusă de o comunitate internațională de "
+"voluntari.\n"
+"\n"
+"Aceasta înseamnă că chiar dacă nu este disponibilă în limba dumneavoastră, "
+"puteți să vă implicați și să ajutați la traducere."
+
+#: src/gs-app-translation-dialog.ui:9
+msgid "Translations"
+msgstr "Traduceri"
+
+#: src/gs-app-translation-dialog.ui:133
+msgid "_Translation Website"
+msgstr "Si_tul web al traducerilor"
+
+#. 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 "Autentificare la distanță necesară %s (realm %s)"
+
+#: src/gs-basic-auth-dialog.ui:10
+msgid "Login Required"
+msgstr "Autentificare necesară"
+
+#: src/gs-basic-auth-dialog.ui:19 src/gs-details-page.ui:311
+#: src/gs-removal-dialog.ui:29 src/gs-review-dialog.ui:22
+msgid "_Cancel"
+msgstr "_Anulează"
+
+#: src/gs-basic-auth-dialog.ui:39
+msgid "_Login"
+msgstr "_Autentificare"
+
+#: src/gs-basic-auth-dialog.ui:99
+msgid "_User"
+msgstr "_Utilizator"
+
+#: src/gs-basic-auth-dialog.ui:119
+msgid "_Password"
+msgstr "_Parolă"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:209
+msgid "Other"
+msgstr "Altele"
+
+#. 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:46 src/gs-overview-page.ui:118
+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:74 src/gs-overview-page.ui:146
+msgid "New & Updated"
+msgstr "Noi și actualizate"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:102
+msgid "Other Software"
+msgstr "Alte aplicații"
+
+#. TRANSLATORS: the user isn't reading the question
+#: lib/gs-cmd.c:193
+#, c-format
+msgid "Please enter a number from 1 to %u: "
+msgstr "Introduceți un număr de la 1 la %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:256
+msgid "Choose an application:"
+msgstr "Alegeți o aplicație:"
+
+#: 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 editare 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 "Fonturi"
+
+#: 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 "Fonturi"
+
+#. 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 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:130 src/gs-common.c:153
+#, c-format
+msgid "%s is now installed"
+msgstr "%s este acum instalată"
+
+#. TRANSLATORS: an application has been installed, but
+#. * needs a reboot to complete the installation
+#: src/gs-common.c:134 src/gs-common.c:157
+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 application
+#. * has been successfully installed
+#: src/gs-common.c:138
+msgid "Application 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:146
+msgid "OS updates are now installed"
+msgstr "Actualizări de OS sunt instalate"
+
+#. TRANSLATORS: this is the body of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:149
+msgid "Recently installed updates are available to review"
+msgstr "Actualizări instalate recent sunt disponibile pentru recenzie"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:168 src/gs-common.c:720
+msgid "Restart"
+msgstr "Repornește"
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:172
+msgid "Launch"
+msgstr "Lansează"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:231
+msgid "Install Third-Party Software?"
+msgstr "Instalați aplicații din sursă terță?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:235 src/gs-repos-dialog.c:193
+msgid "Enable Third-Party Software Repository?"
+msgstr "Activați depozitul terț de aplicații?"
+
+#. 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 not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nu este <a href=\"https://ro.wikipedia.org/wiki/Software_liber"
+"\">aplicație liberă cu sursa deschisă</a>, și este furnizat de către „%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:261
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s este furnizat de către „%s”."
+
+#: src/gs-common.c:270
+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:280
+#, 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:286
+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:293
+msgid "Don’t Warn Again"
+msgstr "Nu atenționa din nou"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:302
+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:494
+msgid "Detailed errors from the package manager follow:"
+msgstr "Erorile detaliate ale administratorului de pachete:"
+
+#: src/gs-common.c:513 src/gs-safety-context-dialog.ui:116
+msgid "Details"
+msgstr "Detalii"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-common.c:695
+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 removed some apps
+#: src/gs-common.c:705
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "O aplicație a fost eliminată"
+msgstr[1] "Mai multe aplicații au fost eliminate"
+msgstr[2] "Mai multe aplicații au fost eliminate"
+
+#. TRANSLATORS: the new apps will not be run until we restart
+#: src/gs-common.c:711
+msgid "A restart is required for it to take effect."
+msgid_plural "A restart is required for them to take effect."
+msgstr[0] "O repornire este necesară pentru ca ea să aibă efect."
+msgstr[1] "O repornire este necesară pentru ca ele să aibă efect."
+msgstr[2] "O repornire este necesară pentru ca ele să aibă efect."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:718
+msgid "Not Now"
+msgstr "Nu acum"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:810
+msgid "Just now"
+msgstr "Tocmai acum"
+
+#: src/gs-common.c:812
+#, 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:816
+#, 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ă"
+
+#: src/gs-common.c:820
+#, 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:824
+#, 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:828
+#, 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:832
+#, 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: this is a what we use in notifications if the app's name is unknown
+#: src/gs-dbus-helper.c:283
+msgid "An application"
+msgstr "O aplicație"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types.
+#: src/gs-dbus-helper.c:289
+#, c-format
+msgid "%s is requesting additional file format support."
+msgstr "%s cere suport adițional pentru formatul de fișier."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:291
+msgid "Additional MIME Types Required"
+msgstr "Sunt necesare tipuri MIME adiționale"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional fonts.
+#: src/gs-dbus-helper.c:295
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr "%s cere fonturi adiționale."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:297
+msgid "Additional Fonts Required"
+msgstr "Sunt necesare fonturi adiționale"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional codecs.
+#: src/gs-dbus-helper.c:301
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr "%s cere codecuri multimedia adiționale."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:303
+msgid "Additional Multimedia Codecs Required"
+msgstr "Sunt necesare codecuri multimedia adiționale"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional printer drivers.
+#: src/gs-dbus-helper.c:307
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr "%s cere drivere adiționale pentru imprimantă."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:309
+msgid "Additional Printer Drivers Required"
+msgstr "Sunt necesare drivere adiționale pentru imprimantă"
+
+#. TRANSLATORS: this is a notification displayed when an app wants to install additional packages.
+#: src/gs-dbus-helper.c:313
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "%s cere pachete adiționale."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:315
+msgid "Additional Packages Required"
+msgstr "Sunt necesare pachete adiționale"
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:324
+msgid "Find in Software"
+msgstr "Caută în Aplicații"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-description-box.c:65 src/gs-description-box.c:171
+#: src/gs-details-page.ui:966
+msgid "_Show More"
+msgstr "_Arată mai multe"
+
+#: src/gs-description-box.c:65
+msgid "_Show Less"
+msgstr "_Arată mai puțin"
+
+#: src/gs-details-page.c:347
+msgid "Removing…"
+msgstr "Se elimină…"
+
+#: src/gs-details-page.c:357
+msgid "Requires restart to finish install"
+msgstr "Necesită repornirea pentru finalizarea instalării"
+
+#: src/gs-details-page.c:364
+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:381
+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:388
+msgid "Pending update…"
+msgstr "Actualizare în așteptare…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:404
+msgid "Preparing…"
+msgstr "Se pregătește…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:407
+msgid "Uninstalling…"
+msgstr "Se dezinstalează…"
+
+#. 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:824 src/gs-details-page.c:850
+#: src/gs-details-page.ui:240
+msgid "_Install"
+msgstr "_Instalează"
+
+#: src/gs-details-page.c:840
+msgid "_Restart"
+msgstr "_Repornește"
+
+#. 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:864
+msgid "_Install…"
+msgstr "_Instalează…"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1404
+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:1549 src/gs-details-page.c:1565
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nu s-a putut găsi „%s”"
+
+#. TRANSLATORS: This is a title for the app details page,
+#. * shown when it’s loading the details of an app.
+#: src/gs-details-page.c:2121
+msgid "Loading…"
+msgstr "Se încarcă…"
+
+#: src/gs-details-page.ui:8
+msgid "Details page"
+msgstr "Pagina de detalii"
+
+#: src/gs-details-page.ui:40
+msgid "Loading application details…"
+msgstr "Se încarcă detaliile aplicației…"
+
+#: src/gs-details-page.ui:79
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Această aplicație nu este disponibilă în limba dumneavoastră și va apărea în "
+"engleză (SUA)."
+
+#: src/gs-details-page.ui:87
+msgid "Help _Translate"
+msgstr "Ajută la _traducere"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:257
+msgid "_Open"
+msgstr "_Deschide"
+
+#: src/gs-details-page.ui:270
+msgid "_Update"
+msgstr "Act_ualizează"
+
+#: src/gs-details-page.ui:336
+msgid "Downloading"
+msgstr "Descărcare"
+
+#. Translators: A label for a button to add a shortcut to the selected application.
+#: src/gs-details-page.ui:358
+msgid "_Add shortcut"
+msgstr "_Adaugă scurtătură"
+
+#. Translators: A label for a button to remove a shortcut to the selected application.
+#: src/gs-details-page.ui:374
+msgid "Re_move shortcut"
+msgstr "Eli_mină scurtătură"
+
+#: src/gs-details-page.ui:466 src/gs-installed-page.ui:120
+msgid "Add-ons"
+msgstr "Suplimente"
+
+#: src/gs-details-page.ui:478
+msgid "Selected add-ons will be installed with the application."
+msgstr "Suplimentele alese vor fi instalate împreună cu aplicația."
+
+#: src/gs-details-page.ui:586
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Această aplicație poate fi utilizată doar când este prezentă o conexiune "
+"activă de internet."
+
+#: src/gs-details-page.ui:607
+msgid "Software Repository Included"
+msgstr "Depozit de aplicații inclus"
+
+#: src/gs-details-page.ui:608
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"Aplicația include un depozit de aplicații care furnizează atât actualizări "
+"cât și acces la alte aplicații."
+
+#: src/gs-details-page.ui:626
+msgid "No Software Repository Included"
+msgstr "Niciun depozit de aplicații inclus"
+
+#: src/gs-details-page.ui:627
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Această aplicație nu include un depozit de aplicații. Ca urmare, nu va fi "
+"actualizată la versiuni noi."
+
+#: src/gs-details-page.ui:646
+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ă."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:664
+msgid "Software Repository Identified"
+msgstr "Depozit de aplicații identificat"
+
+#: src/gs-details-page.ui:665
+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 actualizări și "
+"aplicații adiționale."
+
+#: src/gs-details-page.ui:666
+msgid "Only use software repositories that you trust."
+msgstr "Utilizați doar depozite de aplicații de încredere."
+
+#: src/gs-details-page.ui:731
+msgid "No Metadata"
+msgstr "Fără metadate"
+
+#: src/gs-details-page.ui:741
+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.ui:769
+msgid "Project _Website"
+msgstr "Sit _web al proiectului"
+
+#: src/gs-details-page.ui:795
+msgid "_Donate"
+msgstr "_Donează"
+
+#: src/gs-details-page.ui:821
+msgid "Contribute _Translations"
+msgstr "Contribuiți cu _traduceri"
+
+#: src/gs-details-page.ui:847
+msgid "_Report an Issue"
+msgstr "_Raportează o problemă"
+
+#: src/gs-details-page.ui:873
+msgid "_Help"
+msgstr "_Ajutor"
+
+#. Translators: Header of the section with other users' opinions about the app.
+#: src/gs-details-page.ui:926
+msgid "Reviews"
+msgstr "Recenzii"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:944
+msgid "_Write a Review"
+msgstr "_Scrieți o recenzie"
+
+#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos
+#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’).
+#: src/gs-details-page.ui:1043 src/gs-safety-context-dialog.ui:189
+msgid "Source"
+msgstr "Sursă"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:226
+msgid "Downloading extra metadata files…"
+msgstr "Se descarcă fișierele cu metadate…"
+
+#. 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: Application 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] "Fonturi disponibile pentru scriptul %s"
+msgstr[1] "Fonturi disponibile pentru scripturile %s"
+msgstr[2] "Fonturi disponibile pentru scripturile %s"
+
+#. TRANSLATORS: Application 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] "Aplicații disponibile pentru %s"
+msgstr[1] "Aplicații disponibile pentru %s"
+msgstr[2] "Aplicații disponibile pentru %s"
+
+#: src/gs-extras-page.c:243
+msgid "Requested software not found"
+msgstr "Programul cerut nu a fost găsit"
+
+#: src/gs-extras-page.c:245
+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:341
+#, c-format
+msgid "%s not found"
+msgstr "%s nu a fost găsit"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:345
+msgid "on the website"
+msgstr "pe situl 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:352
+#, c-format
+msgid "No applications 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:356 src/gs-extras-page.c:367 src/gs-extras-page.c:378
+#, c-format
+msgid ""
+"Information about %s, as well as options for how to get missing applications "
+"might be found %s."
+msgstr ""
+"Informații despre %s, precum și opțiuni despre cum să obțineți aplicațiile "
+"lipsă pot fi găsite %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:363 src/gs-extras-page.c:385
+#, c-format
+msgid "No applications are available for %s support."
+msgstr "Nu sunt disponibile aplicații cu suport pentru %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:374
+#, 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:389
+#, 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 ""
+"Informații despre %s, precum și opțiuni despre cum să obțineți o aplicație "
+"necesară redării acestui format pot fi găsite %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:396
+#, c-format
+msgid "No fonts are available for the %s script support."
+msgstr "Nu sunt disponibile fonturi pentru suportul scriptului %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:400
+#, 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 despre cum să obțineți fonturi "
+"adiționale pot fi găsite %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:407
+#, 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:411
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:418
+#, c-format
+msgid "No Plasma resources are available for %s support."
+msgstr "Nu sunt disponibile resurse Plasma pentru suportul lui %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:422
+#, 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 adiționale pot fi găsite %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:429
+#, 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:433
+#, 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 despre cum să obțineți un driver cu "
+"suport pentru această imprimantă pot fi găsite %s."
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:477
+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 application name, which requested the codecs, the third %s is a link titled "the documentation"
+#: src/gs-extras-page.c:483
+#, 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:492
+#, 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:562 src/gs-extras-page.c:618 src/gs-extras-page.c:657
+#, 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:848
+#, c-format
+msgid "%s file format"
+msgstr "format fișier %s"
+
+#: src/gs-extras-page.c:1223
+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 "Pagină de codecuri"
+
+#: src/gs-featured-carousel.ui:43
+msgid "Previous"
+msgstr "Anteriorul"
+
+#: src/gs-featured-carousel.ui:73
+msgid "Next"
+msgstr "Următorul"
+
+#: src/gs-featured-carousel.ui:100
+msgid "Featured Apps List"
+msgstr "Lista de aplicații recomandate"
+
+#: src/gs-first-run-dialog.ui:10
+msgid "Welcome"
+msgstr "Bun venit"
+
+#: src/gs-first-run-dialog.ui:27
+msgid "Welcome to Software"
+msgstr "Bun venit la Aplicații"
+
+#: src/gs-first-run-dialog.ui:28
+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 ""
+"Aplicații vă permite să instalați toate aplicațiile de care aveți nevoie, "
+"dintr-un singur loc. Vedeți recomandările noastre, aruncați o privire în "
+"categorii, sau pur și simplu căutați aplicația pe care o doriți."
+
+#: src/gs-first-run-dialog.ui:31
+msgid "_Browse Software"
+msgstr "_Navigați aplicații"
+
+#: src/gs-hardware-support-context-dialog.c:561
+#: src/gs-hardware-support-context-dialog.c:570
+msgid "Desktop Support"
+msgstr "Suport pentru desktop"
+
+#: src/gs-hardware-support-context-dialog.c:562
+#: src/gs-hardware-support-context-dialog.c:571
+msgid "Supports being used on a large screen"
+msgstr "Suportă utilizarea pe un ecran mare"
+
+#: src/gs-hardware-support-context-dialog.c:564
+msgid "Desktop Support Unknown"
+msgstr "Suport pentru desktop necunoscut"
+
+#: src/gs-hardware-support-context-dialog.c:565
+msgid "Not enough information to know if large screens are supported"
+msgstr ""
+"Nu sunt destule informații pentru a afla dacă ecranele mari sunt suportate"
+
+#: src/gs-hardware-support-context-dialog.c:568
+msgid "Requires a large screen"
+msgstr "Necesită un ecran mare"
+
+#: src/gs-hardware-support-context-dialog.c:573
+msgid "Desktop Not Supported"
+msgstr "Desktopul nu este suportat"
+
+#: src/gs-hardware-support-context-dialog.c:574
+msgid "Cannot be used on a large screen"
+msgstr "Nu poate fi folosit pe un ecran mare"
+
+#: src/gs-hardware-support-context-dialog.c:581
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Mobile Support"
+msgstr "Suport mobil"
+
+#: src/gs-hardware-support-context-dialog.c:582
+#: src/gs-hardware-support-context-dialog.c:591
+msgid "Supports being used on a small screen"
+msgstr "Suportă utilizarea pe un ecran mic"
+
+#: src/gs-hardware-support-context-dialog.c:584
+msgid "Mobile Support Unknown"
+msgstr "Suport pentru mobil necunoscut"
+
+#: src/gs-hardware-support-context-dialog.c:585
+msgid "Not enough information to know if small screens are supported"
+msgstr ""
+"Nu sunt destule informații pentru a afla dacă ecranele mici sunt suportate"
+
+#: src/gs-hardware-support-context-dialog.c:588
+msgid "Requires a small screen"
+msgstr "Necesită un ecran min"
+
+#: src/gs-hardware-support-context-dialog.c:593
+msgid "Mobile Not Supported"
+msgstr "Mobilul nu este suportat"
+
+#: src/gs-hardware-support-context-dialog.c:594
+msgid "Cannot be used on a small screen"
+msgstr "Nu poate fi folosit pe un ecran mic"
+
+#: src/gs-hardware-support-context-dialog.c:617
+#: src/gs-hardware-support-context-dialog.c:626
+msgid "Keyboard Support"
+msgstr "Suport tastatură"
+
+#: src/gs-hardware-support-context-dialog.c:620
+msgid "Keyboard Support Unknown"
+msgstr "Suport pentru tastatură necunoscut"
+
+#: src/gs-hardware-support-context-dialog.c:621
+msgid "Not enough information to know if keyboards are supported"
+msgstr ""
+"Nu sunt destule informații pentru a afla dacă tastaturile sunt suportate"
+
+#: src/gs-hardware-support-context-dialog.c:623
+msgid "Keyboard Required"
+msgstr "Tastatură necesară"
+
+#: src/gs-hardware-support-context-dialog.c:627
+msgid "Supports keyboards"
+msgstr "Suportă tastaturile"
+
+#: src/gs-hardware-support-context-dialog.c:629
+msgid "Keyboard Not Supported"
+msgstr "Tastatură nu este suportată"
+
+#: src/gs-hardware-support-context-dialog.c:630
+msgid "Cannot be used with a keyboard"
+msgstr "Nu poate fi folosit cu o tastatură"
+
+#: src/gs-hardware-support-context-dialog.c:637
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Mouse Support"
+msgstr "Suport maus"
+
+#: src/gs-hardware-support-context-dialog.c:638
+#: src/gs-hardware-support-context-dialog.c:644
+msgid "Requires a mouse or pointing device"
+msgstr "Necesită un maus sau dispozitiv de inticare"
+
+#: src/gs-hardware-support-context-dialog.c:640
+msgid "Mouse Support Unknown"
+msgstr "Suport pentru maus necunoscut"
+
+#: src/gs-hardware-support-context-dialog.c:641
+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 suportate"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Mouse Required"
+msgstr "Este necesar un maus"
+
+#: src/gs-hardware-support-context-dialog.c:647
+msgid "Supports mice and pointing devices"
+msgstr "Suportă mausuri și dispozitive de indicare"
+
+#: src/gs-hardware-support-context-dialog.c:649
+msgid "Mouse Not Supported"
+msgstr "Mausul nu este suportat"
+
+#: src/gs-hardware-support-context-dialog.c:650
+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:657
+#: src/gs-hardware-support-context-dialog.c:666
+msgid "Touchscreen Support"
+msgstr "Suport ecran tactil"
+
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Touchscreen Support Unknown"
+msgstr "Suport pentru ecran tactil necunoscut"
+
+#: src/gs-hardware-support-context-dialog.c:661
+msgid "Not enough information to know if touchscreens are supported"
+msgstr ""
+"Nu sunt destule informații pentru a afla dacă ecranele tactile sunt suportate"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Touchscreen Required"
+msgstr "Este necesar un ecran tactil"
+
+#: src/gs-hardware-support-context-dialog.c:667
+msgid "Supports touchscreens"
+msgstr "Suportă ecranele tactile"
+
+#: src/gs-hardware-support-context-dialog.c:669
+msgid "Touchscreen Not Supported"
+msgstr "Ecranul tactil nu este suportat"
+
+#: src/gs-hardware-support-context-dialog.c:670
+msgid "Cannot be used with a touchscreen"
+msgstr "Nu poate fi folosită cu un ecran tactil"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Gamepad Required"
+msgstr "Este necesar un controller de jocuri"
+
+#: src/gs-hardware-support-context-dialog.c:684
+msgid "Requires a gamepad"
+msgstr "Necesită un controller de jocuri"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Gamepad Support"
+msgstr "Suport pentru controllere de jocuri"
+
+#: src/gs-hardware-support-context-dialog.c:687
+msgid "Supports gamepads"
+msgstr "Suportă controller 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:696
+#, c-format
+msgid "%s probably works on this device"
+msgstr "%s probabil funcționează pe acest dispozitiv"
+
+#. Translators: The app will work on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:703
+#, c-format
+msgid "%s works on this device"
+msgstr "%s funcționează pe acest dispozitiv"
+
+#. Translators: The app may not work fully on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:710
+#, c-format
+msgid "%s will not work properly on this device"
+msgstr "%s nu va funcționa adecvat pe acest dispozitiv"
+
+#. Translators: The app will not work properly on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:717
+#, c-format
+msgid "%s will not work on this device"
+msgstr "%s nu va funcționa pe acest dispozitiv"
+
+#. 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:9
+msgid "Hardware Support"
+msgstr "Suport hardware"
+
+#: src/gs-installed-page.ui:7
+msgid "Installed page"
+msgstr "Pagină instalată"
+
+#: src/gs-installed-page.ui:54
+msgid "In Progress"
+msgstr "În derulare"
+
+#. 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:100
+msgid "Applications"
+msgstr "Aplicații"
+
+#: src/gs-installed-page.ui:98
+msgid "System Applications"
+msgstr "Aplicații de sistem"
+
+#: src/gs-license-tile.c:93
+msgid "Community Built"
+msgstr "Generat de comunitate"
+
+#. Translators: The placeholder here is the name of a software license.
+#: src/gs-license-tile.c:101
+#, 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 ""
+"Această aplicație este dezvoltată deschis de o comunitate de voluntari, și "
+"este lansată sub licența %s.\n"
+"\n"
+"Puteți contribui și ajuta la îmbunătățirea ei."
+
+#: src/gs-license-tile.c:106
+msgid "Proprietary"
+msgstr "Proprietar"
+
+#: src/gs-license-tile.c:113
+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."
+msgstr ""
+"Această aplicație nu este dezvoltată deschis, așadar numai dezvoltatorii ei "
+"știu cum funcționează. Pot fi restricții de folosire, și poate fi greu de "
+"spus dacă aplicația este nesigură.\n"
+"\n"
+"Nu puteți contribui la această aplicație, nici nu puteți să-i influențați "
+"dezvoltarea."
+
+#: src/gs-license-tile.ui:132
+msgid "_Get Involved"
+msgstr "_Implicați-vă"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:62 src/gs-loading-page.c:66
+msgid "Software catalog is being downloaded"
+msgstr "Catalogul de aplicații se descarcă"
+
+#: src/gs-loading-page.ui:7
+msgid "Loading page"
+msgstr "Pagina de încărcate"
+
+#: src/gs-loading-page.ui:14
+msgid "Starting up…"
+msgstr "Se pornește…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-metered-data-dialog.ui:17
+#: src/gs-shell.ui:264
+msgid "Automatic Updates Paused"
+msgstr "Actualizări automate puse pe pauză"
+
+#: 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 ""
+"Rețeaua curentă este contorizată. Conexiunile contorizate au limite de date "
+"sau taxe asociate lor. Pentru a salva date, actualizările automate au fost "
+"puse pe pauză.\n"
+"\n"
+"Actualizările automate vor fi restaurate când o rețea necontorizată devine "
+"disponibilă. Până atunci încă este posibil să instalați actualizări manual.\n"
+"\n"
+"Alternativ, dacă rețeaua curentă a fost incorect identificată ca fiind "
+"contorizată, această configurare poate fi modificată."
+
+#: src/gs-metered-data-dialog.ui:53
+msgid "Open Network _Settings"
+msgstr "Deschide _Configurări de rețea"
+
+#: src/gs-moderate-page.ui:7
+msgid "Moderate page"
+msgstr "Moderează pagina"
+
+#: src/gs-moderate-page.ui:87
+msgid "There are no reviews to moderate"
+msgstr "Nu există recenzii de moderat"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-odrs-provider.c:1266
+msgid "Downloading application ratings…"
+msgstr "Se descarcă evaluările aplicațiiei…"
+
+#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm"
+#: src/gs-origin-popover-row.c:55
+msgid "Name"
+msgstr "Nume"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:72
+msgid "system"
+msgstr "sistem"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:75
+msgid "user"
+msgstr "utilizator"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-origin-popover-row.c:91
+msgid "Channel"
+msgstr "Canal"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:96 src/gs-origin-popover-row.ui:93
+msgid "Branch"
+msgstr "Ramură"
+
+#: src/gs-origin-popover-row.ui:35
+msgid "URL"
+msgstr "URL"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:64
+msgid "Installation"
+msgstr "Loc de instalare"
+
+#. Translators: The available version of an app
+#: src/gs-origin-popover-row.ui:122
+msgid "Version"
+msgstr "Versiune"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:272
+msgid "Additions"
+msgstr "Adiții"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:276
+msgid "Removals"
+msgstr "Eliminări"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gs-os-update-page.c:280 src/gs-shell.ui:339 src/gs-updates-page.c:1356
+msgid "Updates"
+msgstr "Actualizări"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:284
+msgid "Downgrades"
+msgstr "Retrogradări"
+
+#. 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:697
+msgid "selected external sources"
+msgstr "surse externe selectate"
+
+#. Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link.
+#: src/gs-overview-page.c:699
+#, c-format
+msgid ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+msgstr ""
+"Oferă accesul la programe adiționale de la %s. Unele aplicații proprietare "
+"sunt incluse."
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:708 src/gs-repos-dialog.c:198
+msgid "Enable"
+msgstr "Activează"
+
+#. 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:763 src/gs-shell.ui:306
+msgid "Explore"
+msgstr "Explorează"
+
+#: src/gs-overview-page.ui:8
+msgid "Overview page"
+msgstr "Pagina cu prezentarea de ansamblu"
+
+#: src/gs-overview-page.ui:40
+msgid "Enable Third Party Software Repositories?"
+msgstr "Activați depozitele terțe de aplicații?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:175
+msgid "Other Categories"
+msgstr "Alte categorii"
+
+#: src/gs-overview-page.ui:239
+msgid "No Application Data Found"
+msgstr "Nu s-au găsit datele aplicației"
+
+#: lib/gs-plugin-loader.c:3023
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Necunoscut"
+
+#: src/gs-page.c:276
+msgid "User declined installation"
+msgstr "Utilizatorul a refuzat instalarea"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:356
+#, 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:492
+#, 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
+#: src/gs-page.c:496
+#, c-format
+msgid ""
+"All applications from %s will be uninstalled, and you will have to re-"
+"install the repository to use them again."
+msgstr ""
+"Toate aplicațiile din %s vor fi eliminate și va fi necesar să reinstalați "
+"depozitul pentru a-l folosi din nou."
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:504
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Sigur doriți să dezinstalați %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:507
+#, c-format
+msgid ""
+"%s will be uninstalled, and you will have to install it to use it again."
+msgstr ""
+"%s va fi eliminată și va fi necesar să o reinstalați pentru a o utiliza din "
+"nou."
+
+#. Translators: This is the accessibility label for a screenshot.
+#: src/gs-picture.c:391
+msgid "Picture"
+msgstr "Imagine"
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Preferințe actualizare"
+
+#: src/gs-prefs-dialog.ui:18
+msgid ""
+"To avoid charges and network caps, software updates are not automatically "
+"downloaded on mobile or metered connections."
+msgstr ""
+"Pentru a evita costurile și limitele de rețea, actualizările automate sunt "
+"dezactivate când sunteți pe o conexiune mobilă sau contorizată."
+
+#: src/gs-prefs-dialog.ui:22
+msgid "Automatic Updates"
+msgstr "Actualizări automate"
+
+#: src/gs-prefs-dialog.ui:23
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Descarcă și instalează aplicații în fundal, când este posibil."
+
+#: src/gs-prefs-dialog.ui:37
+msgid "Automatic Update Notifications"
+msgstr "Notificări pentru actualizări automate"
+
+#: src/gs-prefs-dialog.ui:38
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Arată notificări când au fost instalate automat actualizări."
+
+#. 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:110
+#, 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 ""
+"Unele dintre programele instalate curent nu sunt compatibile cu %s. Dacă "
+"continuați, următoarele vor fi eliminate automat în timpul înnoirii:"
+
+#: src/gs-removal-dialog.ui:23
+msgid "Incompatible Software"
+msgstr "Aplicații necompatibile"
+
+#: src/gs-removal-dialog.ui:36
+msgid "_Continue"
+msgstr "_Continuă"
+
+#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64"
+#: src/gs-repos-dialog.c:265
+#, c-format
+msgid "Software that has been installed from “%s” will cease receive updates."
+msgstr ""
+"Aplicațiile care au fost instalate din „%s” nu vor mai primi actualizări."
+
+#: src/gs-repos-dialog.c:274
+msgid "Disable Repository?"
+msgstr "Dezactivați depozitul?"
+
+#: src/gs-repos-dialog.c:274
+msgid "Remove Repository?"
+msgstr "Eliminați depozitul?"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:280
+msgid "_Disable"
+msgstr "_Dezactivează"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:283
+msgid "_Remove"
+msgstr "_Elimină"
+
+#: src/gs-repos-dialog.c:597
+msgid "Enable New Repositories"
+msgstr "Activează noi depozite"
+
+#: src/gs-repos-dialog.c:598
+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:607
+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:612
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Depozite adiționale din părțile terțe selectate — %s."
+
+#: src/gs-repos-dialog.c:617
+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:823
+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:880
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Aceste depozite suplimentează aplicațiile implicite oferite de %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:10 src/gs-shell.ui:77 src/gs-update-dialog.ui:10
+msgid "Software Repositories"
+msgstr "Depozite aplicații"
+
+#: src/gs-repos-dialog.ui:50
+msgid "No Repositories"
+msgstr "Niciun depozit"
+
+#. TRANSLATORS: This string is used to construct the 'X applications
+#. installed' sentence, describing a software repository.
+#: src/gs-repo-row.c:155
+#, c-format
+msgid "%u application installed"
+msgid_plural "%u applications installed"
+msgstr[0] "%u aplicație instalată"
+msgstr[1] "%u aplicații instalate"
+msgstr[2] "%u de aplicații instalate"
+
+#. TRANSLATORS: This string is used to construct the 'X add-ons
+#. installed' sentence, describing a software repository.
+#: src/gs-repo-row.c:162
+#, 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 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:170
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+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 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:176
+#, 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 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:183
+#, 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"
+
+#. 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:232
+#, 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:82
+msgid "Hate it"
+msgstr "O urăsc"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:86
+msgid "Don’t like it"
+msgstr "Nu îmi place"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:90
+msgid "It’s OK"
+msgstr "Este OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:94
+msgid "Like it"
+msgstr "Îmi place"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:98
+msgid "Love it"
+msgstr "O iubesc"
+
+#. TRANSLATORS: the review can't just be copied and pasted
+#: src/gs-review-dialog.c:120
+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:124
+msgid "Please choose a star rating"
+msgstr "Alegeți o stea de evaluare"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:128
+msgid "The summary is too short"
+msgstr "Rezumatul este prea scurt"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:132
+msgid "The summary is too long"
+msgstr "Rezumatul este prea lung"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:136
+msgid "The description is too short"
+msgstr "Descrierea este prea scurtă"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:140
+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:10
+msgid "Post Review"
+msgstr "Publicarea recenziei"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:34
+msgid "_Post"
+msgstr "_Publică"
+
+#: src/gs-review-dialog.ui:74
+msgid "Rating"
+msgstr "Evaluare"
+
+#: src/gs-review-dialog.ui:110
+msgid "Summary"
+msgstr "Rezumat"
+
+#: src/gs-review-dialog.ui:120
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Scrieți un scurt rezumat al recenziei dumneavoastră, de exemplu: „Aplicație "
+"extraordinară, o recomand”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:145
+msgctxt "app review"
+msgid "Review"
+msgstr "Recenzie"
+
+#: src/gs-review-dialog.ui:155
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+"Ce credeți despre această aplicație? Încercați să dați motive pentru "
+"punctele de vedere ale dumneavoastră."
+
+#: src/gs-review-dialog.ui:187
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+msgstr ""
+"Aflați care sunt datele trimise în <a href=\"https://odrs.gnome.org/privacy"
+"\">politica de confidențialitate</a>."
+
+#: 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:100
+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:58
+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:242
+msgid "Report Review?"
+msgstr "Raportați recenzia?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:246
+msgid "Report"
+msgstr "Raportează"
+
+#. Translators: Users can express their opinions about other users' opinions about the apps.
+#: src/gs-review-row.ui:89
+msgid "Was this review useful to you?"
+msgstr "A fost această recenzie utilă?"
+
+#: src/gs-review-row.ui:106
+msgid "Yes"
+msgstr "Da"
+
+#: src/gs-review-row.ui:115
+msgid "No"
+msgstr "Nu"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:124
+msgid "Meh"
+msgstr "Indiferent"
+
+#: src/gs-review-row.ui:135
+msgid "Report…"
+msgstr "Raportează…"
+
+#: src/gs-review-row.ui:148
+msgid "Remove…"
+msgstr "Elimină…"
+
+#: src/gs-safety-context-dialog.c:140
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Verificați dacă aveți încredere în furnizor, pentru că aplicația nu este "
+"izolată"
+
+#: src/gs-safety-context-dialog.c:143
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+"Aplicația nu sete izolată dar distribuția a verificat că nu este malițioasă"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:150
+msgid "No Permissions"
+msgstr "Nicio permisiune"
+
+#: src/gs-safety-context-dialog.c:151
+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:162
+msgid "Network Access"
+msgstr "Acces la rețea"
+
+#: src/gs-safety-context-dialog.c:163
+msgid "Can access the internet"
+msgstr "Pot accesa internetul"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:166
+msgid "No Network Access"
+msgstr "Nu are acces la rețea"
+
+#: src/gs-safety-context-dialog.c:167
+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:173
+msgid "Uses System Services"
+msgstr "Utilizează serviciile sistemului"
+
+#: src/gs-safety-context-dialog.c:174
+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:181
+msgid "Uses Session Services"
+msgstr "Utilizează serviciile sesiunii"
+
+#: src/gs-safety-context-dialog.c:182
+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:189
+msgid "Device Access"
+msgstr "Acces dispozitive"
+
+#: src/gs-safety-context-dialog.c:190
+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:193
+msgid "No Device Access"
+msgstr "Fără acces dispozitive"
+
+#: src/gs-safety-context-dialog.c:194
+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:200
+msgid "Legacy Windowing System"
+msgstr "Sistem de ferestre moștenit"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:208
+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:216
+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:228
+msgid "Full File System Read/Write Access"
+msgstr "Acces total la citirea/scrierea sistemului de fișiere"
+
+#: src/gs-safety-context-dialog.c:229
+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:237
+msgid "Home Folder Read/Write Access"
+msgstr "Acces la citirea/scrierea dosarului personal"
+
+#: src/gs-safety-context-dialog.c:238
+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:246
+msgid "Full File System Read Access"
+msgstr "Acces complet pentru citirea sistemului de fișiere"
+
+#: src/gs-safety-context-dialog.c:247
+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:256
+msgid "Home Folder Read Access"
+msgstr "Acces de citire a dosarului personal"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Download Folder Read/Write Access"
+msgstr "Acces de citire a dosarului „Descărcări”"
+
+#: src/gs-safety-context-dialog.c:267
+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:278
+msgid "Download Folder Read Access"
+msgstr "Acces de citire pentru dosarul Descărcări"
+
+#: src/gs-safety-context-dialog.c:279
+msgid "Can read all data in your downloads directory"
+msgstr "Poate să citească 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:292
+msgid "No File System Access"
+msgstr "Nu are acces la sistemul de fișiere"
+
+#: src/gs-safety-context-dialog.c:293
+msgid "Cannot access the file system at all"
+msgstr "Nu poate accesa sistemul de fișiere deloc"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:307
+msgid "Proprietary Code"
+msgstr "Cod proprietar"
+
+#: src/gs-safety-context-dialog.c:308
+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: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:311
+msgid "Auditable Code"
+msgstr "Cod verificabil"
+
+#: src/gs-safety-context-dialog.c:312
+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: 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:320
+msgid "App developer is verified"
+msgstr "Dezvoltatorul aplicației este verificat"
+
+#: src/gs-safety-context-dialog.c:321
+msgid "The developer of this app has been verified to be who they say they are"
+msgstr ""
+"Dezvoltatorul acestei aplicații a fost verificat să fie cine pretinde a fi"
+
+#. Translators: The app is considered safe to install and run.
+#. * The placeholder is the app name.
+#: src/gs-safety-context-dialog.c:330
+#, c-format
+msgid "%s is safe"
+msgstr "%s 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:337
+#, 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:344
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s este nesigură"
+
+#. Translators: This is the title of the dialog which contains information about the permissions of an app
+#: src/gs-safety-context-dialog.ui:9
+msgid "Safety"
+msgstr "Siguranță"
+
+#: src/gs-safety-context-dialog.ui:146
+msgid "License"
+msgstr "Licență"
+
+#: src/gs-safety-context-dialog.ui:232
+msgid "SDK"
+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:38
+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:75
+msgid "Next Screenshot"
+msgstr "Captură de ecran următoare"
+
+#: src/gs-screenshot-carousel.ui:142
+msgid "No screenshot provided"
+msgstr "Nicio captură de ecran pusă la dispoziție"
+
+#. TRANSLATORS: this is when we try to download a screenshot and
+#. * we get back 404
+#: src/gs-screenshot-image.c:345
+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:362
+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:504
+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:585
+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:595
+msgid "Screenshot not valid"
+msgstr "Captură de ecran nevalidă"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:615
+msgid "Screenshot not available"
+msgstr "Captură de ecran indisponibilă"
+
+#: src/gs-screenshot-image.c:694
+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:172
+#, 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:17
+msgid "Search for Apps"
+msgstr "Căutați aplicații"
+
+#: src/gs-search-page.ui:39
+msgid "No Application Found"
+msgstr "Nu a fost 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:1151 src/gs-shell.c:1156 src/gs-shell.c:1171
+#: src/gs-shell.c:1175
+#, 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:1221
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Nu s-au putut descărca actualizări de firmware 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:1227
+#, 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:1234 src/gs-shell.c:1279
+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:1240
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr ""
+"Nu s-au putut descărca actualizări: accesul la internet a fost necesar dar "
+"nu a fost disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1249
+#, 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:1254
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nu s-au putut descărca actualizări: spațiu insuficient pe disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1261
+msgid "Unable to download updates: authentication was required"
+msgstr "Nu s-au putut descărca actualizări: autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1266
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nu s-au putut descărca actualizări: autentificarea a fost nevalidă"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1271
+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:1282
+msgid "Unable to get list of updates"
+msgstr "Nu s-a putut obține lista de actualizări"
+
+#. 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:1324
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Nu s-a putut instala %s pentru că descărcarea de la %s a eșuat"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1330
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Nu s-a putut instala %s pentru că descărcarea a eșuat"
+
+#. 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:1343
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Nu s-a putut instala %s pentru că executantul %s nu este disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1349
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Nu s-a putut instala %s pentru că nu este suportat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1356
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Nu s-a putut instala: accesul la internet a fost necesar dar nu a fost "
+"disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1362
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nu s-a putut instala: aplicația are un format nevalid"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1367
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Nu s-a putut instala %s: spațiu insuficient pe disc"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1374
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Nu s-a putut instala %s: autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1381
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Nu s-a putut instala %s: autentificarea a fost nevalidă"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1388
+#, c-format
+msgid "Unable to install %s: you do not have permission to install software"
+msgstr "Nu s-a putut instal %s: nu aveți permisiunea de a instala aplicații"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1396
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Nu s-a putut instala %s: energie electrică necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1403
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Nu s-a putut instala %s: nivelul bateriei este prea scăzut"
+
+#. 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"
+msgstr "Nu s-a putut instala %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:1458
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Nu s-a putut actualiza %s din %s pentru că descărcarea a eșuat"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1465
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "Nu s-a putut actualiza %s pentru că descărcarea a eșuat"
+
+#. 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:1472
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Nu s-a putut instala actualizări din %s pentru că descărcarea a eșuat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1476
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nu s-au putut instala actualizările pentru că descărcarea a eșuat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1482
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Nu s-a putut actualiza: accesul la internet a fost necesar dar nu a fost "
+"disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1492
+#, 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
+#: src/gs-shell.c:1497
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Nu s-au putut instala actualizările: spațiu insuficient pe disc"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1507
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Nu s-a putut actualiza: %s autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1512
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Nu s-au putut instala actualizările: autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1521
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Nu s-a putut actualiza %s: autentificarea a fost nevalidă"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1526
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Nu s-au putut instala actualizările: autentificarea a fost nevalidă"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1535
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr ""
+"Nu s-a putut actualiza %s: nu aveți pemisiunea de a actualiza aplicații"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1541
+#, c-format
+msgid ""
+"Unable to install updates: you do not have permission to update software"
+msgstr ""
+"Nu s-a putut actualiza actualizările: nu aveți permisiunea de a actualiza "
+"aplicații"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1551
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Nu s-a putut actualiza %s: energie electrică este necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1557
+#, c-format
+msgid "Unable to install updates: AC power is required"
+msgstr "Nu s-au putut instala actualizările: energie electrică necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1566
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+msgstr "Nu s-a putut actualiza %s: nivelul bateriei este prea scăzut"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1572
+#, c-format
+msgid "Unable to install updates: The battery level is too low"
+msgstr "Nu s-au putut instala actualizările: nivelul bateriei este prea scăzut"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1583
+#, 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:1586
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nu s-au putut instala actualizări"
+
+#. 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:1628
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "Nu s-a putut înnoi la %s 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:1633
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Nu s-a putut înnoi la %s pentru că descărcarea a eșuat"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1642
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+msgstr ""
+"Nu s-a putut înnoi la %s: accesul la internet a fost necesar dar nu a fost "
+"disponibil"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1651
+#, c-format
+msgid "Unable to upgrade to %s: not enough disk space"
+msgstr "Nu s-a putut înnoi la %s: spațiu pe disc insuficient"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1659
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Nu s-a putut înnoi la %s: autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1666
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Nu s-a putut înnoi la %s: autentificarea a fost nevalidă"
+
+#. 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: you do not have permission to upgrade"
+msgstr "Nu s-a putut înnoi la %s: nu aveți permisiunea de a înnoi"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1680
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Nu s-a putut înnoi la %s: energie electrică necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1687
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+msgstr "Nu s-a putut înnoi la %s: nivelul bateriei este prea scăzut"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1696
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Nu s-a putut înnoi la %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1733
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Nu s-a putut elimina %s: autentificarea a fost necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1739
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Nu s-a putut elimina %s: autentificarea a fost nevalidă"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1745
+#, c-format
+msgid "Unable to remove %s: you do not have permission to remove software"
+msgstr "Nu s-a putut elimina %s: nu aveți pemisiunea de a elimina aplicații"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1752
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Nu s-a putut elimina %s: energie electrică este necesară"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1759
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Nu s-a putut elimina %s: nivelul bateriei este prea scăzut"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1771
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Nu s-a putut elimina %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:1813
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr "Nu s-a putut lansa %s: %s nu este instalat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1820 src/gs-shell.c:1871 src/gs-shell.c:1912
+#: src/gs-shell.c:1957
+msgid "Not enough disk space — 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 failed to get a proper error code
+#: src/gs-shell.c:1831 src/gs-shell.c:1882 src/gs-shell.c:1923
+#: src/gs-shell.c:1981
+msgid "Sorry, something went wrong"
+msgstr "Ne pare rău, ceva nu a funcționat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1863
+msgid "Failed to install file: not supported"
+msgstr "Nu s-a putut instala fișierul: nu este suportat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1867
+msgid "Failed to install file: authentication failed"
+msgstr "Eșec la instalarea fișierului: autentificare necesară"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1904
+msgid "Failed to install: not supported"
+msgstr "Nu s-a putut instala: nu este suportat"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1908
+msgid "Failed to install: authentication failed"
+msgstr "Nu s-a putut instala: autentificarea a eșuat"
+
+#. 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:1951
+#, 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 application, aka 'GNOME Software'.
+#: src/gs-shell.c:1963
+msgid "Software needs to be restarted 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:1968
+msgid "AC power is required"
+msgstr "Energia electrică este necesară"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1972
+msgid "The battery level is too low"
+msgstr "Nivelul bateriei este prea scăzut"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Depozite de aplicații"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "Preferințe act_ualizare"
+
+#: src/gs-shell.ui:21 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "Aplicații"
+
+#. button in the info bar
+#: src/gs-shell.ui:86
+msgid "Examine Disk"
+msgstr "Examinează discul"
+
+#. button in the info bar
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-shell.ui:95 src/gs-updates-page.c:906
+msgid "Network Settings"
+msgstr "Configurări de rețea"
+
+#. button in the info bar
+#: src/gs-shell.ui:104
+msgid "Restart Now"
+msgstr "Repornește acum"
+
+#. button in the info bar
+#: src/gs-shell.ui:113
+msgid "More Information"
+msgstr "Mai multe informații"
+
+#: src/gs-shell.ui:168
+msgid "Search"
+msgstr "Caută"
+
+#: src/gs-shell.ui:194
+msgid "Primary Menu"
+msgstr "Meniul principal"
+
+#: src/gs-shell.ui:284
+msgid "Find Out _More"
+msgstr "Aflați mai _multe"
+
+#. 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:93
+msgid "None"
+msgstr "Nespecificat"
+
+#: src/gs-storage-context-dialog.c:132
+msgid "Application Data"
+msgstr "Datele aplicațiilor"
+
+#: src/gs-storage-context-dialog.c:133
+msgid "Data needed for the application to run"
+msgstr "Date necesare pentru rularea aplicației"
+
+#: src/gs-storage-context-dialog.c:137
+msgid "User Data"
+msgstr "Datele utilizatorului"
+
+#: src/gs-storage-context-dialog.c:138
+msgid "Data created by you in the application"
+msgstr "Date creeate de dumneavoastră în aplicație"
+
+#: src/gs-storage-context-dialog.c:144
+msgid "Cache Data"
+msgstr "Date cache"
+
+#: src/gs-storage-context-dialog.c:145
+msgid "Temporary cached data"
+msgstr "Date stocate temporar"
+
+#: src/gs-storage-context-dialog.c:161
+msgid "The application itself"
+msgstr "Aplicația însăși"
+
+#: src/gs-storage-context-dialog.c:165
+msgid "Required Dependencies"
+msgstr "Dependințe necesare"
+
+#: src/gs-storage-context-dialog.c:166
+msgid "Shared system components required by this application"
+msgstr "Componentele partajate de sistem necesare pentru această aplicație"
+
+#. 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:9
+msgid "Storage"
+msgstr "Stocare"
+
+#. Translators: Please do not translate the markup or link href
+#: src/gs-storage-context-dialog.ui:117
+msgid ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Datele din cache pot fi curățate din <a href=\"dummy\">configurările "
+"_aplicației</a>."
+
+#: src/gs-summary-tile.c:74
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instalat)"
+
+#: src/gs-summary-tile.c:79
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Se instalează)"
+
+#: src/gs-summary-tile.c:84
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Se elimină)"
+
+#. 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:122
+#, 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:142
+msgid "Installed Updates"
+msgstr "Actualizări instalate"
+
+#: src/gs-update-dialog.ui:70
+msgid "No updates have been installed on this system."
+msgstr "Nu a fost instalată nicio actualizare pe acest sistem."
+
+#: src/gs-update-monitor.c:210
+msgid "Software Updates Are Out of Date"
+msgstr "Actualizările de aplicații nu mai sunt la curent"
+
+#: src/gs-update-monitor.c:211
+msgid "Please check for software updates."
+msgstr "Verifică după actualizări pentru aplicații."
+
+#: src/gs-update-monitor.c:217
+msgid "Critical Software Update Ready to Install"
+msgstr "Actualizare critică a aplicației este gata pentru instalare"
+
+#: src/gs-update-monitor.c:218
+msgid "An important software update is ready to be installed."
+msgstr "O actualizare importantă de aplicație este gata de instalat."
+
+#: src/gs-update-monitor.c:221
+msgid "Critical Software Updates Available to Download"
+msgstr "Sunt disponibile pentru descărcat actualizări critice ale aplicațiilor"
+
+#: src/gs-update-monitor.c:222
+msgid "Important: critical software updates are waiting."
+msgstr "Important: actualizări critice pentru programe sunt în așteptare."
+
+#: src/gs-update-monitor.c:230
+msgid "Software Updates Ready to Install"
+msgstr "Actualizări pentru aplicații sunt gata de instalare"
+
+#: src/gs-update-monitor.c:231
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Actualizări de aplicații sunt în așteptare și gata de instalat."
+
+#: src/gs-update-monitor.c:236
+msgid "Software Updates Available to Download"
+msgstr "Actualizări aplicațiilor sunt disponibile pentru descărcat"
+
+#: src/gs-update-monitor.c:237
+msgid "Please download waiting software updates."
+msgstr "Descărcați actualizările de aplicații în așteptare."
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:343
+#, c-format
+msgid "%u Application Updated — Restart Required"
+msgid_plural "%u Applications Updated — Restart Required"
+msgstr[0] "%u aplicație actualizată — Necesită repornirea"
+msgstr[1] "%u aplicații actualizate — Necesită repornirea"
+msgstr[2] "%u de aplicații actualizate — Necesită repornirea"
+
+#. TRANSLATORS: apps were auto-updated
+#: src/gs-update-monitor.c:349
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u aplicație actualizată"
+msgstr[1] "%u aplicații actualizate"
+msgstr[2] "%u de aplicații actualizate"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:360
+#, c-format
+msgid "%s has been updated."
+msgstr "%s a fost actualizată."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:363
+msgid "Please restart the application."
+msgstr "Reporniți aplicația."
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:371
+#, c-format
+msgid "%s and %s have been updated."
+msgstr "%s și %s au fost actualizate."
+
+#. TRANSLATORS: at least one application needs restarting
+#: src/gs-update-monitor.c:377 src/gs-update-monitor.c:396
+#, c-format
+msgid "%u application requires a restart."
+msgid_plural "%u applications require a restart."
+msgstr[0] "%u aplicație necesită repornirea."
+msgstr[1] "%u aplicații necesită repornirea."
+msgstr[2] "%u de aplicații necesită repornirea."
+
+#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox
+#: src/gs-update-monitor.c:389
+#, c-format
+msgid "Includes %s, %s and %s."
+msgstr "Include %s, %s și %s."
+
+#. TRANSLATORS: this is when the current OS version goes end-of-life
+#: src/gs-update-monitor.c:656 src/gs-updates-page.ui:43
+msgid "Operating System Updates Unavailable"
+msgstr "Sunt disponibile actualizări de sistem"
+
+#. TRANSLATORS: this is the message dialog for the distro EOL notice
+#: src/gs-update-monitor.c:658
+msgid "Upgrade to continue receiving security updates."
+msgstr "Înnoiți sistemul pentru a continua să primiți actualizări."
+
+#. TRANSLATORS: this is a distro upgrade, the replacement would be the
+#. * distro name, e.g. 'Fedora'
+#: src/gs-update-monitor.c:713
+#, 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:717
+msgid "Software Upgrade Available"
+msgstr "Înnoire de aplicații dispobilă"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1114
+msgid "Software Updates Failed"
+msgstr "Actualizarea aplicațiilor a eșuat"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:1116
+msgid "An important OS update failed to be installed."
+msgstr "Instalarea unei actualizări importante a SO e eșuat."
+
+#: src/gs-update-monitor.c:1117
+msgid "Show Details"
+msgstr "Arată detalii"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1140
+msgid "System Upgrade Complete"
+msgstr "Înnoirea sistemului completă"
+
+#. 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:1145
+#, 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:1151
+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:1155
+msgid "An important OS update has been installed."
+msgid_plural "Important OS updates have been installed."
+msgstr[0] "O actualizare importantă a SO a fost instalată."
+msgstr[1] "Actualizări importante ale SO au fost instalate."
+msgstr[2] "Actualizări importante ale SO au fost instalate."
+
+#. 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:1166
+msgctxt "updates"
+msgid "Review"
+msgstr "Recenzează"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1215
+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:1221
+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:1226
+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:1232
+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 a fost indisponibil. 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:1238
+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:1244
+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:1249
+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 ""
+"Ne pare rău: instalarea actualizării a eșuat. Așteptați o altă actualizare "
+"și încercați din nou. Dacă problema persistă, contactați furnizorul "
+"dumneavoastră de aplicații."
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: src/gs-updates-page.c:251
+#, c-format
+msgid "Last checked: %s"
+msgstr "Ultima verificare: %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:576
+#, c-format
+msgid "%s %s is no longer supported."
+msgstr "%s %s nu mai este suportat."
+
+#. TRANSLATORS: OS refers to operating system, e.g. Fedora
+#: src/gs-updates-page.c:581
+msgid "Your OS is no longer supported."
+msgstr "SO-ul dumneavoastră nu mai este suportat."
+
+#. TRANSLATORS: EOL distros do not get important updates
+#: src/gs-updates-page.c:586
+msgid "This means that it does not receive security updates."
+msgstr "Aceasta înseamnă că nu mai primește actualizări de securitate."
+
+#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26
+#: src/gs-updates-page.c:590
+msgid "It is recommended that you upgrade to a more recent version."
+msgstr "Este recomandat să înnoiți la o versiune mai recentă."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:874
+msgid "Charges May Apply"
+msgstr "Se pot aplica taxe"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:878
+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:882
+msgid "Check _Anyway"
+msgstr "Verifică _oricum"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:898
+msgid "No Network"
+msgstr "Nicio rețea"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:902
+msgid "Internet access is required to check for updates."
+msgstr ""
+"Este necesară o conexiune la internet pentru a putea verifica dacă există "
+"actualizări."
+
+#: src/gs-updates-page.c:1290
+msgid "Checking…"
+msgstr "Se verifică…"
+
+#: src/gs-updates-page.c:1313
+msgid "Check for updates"
+msgstr "Caută 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:96
+msgid "Loading Updates…"
+msgstr "Se încarcă actualizările…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:110
+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:222
+msgid "Up to Date"
+msgstr "Actualizat"
+
+#: src/gs-updates-page.ui:263
+msgid "Use Mobile Data?"
+msgstr "Utilizați datele mobile?"
+
+#: src/gs-updates-page.ui:264
+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ă vă poate "
+"determina costuri."
+
+#: src/gs-updates-page.ui:267
+msgid "_Check Anyway"
+msgstr "Verifi_că oricum"
+
+#: src/gs-updates-page.ui:282
+msgid "No Connection"
+msgstr "Nu există conexiune"
+
+#: src/gs-updates-page.ui:283
+msgid "Go online to check for updates."
+msgstr "Mergeți online pentru a verifica actualizările."
+
+#: src/gs-updates-page.ui:286
+msgid "_Network Settings"
+msgstr "Preferi_nțe de rețea"
+
+#: src/gs-updates-page.ui:312
+msgid "Error"
+msgstr "Eroare"
+
+#: src/gs-updates-page.ui:313
+msgid "Updates are automatically managed."
+msgstr "Actualizările sunt gestionate automat."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:334
+msgid "Restart & Update"
+msgstr "Repornește și actualizează"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:340
+msgid "Update All"
+msgstr "Actualizează toate"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:468
+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:473
+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:478
+msgid "Application Updates"
+msgstr "Actualizări pentru aplicații"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:483
+msgid "Device Firmware"
+msgstr "Microcod pentru dispozitive"
+
+#: src/gs-updates-section.ui:36 src/gs-upgrade-banner.ui:78
+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:86
+#, c-format
+msgid "%s %s Available"
+msgstr "%s %s disponibilă"
+
+#: src/gs-upgrade-banner.c:131
+msgid "Learn about the new version"
+msgstr "Aflați despre noua versiune"
+
+#: src/gs-upgrade-banner.c:151
+msgid "Downloading…"
+msgstr "Se descarcă…"
+
+#. 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:169
+#, 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:173
+#, 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 înnoire majoră cu funcționalități noi și revizuiri."
+
+#: src/gs-upgrade-banner.ui:213
+msgid "_Restart & Upgrade"
+msgstr "_Repornește și înnoiește"
+
+#: src/gs-upgrade-banner.ui:230
+msgid "Remember to back up data and files before upgrading."
+msgstr ""
+"Se recomandă să faceți o copie de siguranță a datelor și fișierelor înaintea "
+"înnoirii."
+
+#: 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 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;Surse;Instalează;Aplicații;Depozite,Preferințe;Instalare;"
+"Dezinstalare;Actualizare;Actualizări;"
+
+#. 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:56
+msgid "OS Updates"
+msgstr "Actualizări SO"
+
+#. TRANSLATORS: this is a longer description of the
+#. * "OS Updates" string
+#: plugins/core/gs-plugin-generic-updates.c:61
+msgid "Includes performance, stability and security improvements."
+msgstr "Include îmbunătățiri de performanță, stabilitate și securitate."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:41
+msgid "Downloading featured images…"
+msgstr "Se descarcă imaginile recomandărilor…"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:560
+msgid "Endless OS"
+msgstr "OS Endless"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:563
+msgid "An Endless OS update with new features and fixes."
+msgstr "O înnoire OS Endless cu funcționalități noi și revizuiri."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:824
+msgid "EOS update service could not fetch and apply the update."
+msgstr "Serviciul de actualizare EOS nu a putut aduce și aplica actualizarea."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:195
+msgid "Downloading upgrade information…"
+msgstr "Se descarcă informațiile de înnoire…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:314
+msgid ""
+"Upgrade for the latest features, performance and stability improvements."
+msgstr ""
+"Înnoiți pentru ultimele funcționalități și îmbunătățiri de performanță și "
+"stabilitate."
+
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:6
+msgid "Flatpak Support"
+msgstr "Suport pentru flatpak"
+
+#: plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in:7
+msgid "Flatpak is a framework for desktop applications on Linux"
+msgstr "Flatpak este o platformă pentru aplicații desktop în Linux"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1132
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Se obține metadatele pentru flatpak pentru %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3105
+#, c-format
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr "Eșec la rafinarea extensiei „%s”: %s"
+
+#: plugins/flatpak/gs-flatpak-utils.c:89
+msgid "User Installation"
+msgstr "Instalarea utilizatorului"
+
+#: plugins/flatpak/gs-flatpak-utils.c:89
+msgid "System Installation"
+msgstr "Instalarea sistemului"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:821
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Eșec la adăugarea la instalare pentru extensia „%s”: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:835
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Eșec la adăugarea la dezinstalare pentru extensia „%s”: %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 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:140
+#, 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:145
+#, 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:150
+#, 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:155
+#, 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:160
+#, 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:166
+#, 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:172
+#, c-format
+msgid "%s Thunderbolt Controller Update"
+msgstr "Actualizarea controler Thunderbolt %s"
+
+#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU
+#. * at system bootup
+#: plugins/fwupd/gs-fwupd-app.c:177
+#, 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:182
+#, 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:186
+#, c-format
+msgid "%s Battery Update"
+msgstr "%s Actualizarea stării bateriei"
+
+#. TRANSLATORS: camera can refer to the laptop internal
+#. * camera in the bezel or external USB webcam
+#: plugins/fwupd/gs-fwupd-app.c:191
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s Actualizarea camerei"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:195
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s Actualizare TPM"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:199
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s Actualizarea touchpad-ului"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:203
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s Actualizarea mausului"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:207
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%s Actualizarea tastaturii"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:716
+msgid "Downloading firmware update signature…"
+msgstr "Se descarcă semnătura pentru actualizarea de microcod…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:758
+msgid "Downloading firmware update metadata…"
+msgstr "Se descarcă metadate pentru actualizarea de microcod…"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1180
+msgid "Firmware"
+msgstr "Microcod"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Suport de înnoire microcod"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7
+msgid "Provides support for firmware upgrades"
+msgstr "Oferă suport pentru înnoiri de microcod"
+
+#: plugins/packagekit/gs-plugin-packagekit.c:301
+msgid "Packages"
+msgstr "Pachete"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2151
+msgid "Operating System (OSTree)"
+msgstr "Sistem de operare (OSTree)"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:239
+msgid "Snap Store"
+msgstr "Magazinul Snap"
+
+#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6
+msgid "Snap Support"
+msgstr "Suport 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"
+
+#~ msgid "Software has unknown permissions"
+#~ msgstr "Aplicația are permisiuni necunoscute"
+
+#~ msgid "Software comes from a trusted source"
+#~ msgstr "Aplicația provine dintr-o sursă sigură"
+
+#~ msgid "Unknown Permissions"
+#~ msgstr "Permisiuni necunoscute"
+
+#~ msgid "The permissions needed by this app aren’t known"
+#~ msgstr "Permisiunile necesare acestei aplicații nu sunt cunoscute"
+
+#~ msgid "App comes from a trusted source"
+#~ msgstr "Aplicația provine dintr-o sursă sigură"
+
+#~ msgid "Your distribution has verified that this app can be trusted"
+#~ msgstr ""
+#~ "Distribuția dumneavoastră a verificat dacă această aplicație este de "
+#~ "încredere"
+
+#~ msgid "Show the prompt to install nonfree software repositories"
+#~ msgstr "Arată dialogul de instalare al depzoitelor de aplicații nelibere"
+
+#~ msgid "Requires a specific screen size"
+#~ msgstr "Necesită o dimensiune de ecran specifică"
+
+#~ msgid "Not optimized for touch devices or phones"
+#~ msgstr "Nu este optimizat pentru dispozitive tactile sau telefoane"
+
+#~ msgid "Editor’s Picks"
+#~ msgstr "Sugerate"
+
+#~ msgid "Recently Updated"
+#~ msgstr "Actualizate recent"
+
+#~ msgid "Other Apps"
+#~ msgstr "Alte aplicații"
+
+#~ msgid "_Read More"
+#~ msgstr "_Citiți mai mult"
+
+#~ msgid "_Read Less"
+#~ msgstr "Citiți mai _puțin"
+
+#~ msgid "_Launch"
+#~ msgstr "_Lansează"
+
+#~ msgctxt "updated"
+#~ msgid "Never"
+#~ msgstr "Niciodată"
+
+#~ msgid "Localized in your Language"
+#~ msgstr "Localizat în limba dumneavoastră"
+
+#~ msgid "Release Activity"
+#~ msgstr "Activitate de lansare"
+
+#~ msgid "Developer"
+#~ msgstr "Dezvoltator"
+
+#~ msgctxt "app status"
+#~ msgid "Uninstalled"
+#~ msgstr "Dezinstalat"
+
+#~ msgctxt "app status"
+#~ msgid "Installed"
+#~ msgstr "Instalat"
+
+#~ msgctxt "app status"
+#~ msgid "Updated"
+#~ msgstr "Actualizat"
+
+#~ msgctxt "app status"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscut"
+
+#~ msgid "History"
+#~ msgstr "Istoric"
+
+#~ msgid "More…"
+#~ msgstr "Mai mult…"
+
+#~ msgid "Recommended Games"
+#~ msgstr "Jocuri recomandate"
+
+#~ msgid "Recommended Creation Applications"
+#~ msgstr "Aplicații de creare recomandate"
+
+#~ msgid "Recommended Work Applications"
+#~ msgstr "Aplicații de lucru recomandate"
+
+#~ msgid ""
+#~ "Some of this software is proprietary and therefore has restrictions on "
+#~ "use, sharing, and access to source code."
+#~ msgstr ""
+#~ "Unele dintre aceste aplicații sunt proprietare și de aceea au restricții "
+#~ "de utilizare și de acces la codul sursă."
+
+#~ msgid "Find out more…"
+#~ msgstr "Aflați mai multe…"
+
+#~ msgid "Recent Releases"
+#~ msgstr "Lansări recente"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "Eliminați „%s”?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "Dezactivați „%s”?"
+
+#~ msgid "Remove"
+#~ msgstr "Elimină"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Fără depozite adiționale"
+
+#~ msgid "_Enable"
+#~ msgstr "Activ_ează"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Elimină…"
+
+#~ msgid "_Disable…"
+#~ msgstr "_Dezactivează…"
+
+#~ msgid "Disabling"
+#~ msgstr "Se dezactivează"
+
+#~ msgid "Enabled"
+#~ msgstr "Activat"
+
+#~ msgid "Disabled"
+#~ msgstr "Dezactivat"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Bara laterală pentru navigație"
+
+#~ msgid "%s (needs attention)"
+#~ msgstr "%s (necesită atenție)"
+
+#~ msgid "_Remove All"
+#~ msgstr "_Elimină toate"
+
+#~ msgid "Setting Up Updates…"
+#~ msgstr "Se configurează actualizările…"
+
+#~ msgid "Looking for New Updates…"
+#~ msgstr "Se caută actualizări noi…"
+
+#~ msgid "_Restart Now"
+#~ msgstr "_Repornește acum"
+
+#~ msgid "Updates will be applied when the computer is restarted."
+#~ msgstr "Actualizările vor fi aplicate când calculatorul este repornit."
+
+#~ msgid "Waiting to Download %s %s"
+#~ msgstr "Se așteaptă să se descarce %s %s"
+
+#~ msgid "Downloading %s %s"
+#~ msgstr "Se descarcă %s %s"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s gata de instalare"
+
+#~ msgid "_Learn More"
+#~ msgstr "Află mai mu_lte"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#~ msgctxt "Menu of Add-ons"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#~ msgid "Audio & Video"
+#~ msgstr "Audio și video"
+
+#~ msgid "Developer Tools"
+#~ msgstr "Instrumente pentru dezvoltatori"
+
+#~ msgid "Education & Science"
+#~ msgstr "Educație și știință"
+
+#~ msgid "Games"
+#~ msgstr "Jocuri"
+
+#~ msgid "Graphics & Photography"
+#~ msgstr "Grafică și fotografie"
+
+#~ msgid "Productivity"
+#~ msgstr "Productivitate"
+
+#~ msgid "Communication & News"
+#~ msgstr "Comunicare și știri"
+
+#~ msgid "Reference"
+#~ msgstr "Referințe"
+
+#~ msgid "Utilities"
+#~ msgstr "Utilități"
+
+#~ msgid "Recommended Audio & Video Applications"
+#~ msgstr "Aplicații audio și video recomandate"
+
+#~ msgid "Recommended Productivity Applications"
+#~ msgstr "Aplicații de productivitate recomandate"
+
+#~ msgid "Featured %s"
+#~ msgstr "Recomandate din %s"
+
+#~ msgid "Show"
+#~ msgstr "Arată"
+
+#~ msgid "Subcategories filter menu"
+#~ msgstr "Meniul de filtrare al subcategoriilor"
+
+#~ msgid "Sort"
+#~ msgstr "Sortează"
+
+#~ msgid "Subcategories sorting menu"
+#~ msgstr "Meniul de sortare al subcategoriilor"
+
+#~ msgid ""
+#~ "Unable to determine which parts of the system this application accesses. "
+#~ "This is typical for older applications."
+#~ msgstr ""
+#~ "Nu s-a putut determina care părți ale sistemului sunt accesate de această "
+#~ "aplicație. Aceasta este tipic aplicațiilor mai vechi."
+
+#~ msgctxt "App permissions"
+#~ msgid "Low"
+#~ msgstr "Redus"
+
+#~ msgctxt "App permissions"
+#~ msgid "Medium"
+#~ msgstr "Mediu"
+
+#~ msgctxt "App permissions"
+#~ msgid "High"
+#~ msgstr "Ridicat"
+
+#~ msgctxt "App permissions"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscut"
+
+#~ msgid "Public domain"
+#~ msgstr "Domeniul public"
+
+#~ msgid "https://en.wikipedia.org/wiki/Public_domain"
+#~ msgstr "https://ro.wikipedia.org/wiki/Domeniul_public"
+
+#~ msgid "https://www.gnu.org/philosophy/free-sw"
+#~ msgstr "https://www.gnu.org/philosophy/free-sw.ro"
+
+#~ msgid "Users are bound by the following license:"
+#~ msgid_plural "Users are bound by the following licenses:"
+#~ msgstr[0] "Utilizatorii sunt limitați de următoarea licență:"
+#~ msgstr[1] "Utilizatorii sunt limitați de următoarele licențe:"
+#~ msgstr[2] "Utilizatorii sunt limitați de următoarele licențe:"
+
+#~ msgid "Sandboxed"
+#~ msgstr "Izolată"
+
+#~ msgid "Category"
+#~ msgstr "Categorie"
+
+#~ msgid "Free"
+#~ msgstr "Liberă"
+
+#~ msgctxt "Application license"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscut"
+
+#~ msgid ""
+#~ "This means that the software can be freely run, copied, distributed, "
+#~ "studied and modified."
+#~ msgstr ""
+#~ "Acesta înseamnă că programul poate fi rulat, copiat, distribuit, studiat "
+#~ "și modificat liber."
+
+#~ msgid "Proprietary Software"
+#~ msgstr "Programe proprietare"
+
+#~ 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 ""
+#~ "Aceasta înseamnă că programul este deținut de un individ sau o companie. "
+#~ "De multe ori sunt restricții la folosirea lui și de obicei codul sursă nu "
+#~ "poate fi accesat."
+
+#~ msgid "Unknown Software License"
+#~ msgstr "Licență software necunoscută"
+
+#~ msgid "The license terms of this software are unknown."
+#~ msgstr "Termenii licenței acestei aplicații sunt necunoscuți."
+
+#~ msgid "The application was rated this way because it features:"
+#~ msgstr ""
+#~ "Această aplicație a fost evaluată astfel pentru că pune în prim plan:"
+
+#~ msgid "No details were available for this rating."
+#~ msgstr "Niciun detaliu disponibil pentru această evaluare."
+
+#~ msgid "ratings in total"
+#~ msgstr "evaluări în total"
+
+#~ msgid "Software is up to date"
+#~ msgstr "Aplicațiile sunt actualizate"
+
+#~ msgid "ODRS is a service providing user reviews of applications"
+#~ msgstr ""
+#~ "ODRS este un serviciu ce oferă recenzii de aplicații pentru utilizatori"
+
+#~ msgid "Select All"
+#~ msgstr "Selectează tot"
+
+#~ msgid "Select None"
+#~ msgstr "Deselectează tot"
+
+#~ msgid "_Installed"
+#~ msgstr "_Instalat"
+
+#~ msgid "_Updates"
+#~ msgstr "Act_ualizări"
+
+#~ msgid "Cartoon characters in unsafe situations"
+#~ msgstr "Caractere animate în siutații nesigure"
+
+#~ msgid "Cartoon characters in aggressive conflict"
+#~ msgstr "Caractere animate în conflict agresiv"
+
+#~ msgid "Graphic violence involving cartoon characters"
+#~ msgstr "Violență grafică incluzând caractere animate"
+
+#~ msgid "Characters in unsafe situations easily distinguishable from reality"
+#~ msgstr "Caractere în situații nesigure recunoscute ușor din realitate"
+
+#~ msgid ""
+#~ "Characters in aggressive conflict easily distinguishable from reality"
+#~ msgstr "Caractere în conflict agresiv recunoscute ușor din realitate"
+
+#~ msgid "Graphic violence easily distinguishable from reality"
+#~ msgstr "Violență grafică recunoscută ușor din realitate"
+
+#~ msgid "Mildly realistic characters in unsafe situations"
+#~ msgstr "Caractere realistice moderate în situații nesigure"
+
+#~ msgid "Depictions of realistic characters in aggressive conflict"
+#~ msgstr "Descrieri ale unor caractere realistice în conflict agresiv"
+
+#~ msgid "Graphic violence involving realistic characters"
+#~ msgstr "Violență grafică incluzând caractere realistice"
+
+#~ msgid "No bloodshed"
+#~ msgstr "Fără vărsare de sânge"
+
+#~ msgid "Unrealistic bloodshed"
+#~ msgstr "Vărsare de sânge nerealistică"
+
+#~ msgid "Realistic bloodshed"
+#~ msgstr "Vărsare de sânge realistică"
+
+#~ msgid "Depictions of bloodshed and the mutilation of body parts"
+#~ msgstr "Descrieri de vărsare de sânge și mutilarea părților de corp"
+
+#~ msgid "Rape or other violent sexual behavior"
+#~ msgstr "Viol sau alt comportament sexual"
+
+#~ msgid "No references to alcohol"
+#~ msgstr "Fără referințe la băuturi alcoolice"
+
+#~ msgid "References to alcoholic beverages"
+#~ msgstr "Referințe la băuturi alcoolice"
+
+#~ msgid "Use of alcoholic beverages"
+#~ msgstr "Uz de băuturi alcoolice"
+
+#~ msgid "No references to illicit drugs"
+#~ msgstr "Fără referințe la droguri ilegale"
+
+#~ msgid "References to illicit drugs"
+#~ msgstr "Referințe la droguri ilegale"
+
+#~ msgid "Use of illicit drugs"
+#~ msgstr "Uz de droguri ilegale"
+
+#~ msgid "No references to tobacco products"
+#~ msgstr "Fără referințe la produse cu tutun"
+
+#~ msgid "References to tobacco products"
+#~ msgstr "Referințe la produse de tutun"
+
+#~ msgid "Use of tobacco products"
+#~ msgstr "Uz de produse de tutun"
+
+#~ msgid "No nudity of any sort"
+#~ msgstr "Fără nuditate de orice tip"
+
+#~ msgid "Brief artistic nudity"
+#~ msgstr "Scurtă nuditate artistică"
+
+#~ msgid "Prolonged nudity"
+#~ msgstr "Nuditate prelungită"
+
+#~ msgid "No references to or depictions of sexual nature"
+#~ msgstr "Fără referințe la sau descrieri de natură sexuală"
+
+#~ msgid "Provocative references or depictions"
+#~ msgstr "Referințe sau descrieri provocative"
+
+#~ msgid "Sexual references or depictions"
+#~ msgstr "Referințe sexuale sau descrieri"
+
+#~ msgid "Graphic sexual behavior"
+#~ msgstr "Comportament sexual grafic"
+
+#~ msgid "No profanity of any kind"
+#~ msgstr "Fără profanitate de orice tip"
+
+#~ msgid "Mild or infrequent use of profanity"
+#~ msgstr "Uz moderat sau nefrecvent de obscenitate"
+
+#~ msgid "Moderate use of profanity"
+#~ msgstr "Uz moderat de obscenitate"
+
+#~ msgid "Strong or frequent use of profanity"
+#~ msgstr "Uz puternic sau frecvent de obscenitate"
+
+#~ msgid "Slapstick humor"
+#~ msgstr "Umor ieftin"
+
+#~ msgid "Vulgar or bathroom humor"
+#~ msgstr "Umor vulgar"
+
+#~ msgid "Mature or sexual humor"
+#~ msgstr "Umor pentru adulți sau sexual"
+
+#~ msgid "No discriminatory language of any kind"
+#~ msgstr "Fără limbaj discriminator de orice tip"
+
+#~ msgid "Negativity towards a specific group of people"
+#~ msgstr "Negativitate referitor la un grup specific de oameni"
+
+#~ msgid "Discrimination designed to cause emotional harm"
+#~ msgstr "Discriminare destinată să cauzeze ofensă emoțională"
+
+#~ msgid "Explicit discrimination based on gender, sexuality, race or religion"
+#~ msgstr "Discriminare explicită bazată pe sex, sexualitate, rasă sau religie"
+
+#~ msgid "No advertising of any kind"
+#~ msgstr "Fără reclame de orice tip"
+
+#~ msgid "Product placement"
+#~ msgstr "Plasarea de produse"
+
+#~ msgid "Explicit references to specific brands or trademarked products"
+#~ msgstr ""
+#~ "Referințe explicite la mărci specifice sau produse de mărci înregistrate"
+
+#~ msgid "Users are encouraged to purchase specific real-world items"
+#~ msgstr ""
+#~ "Utilizatorii sunt încurajați să cumpere obiecte specifice din lumea reală"
+
+#~ msgid "No gambling of any kind"
+#~ msgstr "Fără jocuri de noroc de orice tip"
+
+#~ msgid "Gambling on random events using tokens or credits"
+#~ msgstr ""
+#~ "Jocuri de noroc la evenimente aleatorii folosind jetoane sau credite"
+
+#~ msgid "Gambling using “play” money"
+#~ msgstr "Jocuri de noroc folosind bani virtuali"
+
+#~ msgid "Gambling using real money"
+#~ msgstr "Jocuri de noroc folosind bani adevărați"
+
+#~ msgid "No ability to spend money"
+#~ msgstr "Fără abilitatea de a cheltui bani"
+
+#~ msgid "Users are encouraged to donate real money"
+#~ msgstr "Utilizatorii sunt încurajați să doneze bani adevărați"
+
+#~ msgid "Ability to spend real money in-app"
+#~ msgstr "Abilitatea de a cheltui bani reali în aplicație"
+
+#~ msgid "No way to chat with other users"
+#~ msgstr "Fără abilitatea de a discuta cu alți utilizatori"
+
+#~ msgid "User-to-user interactions without chat functionality"
+#~ msgstr "Interacțiuni utilizator-la-utilizator fără funcționalitate de chat"
+
+#~ msgid "Moderated chat functionality between users"
+#~ msgstr "Funcționalitate de chat moderat între utilizatori"
+
+#~ msgid "Uncontrolled chat functionality between users"
+#~ msgstr "Funcționalitate de chat necontrolat între utilizatori"
+
+#~ msgid "No way to talk with other users"
+#~ msgstr "Fără abilitatea de a vorbi cu alți utilizatori"
+
+#~ msgid "Uncontrolled audio or video chat functionality between users"
+#~ msgstr ""
+#~ "Funcționalitate de chat necontrolat audio sau video între utilizatori"
+
+#~ msgid "No sharing of social network usernames or email addresses"
+#~ msgstr ""
+#~ "Fără partajare de nume de utilizatori de rețele sociale sau adrese de "
+#~ "email"
+
+#~ msgid "Sharing social network usernames or email addresses"
+#~ msgstr ""
+#~ "Partajare de nume de utilizatori de rețele sociale sau adrese de email"
+
+#~ msgid "No sharing of user information with third parties"
+#~ msgstr "Fără partajarea informațiilor despre utilizatori cu părți terțe"
+
+#~ msgid "Checking for the latest application version"
+#~ msgstr "Verificare după ultima versiune de aplicație"
+
+#~ msgid "Sharing diagnostic data that does not let others identify the user"
+#~ msgstr ""
+#~ "Partajare de date diagnostice care nu permit altora identificarea "
+#~ "utilizatorului"
+
+#~ msgid "Sharing information that lets others identify the user"
+#~ msgstr ""
+#~ "Partajare de informații care permit altora identificarea utilizatorului"
+
+#~ msgid "No sharing of physical location with other users"
+#~ msgstr "Fără partajarea locației fizice cu alți utilizatori"
+
+#~ msgid "Sharing physical location with other users"
+#~ msgstr "Partajarea locației fizice cu alți utilizatori"
+
+#~ msgid "No references to homosexuality"
+#~ msgstr "Fără referințe la homosexualitate"
+
+#~ msgid "Indirect references to homosexuality"
+#~ msgstr "Referințe indirecte la homosexualitate"
+
+#~ msgid "Kissing between people of the same gender"
+#~ msgstr "Sărutarea între oameni de același sex"
+
+#~ msgid "Graphic sexual behavior between people of the same gender"
+#~ msgstr "Comportament sexual grafic între oameni de același sex"
+
+#~ msgid "No references to prostitution"
+#~ msgstr "Fără referințe la prostituție"
+
+#~ msgid "Indirect references to prostitution"
+#~ msgstr "Referințe indirecte la prostituție"
+
+#~ msgid "Direct references to prostitution"
+#~ msgstr "Referințe directe la prostituție"
+
+#~ msgid "Graphic depictions of the act of prostitution"
+#~ msgstr "Descrieri grafice ale actului de prostituție"
+
+#~ msgid "No references to adultery"
+#~ msgstr "Fără referințe la adulter"
+
+#~ msgid "Indirect references to adultery"
+#~ msgstr "Referințe indirecte la adulter"
+
+#~ msgid "Direct references to adultery"
+#~ msgstr "Referințe directe de adulter"
+
+#~ msgid "Graphic depictions of the act of adultery"
+#~ msgstr "Descrieri grafice ale actului de adulter"
+
+#~ msgid "Scantily clad human characters"
+#~ msgstr "Caractere umane îmbrăcate sumar"
+
+#~ msgid "Overtly sexualized human characters"
+#~ msgstr "Caractere umane sexualizate deschis"
+
+#~ msgid "No references to desecration"
+#~ msgstr "Fără referințe la profanare"
+
+#~ msgid "Depictions of or references to historical desecration"
+#~ msgstr "Descrieri de sau referințe la profanare istorică"
+
+#~ msgid "Depictions of modern-day human desecration"
+#~ msgstr "Descrieri de profanare umană modernă"
+
+#~ msgid "Graphic depictions of modern-day desecration"
+#~ msgstr "Descrieri grafice de profanare modernă"
+
+#~ msgid "No visible dead human remains"
+#~ msgstr "Fără rămășițe umane vizibile"
+
+#~ msgid "Visible dead human remains"
+#~ msgstr "Rămășițe umane vizibile"
+
+#~ msgid "Dead human remains that are exposed to the elements"
+#~ msgstr "Rămășițe umane are expuse elementelor"
+
+#~ msgid "Graphic depictions of desecration of human bodies"
+#~ msgstr "Descrieri grafice ale profanării corpurilor umane"
+
+#~ msgid "No references to slavery"
+#~ msgstr "Fără referințe la sclavagism"
+
+#~ msgid "Depictions of or references to historical slavery"
+#~ msgstr "Descrieri de sau referințe la sclavagismul istoric"
+
+#~ msgid "Depictions of modern-day slavery"
+#~ msgstr "Descrieri ale sclavagismului modern"
+
+#~ msgid "Graphic depictions of modern-day slavery"
+#~ msgstr "Descrieri grafice ale sclavagismului modern"
+
+#~ msgid "General"
+#~ msgstr "Generale"
+
+#~ msgid "ALL"
+#~ msgstr "TOATE"
+
+#~ msgid "Teen"
+#~ msgstr "Adolescenți"
+
+#~ msgid "Everyone 10+"
+#~ msgstr "Toată lumea 10+"
+
+#~ msgid "Everyone"
+#~ msgstr "Toată lumea"
+
+#~ msgid "Early Childhood"
+#~ msgstr "Copilărie timpurie"
+
+#~ msgctxt "version"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscută"
+
+#~ msgid "Released"
+#~ msgstr "Lansat"
+
+#~ msgid "Format"
+#~ msgstr "Format"
+
+#~ msgid "%R"
+#~ msgstr "%R"
+
+#~ msgid "%l:%M %p"
+#~ msgstr "%l:%M %p"
+
+#~ msgid "Yesterday, %R"
+#~ msgstr "Ieri, %R"
+
+#~ msgid "Yesterday, %l:%M %p"
+#~ msgstr "Ieri, %l:%M %p"
+
+#~ msgid "Three days ago"
+#~ msgstr "Acum trei zile"
+
+#~ msgid "Four days ago"
+#~ msgstr "Acum patru zile"
+
+#~ msgid "Five days ago"
+#~ msgstr "Acum cinci zile"
+
+#~ msgid "Six days ago"
+#~ msgstr "Acum șase zile"
+
+#~ msgid "Two weeks ago"
+#~ msgstr "Acum două săptămâni"
+
+#~ msgctxt "app status"
+#~ msgid "Removed"
+#~ msgstr "Eliminat"
+
+#~ msgid "Are you sure you want to remove %s?"
+#~ msgstr "Sigur doriți să eliminați %s?"
+
+#~ msgid "_Let’s Go Shopping"
+#~ msgstr "Să pornim _la cumpărături"
+
+#~ msgid "Security Updates Pending"
+#~ msgstr "Există actualizări de securitate în așteptare"
+
+#~ msgid "It is recommended that you install important updates now"
+#~ msgstr "Se recomandă să instalați actualizările importante acum"
+
+#~ msgid "Restart & Install"
+#~ msgstr "Repornește și instalează"
+
+#~ msgid "Important OS and application updates are ready to be installed"
+#~ msgstr ""
+#~ "Actualizări importante pentru SO și aplicații sunt gata de instalare"
+
+#~ msgid "View"
+#~ msgstr "Vizualizare"
+
+#~ msgid "Enable GNOME Shell extensions repository"
+#~ msgstr "Activează depozitul de extensii GNOME Shell"
+
+#~ msgid "this website"
+#~ msgstr "pe acest sit web"
+
+#~ msgid "This application needs to be restarted to use new plugins."
+#~ msgstr ""
+#~ "Această aplicație trebuie să fie repornită pentru a utiliza noile module."
+
+#~ msgid "About %s"
+#~ msgstr "Despre %s"
+
+#~ msgid "%s ME"
+#~ msgstr "ME %s"
+
+#~ msgid "Show the folder management UI"
+#~ msgstr "Arată UI pentru administratorul de dosare"
+
+#~ msgid "Folder Name"
+#~ msgstr "Nume dosar"
+
+#~ msgid "_Add"
+#~ msgstr "_Adaugă"
+
+#~ msgid "Add to Application Folder"
+#~ msgstr "Adaugă la dosarul de aplicații"
+
+#~ msgid "Top Rated"
+#~ msgstr "Evaluări de top"
+
+#~ msgid "Extension Settings"
+#~ msgstr "Configurări extensie"
+
+#~ msgid ""
+#~ "Extensions are used at your own risk. If you have any system problems, it "
+#~ "is recommended to disable them."
+#~ msgstr ""
+#~ "Extensiile sunt folosite pe propriul risc. Dacă aveți probleme de sitem, "
+#~ "este recomandat să le dezactivați."
+
+#~ msgid "Failed to load components"
+#~ msgstr "Nu s-au putut încărca componentele"
+
+#~ msgid "CSS validated OK!"
+#~ msgstr "CSS a fost validat OK!"
+
+#~ msgid "Failed to load file"
+#~ msgstr "Eșec la încărcarea fișierului"
+
+#~ msgid "Unsaved changes"
+#~ msgstr "Schimbări nesalvate"
+
+#~ msgid "The application list is already loaded."
+#~ msgstr "Lista de aplicații este deja încărcată."
+
+#~ msgid "Merge documents"
+#~ msgstr "Îmbină documente"
+
+#~ msgid "Throw away changes"
+#~ msgstr "Aruncă schimbările"
+
+#~ msgid "Open AppStream File"
+#~ msgstr "Deschide fișierul AppStream"
+
+#~ msgid "Save AppStream File"
+#~ msgstr "Salvează fișierul AppStream"
+
+#~ msgid "_Save"
+#~ msgstr "_Salvează"
+
+#~ msgid "Failed to save file"
+#~ msgstr "Eșec la salvarea fișierului"
+
+#~ msgid "%s banner design deleted."
+#~ msgstr "Designul bannerului pentru %s a fost șters."
+
+#~ msgid "Banner design deleted."
+#~ msgstr "Designul bannerului a fost șters."
+
+#~ msgid "The application list has unsaved changes."
+#~ msgstr "Lista de aplicații are modificări nesalvate."
+
+#~ msgid "Use verbose logging"
+#~ msgstr "Folosește înregistrarea detaliată"
+
+#~ msgid "GNOME Software Banner Designer"
+#~ msgstr "Designer de bannere GNOME"
+
+#~ msgid "No Designs"
+#~ msgstr "Fără designuri"
+
+#~ msgid "Error message here"
+#~ msgstr "Mesaj de eroare aici"
+
+#~ msgid "App ID"
+#~ msgstr "ID App"
+
+#~ msgid "Category Featured"
+#~ msgstr "Categoria recomandate"
+
+#~ msgid "Undo"
+#~ msgstr "Anulează"
+
+#~ msgid "Banner Designer"
+#~ msgstr "Designer de bannere"
+
+#~ msgid "New Banner"
+#~ msgstr "Banner nou"
+
+#~ msgid "Import from file"
+#~ msgstr "Importă din fișier"
+
+#~ msgid "Export to file"
+#~ msgstr "Exportă în fișier"
+
+#~ msgid "Delete Design"
+#~ msgstr "Șterge designul"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Actualizare SO"
+
+#~ msgid "Spacing"
+#~ msgstr "Spațiere"
+
+#~ msgid "The amount of space between children"
+#~ msgstr "Cantitatea de spațiu între copii"
+
+#~ msgid "Click on items to select them"
+#~ msgstr "Clic pe elemente pentru a le selecta"
+
+#~ msgid "Select"
+#~ msgstr "Selectează"
+
+#~ msgid "_Add to Folder…"
+#~ msgstr "_Adaugă la dosar…"
+
+#~ msgid "_Move to Folder…"
+#~ msgstr "_Mută în dosarul…"
+
+#~ msgid "_Remove from Folder"
+#~ msgstr "Șter_ge din dosar"
+
+#~ msgid "Featured Applications"
+#~ msgstr "Aplicații recomandate"
+
+#~ msgid "Design the featured banners for GNOME Software"
+#~ msgstr "Concepe bannerele recomandate pentru Aplicații GNOME"
+
+#~ msgid "AppStream;Software;App;"
+#~ msgstr "AppStream;Software;App;Program;Programe;Aplicații;"
+
+#~ msgctxt "Menu of Add-ons"
+#~ msgid "Shell Extensions"
+#~ msgstr "Extensii pentru Shell"
+
+#~ msgid "Web Apps Support"
+#~ msgstr "Suport pentru miniaplicații web"
+
+#~ msgid "Run popular web applications in a browser"
+#~ msgstr "Rulează aplicații web populare într-un navigator"
+
+#~ msgid "GNOME"
+#~ msgstr "GNOME"
+
+#~ msgid "GNOME Shell Extensions Repository"
+#~ msgstr "Depozitul de extensii pentru GNOME Shell"
+
+#~ msgid "Downloading shell extension metadata…"
+#~ msgstr "Se descarcă metadate pentru extensiile de shell…"
+
+#~ msgid "GNOME Shell Extension"
+#~ msgstr "Extensie pentru Shell-ul GNOME"
+
+#~ msgid "system-software-install"
+#~ msgstr "system-software-install"
+
+#~ msgid "_All"
+#~ msgstr "_Tot"
+
+#~ msgid "Sign In / Register…"
+#~ msgstr "Autentificare / Înregistrare…"
+
+#~ msgid "Continue"
+#~ msgstr "Continuă"
+
+#~ msgid "Use"
+#~ msgstr "Utilizează"
+
+#~ msgid "Add another…"
+#~ msgstr "Adaugă încă unul…"
+
+#~ msgid "Software catalog is being loaded"
+#~ msgstr "Catalogul de aplicații este încărcat"
+
+#~ msgid "%s will be installed, and you will be charged %s."
+#~ msgstr "%s va fi instalat, și dumneavoastră veți fi taxat cu %s."
+
+#~ msgid "A$%.2f"
+#~ msgstr "%.2fA$"
+
+#~ msgid "C$%.2f"
+#~ msgstr "%.2fC$"
+
+#~ 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 "Autentificat ca %s"
+
+#~ msgid "Sign in…"
+#~ msgstr "Autentificare…"
+
+#~ msgid "Sign out"
+#~ msgstr "Deautentificare"
+
+#~ msgid "Unable to purchase %s: authentication was required"
+#~ msgstr "Nu s-a putut cumpăra %s: autentificarea a fost necesară"
+
+#~ msgid "Unable to purchase %s: authentication was invalid"
+#~ msgstr "Nu s-a putut cumpăra %s: autentificarea a fost nevalidă"
+
+#~ msgid "Unable to purchase %s: no payment method setup"
+#~ msgstr "Nu s-a putut cumpăra %s: nicio metodă de plată stabilită"
+
+#~ msgid "Unable to purchase %s: payment was declined"
+#~ msgstr "Nu s-a putut cumpăra: %s plata a fost respinsă"
+
+#~ msgid "Unable to purchase %s"
+#~ msgstr "Nu s-a putut cumpăra %s"
+
+#~ msgid "org.gnome.Software"
+#~ msgstr "org.gnome.Software"
+
+#~ msgid "To continue, you need to use an Ubuntu One account."
+#~ msgstr "Pentru a continua, trebuie să folosiți un cont Ubuntu One."
+
+#~ msgid "To continue, you need to use your Ubuntu One account."
+#~ msgstr "Pentru a continua trebuie folosiți contul dumneavoastră Ubuntu One."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Show profiling information for the service"
+#~ msgstr "Arată informații de profil pentru acest serviciu"
+
+#~ msgid "To continue you need to sign in to %s."
+#~ msgstr "Pentru a continua trebuie să vă autentificați la %s."
+
+#~ msgid "Email address"
+#~ msgstr "Adresă email"
+
+#~ msgid "I have an account already"
+#~ msgstr "Am deja un cont"
+
+#~ msgid "I want to register for an account now"
+#~ msgstr "Vreau să mă înregistrez pentru un cont acum"
+
+#~ msgid "I have forgotten my password"
+#~ msgstr "Am uitat parola"
+
+#~ msgid "Sign in automatically next time"
+#~ msgstr "Autentifică-mă automat data viitoare"
+
+#~ msgid "Enter your one-time pin for two-factor authentication."
+#~ msgstr "Introduceți pin-ul pentru autentificarea în doi pași."
+
+#~ msgid "PIN"
+#~ msgstr "PIN"
+
+#~ msgid "Authenticate"
+#~ msgstr "Autentificare"
+
+#~ msgid "_About"
+#~ msgstr "_Despre"
+
+#~ msgid "_Quit"
+#~ msgstr "_Ieșire"
+
+#~ 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ții despre %s, precum și opțiuni despre cum să obțineți codecul "
+#~ "necesar redării acestui format pot fi găsite pe pagina web."
+
+#~ msgid "Your %s account has been suspended."
+#~ msgstr "Contul dumneavoastră %s a fost suspendat."
+
+#~ msgid "It is not possible to install software until this has been resolved."
+#~ msgstr ""
+#~ "Nu este posibil să instalați aplicații până când se rezolvă situația "
+#~ "curentă."
+
+#~ msgid "For more information, visit %s."
+#~ msgstr "Pentru mai multe informații, vizitați %s."
+
+#~ msgid "Unable to update %s from %s"
+#~ msgstr "Nu s-a putut instal %s din %s"
+
+#~ msgid "Downloading new updates…"
+#~ msgstr "Se descarcă noile actualizări…"
+
+#~ msgid "Downloading application page…"
+#~ msgstr "Se descarcă pagina aplicației…"
+
+#~ msgid "The ultimate entertainment platform from Valve"
+#~ msgstr "Platforma de divertisment supremă de la Valve"
+
+#~ msgid "Applications Updated"
+#~ msgstr "Aplicații actualizate"
+
+#~ msgid "Includes: ."
+#~ msgstr "Include:"
+
+#~ msgid "U_pdate All"
+#~ msgstr "Act_ualizează toate"
+
+#~ msgid "Restart & _Install"
+#~ msgstr "Repornește și _instalează"
+
+#~ msgid "Getting runtime source…"
+#~ msgstr "Se obține sursa de executare…"
+
+#~ msgid "Limba Support"
+#~ msgstr "Support pentru Limba"
+
+#~ msgid "Limba provides developers a way to easily create software bundles"
+#~ msgstr ""
+#~ "Limba oferă dezvotatorilor un mod de a creea ușor pachete de programe"
+
+#~ msgid "The list of extra sources that have been previously enabled"
+#~ msgstr "O listă de surse extra care au fost activate anterior"
+
+#~ msgid ""
+#~ "The list of sources that have been previously enabled when installing "
+#~ "third-party applications."
+#~ msgstr ""
+#~ "Lista de surse care a fost activată anterior când s-au instalat aplicații "
+#~ "terțe."
+
+#~ msgid "Show non-free software in search results"
+#~ msgstr "Arată programe nelibere în rezultatele căutării"
+
+#~ msgid "A list of non-free sources that can be optionally enabled"
+#~ msgstr "O listă de surse nelibere care pot fi activate opțional"
+
+#~ msgid "Player-to-player preset interactions without chat functionality"
+#~ msgstr ""
+#~ "Interacțiuni prestabilite jucător-la-jucător fără funcționalitate de chat"
+
+#~ msgid "Enable Proprietary Software Sources?"
+#~ msgstr "Activați surse de programe proprietare?"
+
+#~ msgid "No applications or addons installed; other software might still be"
+#~ msgstr ""
+#~ "Nicio aplicație sau supliment adițional instalate; alte aplicații ar "
+#~ "putea fi totuși"
+
+#~ msgid "Typically has restrictions on use and access to source code."
+#~ msgstr "De obicei au restricții de utiliare și de acces la codul sursă."
+
+#~| msgid "Software Sources"
+#~ msgid "Proprietary Software Sources"
+#~ msgstr "Surse proprietare de programe"
+
+#~ msgid "Remove Source"
+#~ msgstr "Elimină sursa"
+
+#~ msgid ""
+#~ "Software sources can be downloaded from the internet. They give you "
+#~ "access to additional software that is not provided by %s."
+#~ msgstr ""
+#~ "Pot fi descărcate surse de aplicații de pe internet. Acestea vă oferă "
+#~ "acces la aplicații adiționale ce nu sunt furnizate de %s."
+
+#~ msgid ""
+#~ "Removing a source will also remove any software you have installed from "
+#~ "it."
+#~ msgstr ""
+#~ "Eliminarea unei surse conduce implicit la eliminarea aplicațiilor "
+#~ "instalate prin intermediul acesteia."
+
+#~ msgid "No software installed from this source"
+#~ msgstr "Nicio aplicație instalată prin intermediul acestei surse"
+
+#~ msgid "Installed from this Source"
+#~ msgstr "Instalate prin intermediul acestei surse"
+
+#~ msgid "Last Checked"
+#~ msgstr "Ultima verificare"
+
+#~ msgid "Added"
+#~ msgstr "Adăugat"
+
+#~ msgid "Website"
+#~ msgstr "Sit web"
+
+#~ msgid "“%s” [%s]"
+#~ msgstr "„%s” [%s]"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Development"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Development"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Education and Science"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Education and Science"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Graphics"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Graphics"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Office"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Office"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Communication"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Communication"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#, fuzzy
+#~| msgid "All"
+#~ msgctxt "Menu of Utility"
+#~ msgid "All"
+#~ msgstr "Toate"
+
+#, fuzzy
+#~| msgid "Featured"
+#~ msgctxt "Menu of Utility"
+#~ msgid "Featured"
+#~ msgstr "Recomandate"
+
+#~ msgid " or "
+#~ msgstr " sau "
+
+#~ msgid "3rd party"
+#~ msgstr "terțe"
+
+#~| msgid "Web app"
+#~ msgid "web app"
+#~ msgstr "aplicații web"
+
+#~ msgid "nonfree"
+#~ msgstr "nelibere"
+
+#~ msgid "shell extension"
+#~ msgstr "extensie shell"
+
+#~ msgid "Total"
+#~ msgstr "Total"
+
+#~ msgid "_Installing"
+#~ msgstr "Se _instalează"
+
+#~ msgid "_Removing"
+#~ msgstr "Se _elimină"
+
+#~ msgctxt "license"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscută"
+
+#~ msgid "This software comes from a 3rd party."
+#~ msgstr "Această aplicație provine dintr-o parte terță."
+
+#~ msgid ""
+#~ "This software comes from a 3rd party and may contain non-free components."
+#~ msgstr ""
+#~ "Această aplicație provine dintr-o parte terță și poate conține componente "
+#~ "nelibere."
+
+#~ msgid "This software may contain non-free components."
+#~ msgstr "Această aplicație poate conține componente nelibere."
+
+#~ msgid "non-free"
+#~ msgstr "neliberă"
+
+#~ msgid "Recommended Office Applications"
+#~ msgstr "Aplicații de birou recomandate"
+
+#~| msgid "_Install"
+#~ msgid "_Install All"
+#~ msgstr "_Instalează toate"
+
+#~ msgid "Software sources give you access to additional software."
+#~ msgstr "Sursele de aplicații vă oferă acces la aplicații suplimentare."
+
+#~ msgid "One Star"
+#~ msgstr "O stea"
+
+#~ msgid "Two Stars"
+#~ msgstr "Două stele"
+
+#~ msgid "Three Stars"
+#~ msgstr "Trei stele"
+
+#~ msgid "Four Stars"
+#~ msgstr "Patru stele"
+
+#~ msgid "Five Stars"
+#~ msgstr "Cinci stele"
+
+#~ msgid "Installation of %s failed."
+#~ msgstr "Instalarea %s a eșuat."
+
+#~ msgid "Removal of %s failed."
+#~ msgstr "Eliminarea %s a eșuat."
+
+#~| 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 "Asigurați-vă că aveți acces la internet și încercați din nou."
+
+#~| 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 "Eliberați spațiu și încercați din nou."
+
+#~ msgid "If the problem persists, contact your software provider."
+#~ msgstr ""
+#~ "Dacă problema persistă, contactați furnizorul dumneavoastră de aplicații."
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-cartoon"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-fantasy"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-realistic"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-bloodshed"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating violence-sexual"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating drugs-alcohol"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating drugs-narcotics"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating sex-nudity"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating sex-themes"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-profanity"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-humor"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating language-discrimination"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-advertising"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-gambling"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating money-purchasing"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-chat"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-audio"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-contacts"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-info"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~| msgctxt "menu category"
+#~| msgid "None"
+#~ msgctxt "content rating social-location"
+#~ msgid "None"
+#~ msgstr "Nespecificată"
+
+#~ msgid "Audio"
+#~ msgstr "Audio"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Editing"
+#~ msgstr "Editare"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Databases"
+#~ msgstr "Baze de date"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Disc Burning"
+#~ msgstr "Creeare de discuri"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Ham Radio"
+#~ msgstr "Radioamatorism"
+
+#~ 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 "Muzică"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Recorders"
+#~ msgstr "Instrumente de înregistrare"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Sequencers"
+#~ msgstr "Instrumente de secvențiere"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Tuners"
+#~ msgstr "Tunere"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Building"
+#~ msgstr "Constructoare"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Databases"
+#~ msgstr "Baze de date"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "IDE"
+#~ msgstr "Medii de dezvoltare integrate"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Profiling"
+#~ msgstr "Profilare"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Project Management"
+#~ msgstr "Administrare de proiecte"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Web Development"
+#~ msgstr "Dezvoltare web"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Biology"
+#~ msgstr "Biologie"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Computer Science"
+#~ msgstr "Informatică"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Data Visualization"
+#~ msgstr "Vizualizare de date"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Economy"
+#~ msgstr "Economie"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Electricity"
+#~ msgstr "Electricitate"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Electronics"
+#~ msgstr "Electronică"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Engineering"
+#~ msgstr "Inginerie"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geology"
+#~ msgstr "Geologie"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geoscience"
+#~ msgstr "Geoștiință"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "History"
+#~ msgstr "Istorie"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Image Processing"
+#~ msgstr "Procesare de imagini"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Literature"
+#~ msgstr "Literatură"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Maps"
+#~ msgstr "Hărți"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Music"
+#~ msgstr "Muzică"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Analiză numerică"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Parallel Computing"
+#~ msgstr "Calcul paralel"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Physics"
+#~ msgstr "Fizică"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Spirituality"
+#~ msgstr "Spiritualitate"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Shooter"
+#~ msgstr "Împușcături"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Simulation"
+#~ msgstr "Simulare"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Sports"
+#~ msgstr "Sport"
+
+#~ msgid "Graphics"
+#~ msgstr "Grafică"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "2D Graphics"
+#~ msgstr "Grafică 2D"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "OCR"
+#~ msgstr "OCR"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Publishing"
+#~ msgstr "Publicare"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Raster Graphics"
+#~ msgstr "Grafică raster"
+
+#~ msgid "Internet"
+#~ msgstr "Internet"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Dialup"
+#~ msgstr "Dialup"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Email"
+#~ msgstr "Poștă electronică"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Feed"
+#~ msgstr "Fluxuri"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "File Transfer"
+#~ msgstr "Transfer de fișiere"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Ham Radio"
+#~ msgstr "Radioamatorism"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Instant Messaging"
+#~ msgstr "Mesagerie instantă"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "IRC Clients"
+#~ msgstr "Clienți de IRC"
+
+#~ 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 "Dezvoltare web"
+
+#~ msgid "Office"
+#~ msgstr "Birou"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Chart"
+#~ msgstr "Grafic"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Contact Management"
+#~ msgstr "Administrare de contacte"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Dictionary"
+#~ msgstr "Dicționar"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Email"
+#~ msgstr "Poștă electronică"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Flow Chart"
+#~ msgstr "Diagramă"
+
+#~ 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 "Administrare de proiecte"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Publishing"
+#~ msgstr "Publicare"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Spreadsheet"
+#~ msgstr "Calcul tabelar"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Viewer"
+#~ msgstr "Vizualizator"
+
+#~ msgid "Science"
+#~ msgstr "Știință"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Art"
+#~ msgstr "Artă"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Artificial Intelligence"
+#~ msgstr "Inteligență 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"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Computer Science"
+#~ msgstr "Informatică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Construction"
+#~ msgstr "Construcții"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Data Visualization"
+#~ msgstr "Vizualizare de date"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Economy"
+#~ msgstr "Economie"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Electricity"
+#~ msgstr "Electrică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Electronics"
+#~ msgstr "Electronică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Engineering"
+#~ msgstr "Inginerie"
+
+#~ 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 "Geoștiință"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "History"
+#~ msgstr "Istorie"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Humanities"
+#~ msgstr "Umanitate"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Image Processing"
+#~ msgstr "Procesare de imagini"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Languages"
+#~ msgstr "Limbi"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Literature"
+#~ msgstr "Literatură"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Maps"
+#~ msgstr "Hărți"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Math"
+#~ msgstr "Matematică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Medical"
+#~ msgstr "Medical"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Analiză numerică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Parallel Computing"
+#~ msgstr "Calcul paralel"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Physics"
+#~ msgstr "Fizică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Robotics"
+#~ msgstr "Robotică"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Spirituality"
+#~ msgstr "Spiritualitate"
+
+#~ 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 "Administrator de fișiere"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "File Tools"
+#~ msgstr "Instrumente de fișiere"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Monitor"
+#~ msgstr "Monitor"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Security"
+#~ msgstr "Securitate"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Terminal Emulator"
+#~ msgstr "Emulatoare de terminal"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Accessibility"
+#~ msgstr "Accesibilitate"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Archiving"
+#~ msgstr "Arhivare"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Calculator"
+#~ msgstr "Calculator"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Clock"
+#~ msgstr "Ceas"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Compression"
+#~ msgstr "Comprimare"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "File Tools"
+#~ msgstr "Instrumente pentru fișiere"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Maps"
+#~ msgstr "Hărți"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Spirituality"
+#~ msgstr "Spiritualitate"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Telephony Tools"
+#~ msgstr "Instrumente de telefonie"
+
+#~ msgid "Video"
+#~ msgstr "Video"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Editing"
+#~ msgstr "Editare"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Database"
+#~ msgstr "Bază de date"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Disc Burning"
+#~ msgstr "Creeare de discuri"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Recorders"
+#~ msgstr "Instrumente de înregistrare"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "TV"
+#~ msgstr "Televiziune"
+
+#~ msgid "A previous update was unfinished."
+#~ msgstr "O actualizare precedentă nu a fost completată."
+
+#~ 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 ""
+#~ "Actualizarea nu a putut fi instalată; adesea este vorba de o problemă cu "
+#~ "atualizarea în sine. Așteptați o altă actualizare și încercați din nou."
+
+#~ msgctxt "size"
+#~ msgid "Calculating…"
+#~ msgstr "Se calculează…"
+
+#~ msgctxt "size"
+#~ msgid "Unknown"
+#~ msgstr "Necunoscută"
+
+#~ msgid "Internet Only Application"
+#~ msgstr "Aplicație doar pentru internet"
+
+#~ msgid "_History"
+#~ msgstr "_Istoric"
+
+#~ msgid "Size"
+#~ msgstr "Dimensiune"
+
+#~ msgid "No AppStream data found"
+#~ msgstr "Datele AppStream nu au fost găsite"
+
+#~ msgid "An update was not signed in the correct way."
+#~ msgstr "O actualizare nu a fost semnată corespunzător."
+
+#~ msgid "The update could not be completed."
+#~ msgstr "Actualizarea nu a putut fi completată."
+
+#~ msgid "An offline update was requested but no packages required updating."
+#~ msgstr ""
+#~ "O actualizare în modul deconectat a fost cerută dar niciun pachet nu "
+#~ "necesită a fi actualizat."
+
+#~ msgid "No space was left on the drive."
+#~ msgstr "Nu mai este spațiu liber pe disc."
+
+#~ msgid "An update failed to install correctly."
+#~ msgstr "O actualizare nu a fost instalată corect."
+
+#~ msgid "The offline update failed in an unexpected way."
+#~ msgstr "Actualizarea în modul deconectat a eșuat într-un mod neașteptat."
+
+#~ msgid "No sources found."
+#~ msgstr "Nicio sursă găsită."
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Set the specified debugging level"
+#~ msgstr "Alege nivelul de depanare specificat"
+
+#~ msgid "Picks"
+#~ msgstr "Selecții"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..39c403d
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,5431 @@
+# 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 <ymyasoedov@yandex.ru>, 2014, 2015.
+# Ivan Komaritsyn <vantu5z@mail.ru>, 2015.
+# Pavel Elizaryev <gonleef@tuta.io>, 2016.
+# Stas Solovey <whats_up@tut.by>, 2013-2018, 2019.
+# Maxim Taranov <png2378@gmail.com>, 2017.
+# Melman <Alexmelman88@gmail.com>, 2021.
+# Ivan Molodetskikh <yalterz@gmail.com>, 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: 2022-11-17 22:53+0000\n"
+"PO-Revision-Date: 2022-11-19 16:27+0300\n"
+"Last-Translator: Aleksandr Melman <Alexmelman88@gmail.com>\n"
+"Language-Team: Russian <gnome-cyr@gnome.org>\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.2.1\n"
+"X-DL-Team: ru\n"
+"X-DL-Module: gnome-software\n"
+"X-DL-Branch: main\n"
+"X-DL-Domain: po\n"
+"X-DL-State: None\n"
+
+# перевод по аналогии с ubuntu software - центр приложений ubuntu
+#: 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:2076
+#: 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 "Установить 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 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 будет выполнять обновления в "
+"фоновом режиме даже при использовании лимитного соединения (впоследствии "
+"загрузки некоторых метаданных, проверки обновлений и других действий, может "
+"взиматься плата с пользователя)."
+
+#: 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 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 ""
+"Чем больше значение, тем меньше обращений к удалённому серверу, но "
+"обновление снимков экрана занимает более продолжительное время. «0» — "
+"никогда не обращаться к серверу, если изображение уже есть в кэше."
+
+#: 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 "Используемый URL лицензии, когда приложение считается свободным"
+
+#: 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://ru.wikipedia.org/wiki/Проприетарное_программное_обеспечение'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "URI, описывающий несвободное и проприетарное программное обеспечение"
+
+#: 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 ""
+"Список URL, указывающих на appstream-файлы, которые будут загружены в папку "
+"swcatalog"
+
+#: 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 ""
+"Установить appstream-файлы в общесистемную папку для всех пользователей. "
+"Если значение false, файлы устанавливаются в нестандартный каталог "
+"$XDG_DATA_HOME/swcatalog/xmls"
+
+#: 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 ""
+"Приоритетный порядок предпочтительных форматов пакета, при этом более важные "
+"форматы перечислены первыми. Пустой массив означает порядок по умолчанию. "
+"Пропущенные форматы считаются перечисленными последними. Примеры форматов "
+"пакета: deb, flatpak, rpm, snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "«%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:1027
+#, 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:1031
+#, 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 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» подходит для подростков"
+
+#. 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» подходит для взрослых"
+
+#. 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» подходит для %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 "Возрастной рейтинг"
+
+#: 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:6178
+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:6197 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6274
+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 "Имеет доступ к службам D-Bus на системной шине"
+
+#: 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 "Имеет доступ к службам D-Bus на шине сеанса"
+
+#: 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 "Новое в версии %s"
+
+#: 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 "Для этого релиза нет подробностей"
+
+# 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: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 ""
+"Режим при запуске: «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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Показать локальный файл metainfo или appdata"
+
+#: 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 "Предпочитать локальные источники вместо AppStream"
+
+#: 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 ""
+"Станислав Соловей <whats_up@tut.by>, 2013-2019.\n"
+"Юрий Мясоедов <ymyasoedov@yandex.ru>, 2014.\n"
+"Alexey Rubtsov <rushills@gmail.com>, 2021.\n"
+"Aleksandr Melman <Alexmelman88@gmail.com>, 2022"
+
+# перевод по аналогии с ubuntu software - центр приложений ubuntu
+#. 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 "О Центрe приложений GNOME"
+
+#. 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 "Требуется %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: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 "Источник: %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 "Переименовано с %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Помочь перевести %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 проектируется, разрабатывается и переводится международным сообществом "
+"добровольцев.\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: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 "Подборки из Cети"
+
+# перевод по аналогии с ubuntu software - центр приложений ubuntu
+#. 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 "Введите число от 1 до %u: "
+
+# Приложению требуется …
+#. 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 "Приложение %s установлено"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s не является <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">свободным и открытым приложением</a> и предоставляется "
+"«%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 предоставляется «%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 ""
+"В некоторых странах установка или использование %s могут быть незаконны."
+
+#. 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] "Обновления было установлено"
+msgstr[2] "Обновлений были установлены"
+
+# Приложению требуется …
+#. 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] "Приложения было удалено"
+msgstr[2] "Приложений было удалено"
+
+#. 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] "Необходима перезагрузка, чтобы применить изменения."
+msgstr[2] "Необходима перезагрузка, чтобы применить изменения."
+
+#. 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] "%d минута назад"
+msgstr[1] "%d минуты назад"
+msgstr[2] "%d минут назад"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d час назад"
+msgstr[1] "%d часа назад"
+msgstr[2] "%d часов назад"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d день назад"
+msgstr[1] "%d дня назад"
+msgstr[2] "%d дней назад"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d неделя назад"
+msgstr[1] "%d недели назад"
+msgstr[2] "%d недель назад"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d месяц назад"
+msgstr[1] "%d месяца назад"
+msgstr[2] "%d месяцев назад"
+
+#: src/gs-common.c:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years 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: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 "Приложение"
+
+#. 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: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:873 src/gs-details-page.c:899
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Установить"
+
+#: src/gs-details-page.c:889
+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:913
+msgid "_Install…"
+msgstr "_Установить…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1190
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Другие приложения от %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1573
+msgid "You need internet access to write a review"
+msgstr "Для написания отзыва необходимо подключение к Интернету"
+
+#: src/gs-details-page.c:1737 src/gs-details-page.c:1753
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Не удалось найти «%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 "Помочь _Перевести"
+
+#. 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:907
+msgid "_Write Review"
+msgstr "_Написать отзыв"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+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: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] "Доступный шрифт для написания %s"
+msgstr[1] "Доступные шрифты для написания %s"
+msgstr[2] "Доступные шрифты для написания %s"
+
+#. 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] "Доступное ПО для %s"
+msgstr[1] "Доступное ПО для %s"
+msgstr[2] "Доступное ПО для %s"
+
+#: 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 "%s не найден"
+
+#. 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 "Не найдено ни одного приложения, которое предоставляло бы файл %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 ""
+"Сведения о %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Сведения о %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Сведения о %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:420
+#, 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:424
+#, 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 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 "Не найдено ни одного драйвера принтера для %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 ""
+"Сведения о %s, а также параметры для получения драйвера, который "
+"поддерживает этот принтер можно найти на %s."
+
+#. 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] ""
+"Кодек %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: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] "Кодек %s не найден. Подробную информацию прочтите здесь - %s."
+msgstr[1] "Кодеки %s не найдены. Подробную информацию прочтите здесь - %s."
+msgstr[2] "Кодеки %s не найдены. Подробную информацию прочтите здесь - %s."
+
+#: 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 "Не удалось получить результаты поиска: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Формат файла %s"
+
+#: 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 "«%s», вероятно, работает на этом устройстве"
+
+#. 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» работает на этом устройстве"
+
+#. 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» не будет работать должным образом на этом устройстве"
+
+#. 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» не будет работать на этом устройстве"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Это программное обеспечение разрабатывается в открытом режиме сообществом "
+"добровольцев и выпускается под <a href=\"%s\">%s лицензией</a>.\n"
+"\n"
+"Вы можете внести свой вклад и помочь сделать его еще лучше."
+
+#. 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 ""
+"Это программное обеспечение разрабатывается в открытом режиме сообществом "
+"добровольцев и выпускается под лицензией %s.\n"
+"\n"
+"Вы можете внести свой вклад и помочь сделать его еще лучше."
+
+#: 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 ""
+"Это программное обеспечение не разрабатывается открыто, поэтому только его "
+"разработчики знают, как оно работает. Оно может быть небезопасным в тех "
+"случаях, когда его трудно проанализировать, и может изменяться без "
+"контроля.\n"
+"\n"
+"Возможно, вы не сможете внести свой вклад в это программное обеспечение."
+
+#. 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 ""
+"Выбранная сеть тарифицируется. Такие соединения имеют ограничения по объёму "
+"данных или отдельную плату связанную с передачей данных. Для того, чтобы "
+"сэкономить трафик, автоматические обновления были приостановлены.\n"
+"\n"
+"Автоматические обновления будут возобновлены, как только произойдёт "
+"переключение на нетарифицируемую сеть. До этого момента возможны только "
+"обновления, запущенные вручную.\n"
+"\n"
+"Также возможно, что соединение было определено как тарифицируемое по ошибке, "
+"это можно изменить в настройках соединения."
+
+#: 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 ""
+"Предоставляет доступ к дополнительному программному обеспечению из %s. "
+"Включая некоторые проприетарные программы."
+
+#. 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:2837
+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 "Уверены, что хотите удалить репозиторий %s?"
+
+#. 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 ""
+"Все приложения из %s будут удалены, и вам придется переустановить "
+"репозиторий, чтобы использовать их снова."
+
+#. 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 "Уверены, что хотите удалить %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 будет удалено, для повторного использования приложения "
+"потребуется его установка."
+
+#: 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 ""
+"Некоторые из установленных приложений несовместимы с %s. Если вы продолжите, "
+"следующие приложения будут автоматически удалены во время обновления:"
+
+#: 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 ""
+"Программное обеспечение, которое было установлено с \"%s\", перестанет "
+"получать обновления."
+
+#: 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 "Дополнительные репозитории от выбранных сторонних источников - %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 ""
+"Эти репозитории дополняют программное обеспечение по умолчанию, "
+"предоставленное %s."
+
+#. 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] "%u приложение установлено"
+msgstr[1] "%u приложения установлено"
+msgstr[2] "%u приложений установлено"
+
+#. 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 дополнение установлено"
+msgstr[1] "%u дополнения установлено"
+msgstr[2] "%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-repo-row.c:175
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+msgstr[0] "%u приложение"
+msgstr[1] "%u приложения"
+msgstr[2] "%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-repo-row.c:181
+#, 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 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 и %s установлено"
+msgstr[1] "%s и %s установлено"
+msgstr[2] "%s и %s установлено"
+
+#. 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 "Ненавижу"
+
+#. 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Узнать какие данные передаются можно в нашей <a href=\"https://odrs.gnome."
+"org/privacy\">политике конфиденциальности</a>. Полное имя, привязанное к "
+"вашей учетной записи, будет отображаться в открытом доступе."
+
+#: 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:93
+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: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 "«%s» потенциально небезопасно"
+
+#. 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» небезопасно"
+
+#. 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 "Устаревшая версия 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 "Следующий снимок экрана"
+
+#: 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] "ещё %u совпадение"
+msgstr[1] "ещё %u совпадения"
+msgstr[2] "ещё %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 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 "Не удалось загрузить обновления прошивки из %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 "Не удалось загрузить обновления из %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 "Не удалось загрузить обновления"
+
+#. 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 "Не удалось загрузить обновления из %s: недостаточно места на диске"
+
+#. 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 "Не удалось установить %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 "Не удалось установить %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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Не удалось установить %s (не поддерживается)"
+
+#. 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 "Не удалось установить %s: недостаточно места на диске"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Не удалось установить %s: низкий уровень заряда батареи"
+
+#. 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 "Не удалось установить %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 "Не удалось обновить %s из %s из-за сбоя загрузки"
+
+#. 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 "Не удалось обновить %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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Не удалось установить обновления из %s из-за сбоя загрузки"
+
+#. 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 "Не удалось обновить %s: недостаточно места на диске"
+
+#. 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 "Не удалось обновить %s: требуется аутентификация"
+
+#. 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 "Не удалось обновить %s: ошибка аутентификации"
+
+#. 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 "Не удалось обновить %s: недостаточно прав для обновления"
+
+#. 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 "Не удалось обновить %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: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 "Не удалось обновить %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: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 "Не удалось обновить %s"
+
+#. 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 "Не удалось обновить до %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 "Не удалось обновить до %s из-за сбоя загрузки"
+
+#. 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 ""
+"Не удалось обновиться на %s: необходимо подключение к Интернету, но оно "
+"недоступно"
+
+#. 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 "Не удалось обновить до %s: недостаточно места на диске"
+
+#. 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 "Не удалось обновить до %s: требуется аутентификация"
+
+#. 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 "Не удалось обновить до %s: ошибка аутентификации"
+
+#. 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 "Не удалось обновить до %s: недостаточно прав для обновления"
+
+#. 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 "Не удалось обновить до %s: требуется подключение к электросети"
+
+#. 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 "Не удалось обновить до %s: низкий уровень заряда батареи"
+
+#. 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 "Не удалось обновить до %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 "Не удалось удалить %s: требуется аутентификация"
+
+#. 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 "Не удалось удалить %s: ошибка аутентификации"
+
+#. 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 "Не удалось удалить %s: недостаточно прав для удаления"
+
+#. 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 "Не удалось удалить %s: требуется подключение к электросети"
+
+#. 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 "Не удалось удалить %s: низкий уровень заряда батареи"
+
+#. 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 "Не удалось удалить %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 "Не удалось запустить %s: приложение %s не установлено"
+
+#. 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 "Извините, что-то пошло не так"
+
+#. 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 "Недостаточно места на диске — освободите место и повторите попытку"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Не удалось установить файл: не поддерживается"
+
+#. 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 "Сбой при установке: ошибка аутентификации"
+
+#. 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 "Не удалось связаться с %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 "Слишком низкий уровень заряда батареи"
+
+#: 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Кэшированные данные могут быть удалены из <a href=\"dummy\">настроек "
+"_приложений</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Установлено)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Устанавливается)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Удаляется)"
+
+#. 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 "Установлено %s"
+
+#: 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] "%u приложение обновлено — требуется перезагрузка"
+msgstr[1] "%u приложения обновлено — требуется перезагрузка"
+msgstr[2] "%u приложений обновлено — требуется перезагрузка"
+
+#. 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 приложение обновлено"
+msgstr[1] "%u приложения обновлено"
+msgstr[2] "%u приложений обновлено"
+
+#. 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 "%s и %s были обновлены."
+
+#. 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 приложение требует перезапуска."
+msgstr[1] "%u приложения требует перезапуска."
+msgstr[2] "%u приложений требуют перезапуска."
+
+#. 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 "Для установки доступна новая версия %s"
+
+#. 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 "Добро пожаловать в %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] "Установлены обновления программного обеспечения"
+msgstr[2] "Установлены обновления программного обеспечения"
+
+#. 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] "Установлено важных обновления операционной системы."
+msgstr[2] "Установлено важных обновлений операционной системы."
+
+#. 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 "Последняя проверка: %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 больше не поддерживается."
+
+#: 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 "Доступно обновление %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:95
+#, c-format
+msgid "%s Available"
+msgstr "Доступно обновление %s"
+
+#: 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 "%s из %s загружено"
+
+#. 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%% загружено"
+
+#: 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 "Обновление %s с новыми функциями и исправлениями."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "Служба обновлений EOS не смогла получить и применить обновления."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "Веб-браузер GNOME"
+
+#: 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 "Flatpak — это платформа для приложений, запускаемых в Linux"
+
+#. 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 "Системная папка %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Подпапка Домашней папки %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Папки хост-системы"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Конфигурация хост-системы из /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Папка Рабочий стол"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Подпапка Рабочего стола %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Папка Документы"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Подпапка Документов %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Папка Музыка"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Подпапка Музыки %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Папка Изображения"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Подпапка Изображений %s"
+
+#: 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 "Подпапка общего доступа %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Папка Видео"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Подпапка Видео %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Папка Шаблоны"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Подпапка Шаблонов %s"
+
+#: 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 "Подпапка пользовательского кэша %s"
+
+#: 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 "Подпапка пользовательской конфигурации %s"
+
+#: 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 "Подпапка пользовательских данных %s"
+
+#: 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 "Подпапка пользовательской среды выполнения %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Доступ файловой системы к %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Получение метаданных flatpak для %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Не удалось добавить установку для дополнения '%s': %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Не удалось добавить удаление для дополнения '%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 ""
+"Удаленный \"%s\" не позволяет установить \"%s\", возможно, из-за его "
+"фильтра. Удалите фильтр и повторите установку. Подробная ошибка: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Обновление контроллера Thunderbolt %s"
+
+#. 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"
+
+#. 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"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Обновление камеры %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Обновление TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Обновление сенсорной панели %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Обновление мыши %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Обновление клавиатуры %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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Обновление 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Обновление USB-приемника %s"
+
+#: 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 ""
+"Программное обеспечение, которое должно быть установлено, не подписано. "
+"Будет невозможно проверить происхождение обновлений этого программного "
+"обеспечения или наличие изменений в обновлениях."
+
+# перевод по аналогии с ubuntu software - центр приложений ubuntu
+#: 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 ""
+"Доступны неподписанные обновления. Без подписи невозможно проверить "
+"происхождение обновления или то, было ли оно изменено."
+
+# перевод по аналогии с ubuntu software - центр приложений ubuntu
+#: 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:2696
+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 "No updates have been installed on this system."
+#~ msgstr "Обновления не были установлены на этой системе."
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Менеджер приложений для GNOME"
+
+#~ 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 "Версия"
+
+#, 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 "Загрузка рейтинга приложений…"
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..de87a1a
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,7076 @@
+# 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 <prescott66@gmail.com>, 2013-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: 2021-09-28 14:50+0000\n"
+"PO-Revision-Date: 2021-10-05 08:35+0200\n"
+"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
+"Language-Team: Slovak <gnome-sk-list@gnome.org>\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: Gtranslator 40.0\n"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:7
+msgid "GNOME Software"
+msgstr "Softvér prostredia GNOME"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Správca aplikácií prostredia 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 ""
+"Aplikácia Softvér vám umožňuje nájsť a nainštalovať nové aplikácie a "
+"systémové rozšírenia a odstrániť existujúce nainštalované aplikácie."
+
+#: 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 ""
+"Softvér prostredia GNOME predstavuje obľúbené aplikácie a aplikácie "
+"základnej výbavy s užitočnými popismi a snímkami obrazovky danej aplikácie. "
+"Aplikácie sa dajú nájsť buď prezeraním zoznamu kategórií alebo pomocou "
+"vyhľadávača. Tiež umožňuje aktualizovať váš systém za pomoci aktualizácií "
+"nevyužívajúcich pripojenie k sieti."
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "Panel s náhľadom"
+
+# GtkLabel
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Details panel"
+msgstr "Panel s podrobnosťami"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Installed panel"
+msgstr "Panel s nainštalovaným softvérom"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+#: data/appdata/org.gnome.Software.appdata.xml.in:45
+msgid "Updates panel"
+msgstr "Panel s aktualizáciami"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:49
+msgid "The update details"
+msgstr "Podrobnosti o aktualizácii"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1862
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: 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 ""
+
+#: 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 automaticky "
+"prevezme 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 ""
+
+#: 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 "Či sa má automaticky vykonávať obnova s obmedzeným pripojením"
+
+#: 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 "Či je úplne 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é hviezdami pri aplikáciách"
+
+#: 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 ""
+"Neslobodné aplikácie zobrazia pred inštaláciou dialógové okno s upozornením"
+
+#: 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í, môže byť zobrazené dialógové okno s "
+"upozornením. Táto voľba ovláda potlačenie tohto dialógového okna."
+
+# cmdline description
+#: data/org.gnome.software.gschema.xml:47
+msgid "A list of popular applications"
+msgstr "Zoznam obľúbených aplikácií"
+
+#: data/org.gnome.software.gschema.xml:48
+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."
+
+#: data/org.gnome.software.gschema.xml:52
+msgid "The last update check timestamp"
+msgstr "Časová značka poslednej kontroly aktualizácií"
+
+#: data/org.gnome.software.gschema.xml:56
+msgid "The last upgrade notification timestamp"
+msgstr "Časová značka posledného oznámenia o aktualizácii"
+
+#: data/org.gnome.software.gschema.xml:60
+#, fuzzy
+#| msgid "The last upgrade notification timestamp"
+msgid "The last update notification timestamp"
+msgstr "Časová značka posledného oznámenia o aktualizácii"
+
+#: data/org.gnome.software.gschema.xml:64
+msgid "The timestamp of the first security update, cleared after update"
+msgstr ""
+"Časová značka prvej bezpečnostnej aktualizácie, zmazanej po aktualizácii"
+
+#: data/org.gnome.software.gschema.xml:68
+msgid "The last update timestamp"
+msgstr "Časová značka poslednej aktualizácie"
+
+#: data/org.gnome.software.gschema.xml:72
+msgid "The last timestamp when the system was online and got any updates"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:76
+msgid "The age in seconds to verify the upstream screenshot is still valid"
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:77
+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:86
+msgid "The server to use for application reviews"
+msgstr "Server, ktorý sa použije pre recenzie aplikácií"
+
+#: data/org.gnome.software.gschema.xml:90
+msgid "The minimum karma score for reviews"
+msgstr "Minimálne body karmy recenzií"
+
+#: data/org.gnome.software.gschema.xml:91
+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:95
+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 "
+"od tretích strán"
+
+#: data/org.gnome.software.gschema.xml:99
+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:103
+msgid ""
+"The licence URL to use when an application should be considered free software"
+msgstr "URL licencie, ktorá sa použije, keď je softvér považovaný za slobodný"
+
+#: data/org.gnome.software.gschema.xml:107
+msgid "Install bundled applications for all users on the system where possible"
+msgstr ""
+"Inštalovať sady aplikácií pre všetkých používateľov v systéme, kde je to "
+"možné"
+
+#: data/org.gnome.software.gschema.xml:111
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Umožniť prístup k dialógovému oknu repozitárov softvéru"
+
+#: data/org.gnome.software.gschema.xml:115
+msgid "Offer upgrades for pre-releases"
+msgstr "Ponúknuť aktualizácie predčasných vydaní"
+
+#: data/org.gnome.software.gschema.xml:119
+msgid "Show some UI elements informing the user that an app is non-free"
+msgstr ""
+"Zobraziť niektoré prvky používateľského rozhrania, ktoré informujú "
+"používateľa o tom, že aplikácia nie je slobodná"
+
+#: 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://sk.wikipedia.org/wiki/Propriet%C3%A1rny_softv%C3%A9r'"
+
+#: data/org.gnome.software.gschema.xml:128
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "URI, ktorý objasňuje neslobodný a uzavretý softvér"
+
+#: 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
+#, fuzzy
+#| msgid "Install an appstream file into a system location"
+msgid "Install the AppStream files to a system-wide location for all users"
+msgstr "Inštalovať súbor appstream do systémového umiestnenia"
+
+#: data/org.gnome.software.gschema.xml:140
+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."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:145
+msgid "The URI that references the background for an upgrade banner."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:146
+msgid ""
+"The URI can contain up to three '%u', which will be replaced by the upgrade "
+"version."
+msgstr ""
+
+#: data/org.gnome.software.gschema.xml:152
+msgid "A string storing the gnome-online-account id used to login"
+msgstr ""
+
+#. TRANSLATORS: tool that is used when copying profiles system-wide
+#: gs-install-appstream/gs-install-appstream.c:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr ""
+
+# title
+#: gs-install-appstream/gs-install-appstream.c:145
+msgid "Failed to parse command line arguments"
+msgstr "Zlyhalo analyzovanie parametrov príkazového riadku"
+
+#. 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 "Musíte určiť presne jeden názov súboru"
+
+#. 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 "Tento program môže byť použitý iba správcom"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, fuzzy, c-format
+#| msgid "Failed to validate content type"
+msgid "Failed to validate content type: %s"
+msgstr "Zlyhalo schválenie typu obsahu"
+
+# title
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, fuzzy, c-format
+#| msgid "Failed to copy"
+msgid "Failed to copy: %s"
+msgstr "Kopírovanie zlyhalo"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Inštalácia softvéru"
+
+#: src/gnome-software-local-file.desktop.in:4
+msgid "Install selected software on the system"
+msgstr "Inštaluje vybraný softvér do systému"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:78
+#, fuzzy
+#| msgid "No cartoon violence"
+msgid "Cartoon Violence"
+msgstr "Žiadne kreslené násilie"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:85
+#, fuzzy
+#| msgid "No fantasy violence"
+msgid "Fantasy Violence"
+msgstr "Žiadne fiktívne násilie"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:92
+#, fuzzy
+#| msgid "No realistic violence"
+msgid "Realistic Violence"
+msgstr "Žiadne realistické násilie"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:99
+msgid "Violence Depicting Bloodshed"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:106
+#, fuzzy
+#| msgid "No sexual violence"
+msgid "Sexual Violence"
+msgstr "Žiadne sexuálne násilie"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:113
+msgid "Alcohol"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:120
+msgid "Narcotics"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:127
+msgid "Tobacco"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:134
+msgid "Nudity"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:141
+msgid "Sexual Themes"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:148
+msgid "Profanity"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:155
+#, fuzzy
+#| msgid "No inappropriate humor"
+msgid "Inappropriate Humor"
+msgstr "Žiadny nevhodný humor"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:162
+#, fuzzy
+#| msgid "Documentation"
+msgid "Discrimination"
+msgstr "Dokumentácia"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:169
+msgid "Advertising"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:176
+#, fuzzy
+#| msgid "Enabling"
+msgid "Gambling"
+msgstr "Povoľuje sa"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:183
+#, fuzzy
+#| msgid "Purchase"
+msgid "Purchasing"
+msgstr "Kúpiť"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:190
+msgid "Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:197
+msgid "Audio Chat Between Users"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:204
+#, fuzzy
+#| msgid "Source Details"
+msgid "Contact Details"
+msgstr "Podrobnosti o zdroji"
+
+# DK:cmd desc
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:211
+#, fuzzy
+#| msgid "More Information"
+msgid "Identifying Information"
+msgstr "Viac informácií"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:218
+msgid "Location Sharing"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:241
+msgid "Homosexuality"
+msgstr ""
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:248
+#, fuzzy
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Construction"
+msgid "Prostitution"
+msgstr "Konštrukcia"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:255
+#, fuzzy
+#| msgid "Adults Only"
+msgid "Adultery"
+msgstr "Iba dospelí"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:262
+#, fuzzy
+#| msgid "No sexual violence"
+msgid "Sexualized Characters"
+msgstr "Žiadne sexuálne násilie"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:269
+#, fuzzy
+#| msgctxt "Menu subcategory of Office"
+#| msgid "Presentation"
+msgid "Desecration"
+msgstr "Prezentácia"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:276
+#, fuzzy
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Humanities"
+msgid "Human Remains"
+msgstr "Humanita"
+
+#. TRANSLATORS: content rating title, see https://hughsie.github.io/oars/
+#: src/gs-age-rating-context-dialog.c:283
+msgid "Slavery"
+msgstr ""
+
+#. Translators: This refers to a content rating attribute which
+#. * has an unknown value. For example, the amount of violence in
+#. * an app is ‘Unknown’.
+#: src/gs-age-rating-context-dialog.c:338
+msgid "Unknown"
+msgstr "Neznáma"
+
+# 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.
+#. TRANSLATORS: this is a subcategory matching all the
+#. * different apps in the parent category, e.g. "Games"
+#: src/gs-age-rating-context-dialog.c:605 lib/gs-category.c:214
+msgid "All"
+msgstr "Všetko"
+
+#. 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:618 src/gs-app-context-bar.c:187
+#: src/gs-storage-context-dialog.c:87
+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:684
+#, 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:688
+#, 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:692
+#, 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:700
+#, 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:704
+#, fuzzy, c-format
+#| msgid "%s file format"
+msgid "%s is suitable for adults"
+msgstr "Formát súboru %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:709
+#, 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:9 src/gs-app-context-bar.ui:302
+msgid "Age Rating"
+msgstr "Hodnotenie veku"
+
+# DK:cmd desc
+#: src/gs-age-rating-context-dialog.ui:116
+#: src/gs-hardware-support-context-dialog.ui:115
+#: src/gs-safety-context-dialog.ui:264
+#, fuzzy
+#| msgid "Show verbose debugging information"
+msgid "How to add missing information"
+msgstr "Vypíše podrobné ladiace informácie"
+
+#: lib/gs-app.c:5607
+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:5623 src/gs-safety-context-dialog.c:391
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:5699
+msgid "Package"
+msgstr "Balík"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:435
+msgid "Pending"
+msgstr "Čaká na inštaláciu"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:439 src/gs-details-page.c:381
+#, fuzzy
+#| msgid "Pending installation…"
+msgid "Pending install"
+msgstr "Čakajúca inštalácia…"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:443 src/gs-details-page.c:388
+#, fuzzy
+#| msgid "Pending"
+msgid "Pending remove"
+msgstr "Čaká na inštaláciu"
+
+#. 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-app-addon-row.c:111 src/gs-app-row.ui:167 src/gs-app-tile.ui:51
+#: src/gs-feature-tile.c:381 src/gs-installed-page.c:592 src/gs-shell.ui:319
+msgid "Installed"
+msgstr "Nainštalovaný"
+
+#. 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:195 src/gs-details-page.c:374
+msgid "Installing"
+msgstr "Inštaluje sa"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Odstraňuje sa"
+
+# GtkButton
+#: src/gs-app-addon-row.ui:70
+#, fuzzy
+#| msgid "_Install"
+msgid "_Uninstall"
+msgstr "_Inštalovať"
+
+#: src/gs-app-details-page.c:70
+msgid "Network"
+msgstr "Sieť"
+
+#: src/gs-app-details-page.c:70
+msgid "Can communicate over the network"
+msgstr "Môže komunikovať prostredníctvom siete"
+
+#: src/gs-app-details-page.c:71
+msgid "System Services"
+msgstr "Systémové služby"
+
+#: src/gs-app-details-page.c:71
+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:72
+msgid "Session Services"
+msgstr "Služby relácie"
+
+#: src/gs-app-details-page.c:72
+msgid "Can access D-Bus services on the session bus"
+msgstr "Môže pristupovať k službám zbernice D-Bus na relačnej zbernici"
+
+#: src/gs-app-details-page.c:73
+msgid "Devices"
+msgstr "Zariadenia"
+
+#: src/gs-app-details-page.c:73
+msgid "Can access system device files"
+msgstr "Môže pristupovať k súborom systémových zariadení"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+msgid "Home folder"
+msgstr "Domovský priečinok"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:76
+#: src/gs-app-details-page.c:78
+msgid "Can view, edit and create files"
+msgstr "Môže zobrazovať, upravovať a vytvárať súbory"
+
+#: src/gs-app-details-page.c:75 src/gs-app-details-page.c:77
+#: src/gs-app-details-page.c:79
+msgid "Can view files"
+msgstr "Môže zobrazovať súbory"
+
+#: src/gs-app-details-page.c:76 src/gs-app-details-page.c:77
+msgid "File system"
+msgstr "Súborový systém"
+
+#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:79
+msgid "Downloads folder"
+msgstr "Priečinok Stiahnuté"
+
+#: src/gs-app-details-page.c:80
+msgid "Settings"
+msgstr "Nastavenia"
+
+#: src/gs-app-details-page.c:80
+msgid "Can view and change any settings"
+msgstr "Môže zobrazovať a meniť akékoľvek nastavenia"
+
+#: src/gs-app-details-page.c:81
+msgid "Legacy display system"
+msgstr "Pôvodný zobrazovací systém"
+
+#: src/gs-app-details-page.c:81
+msgid "Uses an old, insecure display system"
+msgstr "Používa starý, nezabezpečený zobrazovací systém"
+
+#: src/gs-app-details-page.c:82
+#, fuzzy
+#| msgid "Sandboxed"
+msgid "Sandbox escape"
+msgstr "V izolovanom priestore"
+
+#: src/gs-app-details-page.c:82
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Môže uniknúť z izolovaného priestoru a obísť akékoľvek iné obmedzenia"
+
+#. Translators: This is the source and upgrade version of an
+#. * application, shown to the user when they view more detailed
+#. * information about pending updates. The source is of the form
+#. * ‘deja-dup’ (a package name) or
+#. * ‘app/org.gnome.Builder/x86_64/main’ (a flatpak ID), and the
+#. * version is of the form ‘40.4-1.fc34’ (a version number).
+#: src/gs-app-details-page.c:159
+#, fuzzy, c-format
+#| msgid "%s %f"
+msgid "%s %s"
+msgstr "%2$f %1$s"
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-app-details-page.c:177
+msgid "No update description available."
+msgstr "Nie je poskytnutý žiadny popis aktualizácie."
+
+# GtkButton
+#: src/gs-app-details-page.ui:22 src/gs-shell.ui:374 src/gs-shell.ui:462
+msgid "Go back"
+msgstr "Prejsť späť"
+
+#: src/gs-app-details-page.ui:109 src/gs-app-row.c:504
+msgid "Requires additional permissions"
+msgstr "Požaduje dodatočné oprávnenia"
+
+# GtkLabel
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:552
+#, fuzzy
+#| msgid "Version"
+msgid "Version History"
+msgstr "Verzia"
+
+#: src/gs-app-version-history-row.c:61
+#, c-format
+msgid "New in Version %s"
+msgstr ""
+
+# GtkLabel
+#: src/gs-app-version-history-row.c:68
+#, fuzzy, c-format
+#| msgid "Version"
+msgid "Version %s"
+msgstr "Verzia"
+
+#: src/gs-app-version-history-row.c:70
+#, fuzzy
+#| msgid "No details were available for this rating."
+msgid "No details for this release"
+msgstr "Pre toto hodnotenie neboli dostupné ž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:84 src/gs-review-row.c:65
+msgid "%e %B %Y"
+msgstr "%e. %B %Y"
+
+# cmdline description
+#. TRANSLATORS: this is a command line option
+#: src/gs-application.c:139
+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:139
+msgid "MODE"
+msgstr "REŽIM"
+
+# cmdline description
+#: src/gs-application.c:141
+msgid "Search for applications"
+msgstr "Vyhľadá aplikácie"
+
+#: src/gs-application.c:141
+msgid "SEARCH"
+msgstr "HĽADANIE"
+
+# cmdline description
+#: src/gs-application.c:143
+msgid "Show application details (using application ID)"
+msgstr "Zobrazí podrobnosti o aplikácii (použitím identifikátora aplikácie)"
+
+#: src/gs-application.c:143 src/gs-application.c:147
+msgid "ID"
+msgstr "IDENTIFIKÁTOR"
+
+# cmdline description
+#: src/gs-application.c:145
+msgid "Show application details (using package name)"
+msgstr "Zobrazí podrobnosti o aplikácii (použitím názvu balíka)"
+
+#: src/gs-application.c:145
+msgid "PKGNAME"
+msgstr "NÁZOV_BALÍKU"
+
+# cmdline description
+#: src/gs-application.c:147
+msgid "Install the application (using application ID)"
+msgstr "Nainštaluje aplikáciu (použitím identifikátora aplikácie)"
+
+# DK:cmd desc
+#: src/gs-application.c:149
+msgid "Open a local package file"
+msgstr "Otvorí miestny súbor balíka"
+
+#: src/gs-application.c:149
+msgid "FILENAME"
+msgstr "NÁZOV_SÚBORU"
+
+#: src/gs-application.c:151
+msgid ""
+"The kind of interaction expected for this action: either ‘none’, ‘notify’, "
+"or ‘full’"
+msgstr ""
+"Očakávaný druh interakcie pre túto akciu: buď „none“ (žiadna), "
+"„notify“ (oznámiť), alebo „full“ (úplná)"
+
+# DK:cmd desc
+#: src/gs-application.c:154
+msgid "Show verbose debugging information"
+msgstr "Vypíše podrobné ladiace informácie"
+
+#: src/gs-application.c:156
+msgid "Installs any pending updates in the background"
+msgstr "Nainštaluje akékoľvek čakajúce aktualizácie na pozadí"
+
+#: src/gs-application.c:158
+msgid "Show update preferences"
+msgstr "Zobrazí predvoľby aktualizácií"
+
+# cmd line desc
+#: src/gs-application.c:160
+msgid "Quit the running instance"
+msgstr "Ukončí spustenú inštanciu"
+
+# DK:cmd desc
+#: src/gs-application.c:162
+msgid "Prefer local file sources to AppStream"
+msgstr "Budú sa preferovať miestne zdroje súborov pre AppStream"
+
+#: src/gs-application.c:164
+msgid "Show version number"
+msgstr "Zobrazí číslo verzie"
+
+#: src/gs-application.c:358
+msgid "Copyright © 2016–2021 GNOME Software contributors"
+msgstr ""
+
+#: src/gs-application.c:361
+msgid "translator-credits"
+msgstr "Dušan Kazik <prescott66@gmail.com>"
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:374 src/gs-shell.c:2141
+msgid "About Software"
+msgstr "O aplikácii Softvér"
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:377
+msgid "A nice way to manage the software on your system."
+msgstr "Pohodlný spôsob správy softvéru vo vašom systéme."
+
+#. TRANSLATORS: we tried to show an app that did not exist
+#: src/gs-application.c:566
+msgid "Sorry! There are no details for that application."
+msgstr "Prepáčte, pre túto aplikáciu nie sú žiadne podrobnosti."
+
+#. 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:148 src/gs-storage-context-dialog.c:128
+msgid "Installed Size"
+msgstr "Veľkosť po nainštalovaní"
+
+#: src/gs-app-context-bar.c:151
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data and %s of cache"
+msgstr "Zahŕňa %s, %s a %s."
+
+#: src/gs-app-context-bar.c:154
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of data"
+msgstr "Zahŕňa %s, %s a %s."
+
+#: src/gs-app-context-bar.c:157
+#, fuzzy, c-format
+#| msgid "Includes %s, %s and %s."
+msgid "Includes %s of cache"
+msgstr "Zahŕňa %s, %s a %s."
+
+#: src/gs-app-context-bar.c:160
+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:169 src/gs-storage-context-dialog.c:156
+msgid "Download Size"
+msgstr "Veľkosť preberania"
+
+#: src/gs-app-context-bar.c:172
+msgid "Needs no additional system downloads"
+msgstr ""
+
+#: src/gs-app-context-bar.c:174
+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:179
+#, 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:193
+#, fuzzy
+#| msgid "unknown"
+msgid "Size is unknown"
+msgstr "neznámy"
+
+# 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:257
+#, fuzzy
+#| msgid "Permissions"
+msgid "No permissions"
+msgstr "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:268
+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:275
+#, fuzzy
+#| msgid "System Services"
+msgid "Uses system services"
+msgstr "Systémové služby"
+
+#. 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:282
+#, fuzzy
+#| msgid "Session Services"
+msgid "Uses session services"
+msgstr "Služby relácie"
+
+#. 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:289
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Can access hardware devices"
+msgstr "Môže pristupovať k súborom systémových zariadení"
+
+#. 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:301
+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:313
+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:320
+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:327
+msgid "Can read your downloads"
+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:334 src/gs-safety-context-dialog.c:217
+#, fuzzy
+#| msgid "Can view and change any settings"
+msgid "Can access and change user settings"
+msgstr "Môže zobrazovať a meniť akékoľvek nastavenia"
+
+#. 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:341 src/gs-safety-context-dialog.c:201
+#, fuzzy
+#| msgid "Uses an old, insecure display system"
+msgid "Uses a legacy windowing system"
+msgstr "Používa starý, nezabezpečený 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:348 src/gs-safety-context-dialog.c:209
+#, fuzzy
+#| msgid "Requires additional permissions"
+msgid "Can acquire arbitrary permissions"
+msgstr "Požaduje dodatočné oprávnenia"
+
+#. 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:374 src/gs-safety-context-dialog.c:142
+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:381 src/gs-safety-context-dialog.c:139
+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:393
+#, fuzzy
+#| msgid "Proprietary"
+msgid "Proprietary code"
+msgstr "Uzavretá"
+
+#. 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:399
+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:406
+#, fuzzy
+#| msgid "Software Repository Identified"
+msgid "Software developer is verified"
+msgstr "Softvérový repozitár identifikovaný"
+
+#. 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:418 src/gs-app-context-bar.c:679
+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:426
+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:433
+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:440
+msgid "Unsafe"
+msgstr ""
+
+#: src/gs-app-context-bar.c:519 src/gs-app-context-bar.c:551
+#: src/gs-hardware-support-context-dialog.c:587
+msgid "Mobile Only"
+msgstr ""
+
+#: src/gs-app-context-bar.c:520
+msgid "Only works on a small screen"
+msgstr ""
+
+#: src/gs-app-context-bar.c:525 src/gs-app-context-bar.c:558
+#: src/gs-app-context-bar.c:565 src/gs-app-context-bar.c:605
+#: src/gs-app-context-bar.c:610 src/gs-hardware-support-context-dialog.c:567
+msgid "Desktop Only"
+msgstr ""
+
+#: src/gs-app-context-bar.c:526
+msgid "Only works on a large screen"
+msgstr ""
+
+#: src/gs-app-context-bar.c:530 src/gs-hardware-support-context-dialog.c:605
+msgid "Screen Size Mismatch"
+msgstr ""
+
+#: src/gs-app-context-bar.c:531 src/gs-hardware-support-context-dialog.c:606
+msgid "Doesn’t support your current screen size"
+msgstr ""
+
+#: src/gs-app-context-bar.c:552 src/gs-hardware-support-context-dialog.c:658
+#: src/gs-hardware-support-context-dialog.c:664
+msgid "Requires a touchscreen"
+msgstr ""
+
+#: src/gs-app-context-bar.c:559 src/gs-hardware-support-context-dialog.c:618
+#: src/gs-hardware-support-context-dialog.c:624
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a keyboard"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-app-context-bar.c:566
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a mouse"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-app-context-bar.c:577
+msgid "Gamepad Needed"
+msgstr ""
+
+#: src/gs-app-context-bar.c:578
+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:592
+msgid "Adaptive"
+msgstr ""
+
+#: src/gs-app-context-bar.c:593
+msgid "Works on phones, tablets and desktops"
+msgstr ""
+
+#: src/gs-app-context-bar.c:606
+msgid "Probably requires a keyboard or mouse"
+msgstr ""
+
+#: src/gs-app-context-bar.c:611
+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:654
+msgid "Contains no age-inappropriate content"
+msgstr ""
+
+#: src/gs-app-context-bar.c:703
+#, fuzzy
+#| msgid "No update description available."
+msgid "No age rating information available"
+msgstr "Nie je poskytnutý žiadny popis aktualizácie."
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * allows the application to be easily installed
+#: src/gs-app-row.c:143
+#, fuzzy
+#| msgid "Visit website"
+msgid "Visit Website"
+msgstr "Navštíviť webovú stránku"
+
+# GtkButton
+#. 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:149
+msgid "Install…"
+msgstr "Inštalovať…"
+
+#. 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:157 src/gs-updates-section.ui:61
+msgid "Cancel"
+msgstr "Zrušiť"
+
+# GtkButton
+#. 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:165 src/gs-common.c:297 src/gs-page.c:368
+msgid "Install"
+msgstr "Inštalovať"
+
+#. TRANSLATORS: this is a button in the updates panel
+#. * that allows the app to be easily updated live
+#: src/gs-app-row.c:173
+msgid "Update"
+msgstr "Aktualizovať"
+
+# GtkButton
+#. 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:178 src/gs-app-row.c:188 src/gs-details-page.ui:296
+#: src/gs-page.c:529
+#, fuzzy
+#| msgid "Install"
+msgid "Uninstall"
+msgstr "Inštalovať"
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * shows the status of an application being erased
+#: src/gs-app-row.c:202
+#, fuzzy
+#| msgid "Installing"
+msgid "Uninstalling"
+msgstr "Inštaluje sa"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:312
+msgid "Device cannot be used during update."
+msgstr "Zariadenie nie je možné používať počas aktualizácie."
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-app-row.c:322 src/gs-shell-search-provider.c:264
+#, 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:511
+#, 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:9
+#, fuzzy
+#| msgctxt "Menu subcategory of Development Tools"
+#| msgid "Translation"
+msgid "Translations"
+msgstr "Preklad"
+
+#: src/gs-app-translation-dialog.ui:133
+#, fuzzy
+#| msgctxt "Menu subcategory of Development Tools"
+#| msgid "Translation"
+msgid "_Translation Website"
+msgstr "Preklad"
+
+#. 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:10
+msgid "Login Required"
+msgstr "Vyžaduje sa prihlásenie"
+
+#: src/gs-basic-auth-dialog.ui:19 src/gs-details-page.ui:311
+#: src/gs-removal-dialog.ui:29 src/gs-review-dialog.ui:22
+msgid "_Cancel"
+msgstr "_Zrušiť"
+
+#: src/gs-basic-auth-dialog.ui:39
+msgid "_Login"
+msgstr "_Prihlásenie"
+
+#: src/gs-basic-auth-dialog.ui:99
+msgid "_User"
+msgstr "Po_užívateľ"
+
+#: src/gs-basic-auth-dialog.ui:119
+msgid "_Password"
+msgstr "_Heslo"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:209
+msgid "Other"
+msgstr "Ostatné"
+
+# 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:46 src/gs-overview-page.ui:118
+#, fuzzy
+#| msgid "Editor’s Pick"
+msgid "Editor’s Choice"
+msgstr "Výber tvorcov"
+
+# 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:74 src/gs-overview-page.ui:146
+#, fuzzy
+#| msgid "Updated"
+msgid "New & Updated"
+msgstr "Aktualizované"
+
+#. Heading for the rest of the apps on a category page
+#: src/gs-category-page.ui:102
+#, fuzzy
+#| msgid "Free Software"
+msgid "Other Software"
+msgstr "Slobodný softvér"
+
+#. TRANSLATORS: the user isn't reading the question
+#: lib/gs-cmd.c:193
+#, c-format
+msgid "Please enter a number from 1 to %u: "
+msgstr "Prosím, zadajte číslo v rozsahu od 1 do %u: "
+
+# cmdline description
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:256
+msgid "Choose an application:"
+msgstr "Zvoľte aplikáciu:"
+
+# 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 "Dobrodružné"
+
+#: 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 "Rolové"
+
+#: 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 "Biografia"
+
+#: 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 "Fikcia"
+
+#: 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 "Šport"
+
+# 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 ""
+
+#. 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
+#, fuzzy
+#| msgctxt "Menu subcategory of Video"
+#| msgid "Players"
+msgid "Play"
+msgstr "Prehrávače"
+
+#. 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
+#, fuzzy
+#| msgid "_Learn More"
+msgid "Learn"
+msgstr "_Zistiť viac"
+
+# GtkLabel
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:295
+#, fuzzy
+#| msgid "Developer"
+msgid "Develop"
+msgstr "Vývojár"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:298
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Codecs"
+msgid "Codecs"
+msgstr "Kodeky"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:300
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Hardware Drivers"
+msgid "Hardware Drivers"
+msgstr "Ovládače hardvéru"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:302
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Fonts"
+msgid "Fonts"
+msgstr "Písma"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:304
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Input Sources"
+msgid "Input Sources"
+msgstr "Zdroje vstupu"
+
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:306
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Language Packs"
+msgid "Language Packs"
+msgstr "Jazykové balíky"
+
+# cmdline description
+#. Translators: this is a menu category
+#: lib/gs-desktop-data.c:308
+#, fuzzy
+#| msgctxt "Menu of Add-ons"
+#| msgid "Localization"
+msgid "Localization"
+msgstr "Lokalizácia"
+
+#. 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:130 src/gs-common.c:153
+#, c-format
+msgid "%s is now installed"
+msgstr "Softvér %s je teraz nainštalovaný"
+
+#. TRANSLATORS: an application has been installed, but
+#. * needs a reboot to complete the installation
+#: src/gs-common.c:134 src/gs-common.c:157
+msgid "A restart is required for the changes to take effect."
+msgstr "Je potrebný reštart na uplatnenie zmien aplikácií."
+
+#. TRANSLATORS: this is the body of a notification that an application
+#. * has been successfully installed
+#: src/gs-common.c:138
+msgid "Application 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:146
+msgid "OS updates are now installed"
+msgstr "Aktualizácie operačného systému boli nainštalované"
+
+#. TRANSLATORS: this is the body of a notification that OS updates
+#. * have been successfully installed
+#: src/gs-common.c:149
+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:168 src/gs-common.c:720
+msgid "Restart"
+msgstr "Reštartovať"
+
+# DK: akcia po nainstalovani softveru
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:172
+msgid "Launch"
+msgstr "Spustiť"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:231
+msgid "Install Third-Party Software?"
+msgstr "Inštalovať softvér tretích strán?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:235 src/gs-repos-dialog.c:193
+msgid "Enable Third-Party Software Repository?"
+msgstr "Povoliť softvérový repozitár tretích strán?"
+
+#. 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 not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s nie je <a href=\"https://sk.wikipedia.org/wiki/"
+"Free_and_Open_Source_Software\">slobodný softvér s otvoreným zdrojom</a> a "
+"je poskytovaný zdrojom „%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:261
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s je poskytovaný zdrojom „%s“."
+
+#: src/gs-common.c:270
+msgid "This software repository must be enabled to continue installation."
+msgstr ""
+"Pre pokračovanie v inštalácii musí byť tento repozitár so softvérom povolený."
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:280
+#, 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 "
+"protizákonná."
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: src/gs-common.c:286
+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 "
+"protizákonná."
+
+#. TRANSLATORS: this is button text to not ask about non-free content again
+#: src/gs-common.c:293
+msgid "Don’t Warn Again"
+msgstr "Neupozorňovať ma znovu"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:302
+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:494
+msgid "Detailed errors from the package manager follow:"
+msgstr "Podrobné chybové správy od správcu balíkov:"
+
+# GtkLabel
+#: src/gs-common.c:513 src/gs-safety-context-dialog.ui:116
+msgid "Details"
+msgstr "Podrobnosti"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-common.c:695
+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é"
+
+# GsAppFolderDialog title, GtkLabel
+#. TRANSLATORS: we've just removed some apps
+#: src/gs-common.c:705
+#, fuzzy
+#| msgid "Enter GApplication service mode"
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "Vstúpi do servisného režimu GApplication"
+msgstr[1] "Vstúpi do servisného režimu GApplication"
+msgstr[2] "Vstúpi do servisného režimu GApplication"
+
+#. TRANSLATORS: the new apps will not be run until we restart
+#: src/gs-common.c:711
+msgid "A restart is required for it to take effect."
+msgid_plural "A restart is required for them to take effect."
+msgstr[0] "Je potrebný reštart na uplatnenie zmien aplikácií."
+msgstr[1] "Je potrebný reštart na uplatnenie zmien aplikácie."
+msgstr[2] "Je potrebný reštart na uplatnenie zmien aplikácií."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:718
+msgid "Not Now"
+msgstr "Teraz nie"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:810
+msgid "Just now"
+msgstr ""
+
+#: src/gs-common.c:812
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/gs-common.c:816
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/gs-common.c:820
+#, fuzzy, c-format
+#| msgid "Two days ago"
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "Pred dvoma dňami"
+msgstr[1] "Pred dvoma dňami"
+msgstr[2] "Pred dvoma dňami"
+
+#: src/gs-common.c:824
+#, fuzzy, c-format
+#| msgid "One week ago"
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "Pred týždňom"
+msgstr[1] "Pred týždňom"
+msgstr[2] "Pred týždňom"
+
+#: src/gs-common.c:828
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/gs-common.c:832
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+# cmdline description
+#. TRANSLATORS: this is a what we use in notifications if the app's name is unknown
+#: src/gs-dbus-helper.c:283
+msgid "An application"
+msgstr "Aplikácia"
+
+#. TRANSLATORS: this is a notification displayed when an app needs additional MIME types.
+#: src/gs-dbus-helper.c:289
+#, c-format
+msgid "%s is requesting additional file format support."
+msgstr "Softvér %s požaduje dodatočnú podporu formátu súborov."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:291
+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:295
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr "Softvér %s požaduje dodatočné písma."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:297
+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:301
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr "Softvér %s požaduje dodatočné multimediálne kodeky."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:303
+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:307
+#, c-format
+msgid "%s is requesting additional printer drivers."
+msgstr "Softvér %s požaduje dodatočné ovládače tlačiarne."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:309
+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:313
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "Softvér %s požaduje dodatočné balíky."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:315
+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:324
+msgid "Find in Software"
+msgstr "Nájsť softvér"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-description-box.c:65 src/gs-description-box.c:171
+#: src/gs-details-page.ui:966
+msgid "_Show More"
+msgstr "Zo_braziť viac"
+
+#: src/gs-description-box.c:65
+#, fuzzy
+#| msgid "_Show More"
+msgid "_Show Less"
+msgstr "Zo_braziť viac"
+
+#: src/gs-details-page.c:369
+msgid "Removing…"
+msgstr "Odstraňuje sa…"
+
+#: src/gs-details-page.c:379
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires restart to finish install"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-details-page.c:386
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires restart to finish remove"
+msgstr "Vyžaduje sa reštart"
+
+#. 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:403
+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:410
+msgid "Pending update…"
+msgstr "Čakajúca aktualizácia…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:426
+msgid "Preparing…"
+msgstr "Pripravuje sa…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:429
+#, fuzzy
+#| msgid "Installing"
+msgid "Uninstalling…"
+msgstr "Inštaluje sa"
+
+# GtkButton
+#. 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:833 src/gs-details-page.c:859
+#: src/gs-details-page.ui:240
+msgid "_Install"
+msgstr "_Inštalovať"
+
+#: src/gs-details-page.c:849
+#, fuzzy
+#| msgid "Restart"
+msgid "_Restart"
+msgstr "Reštartovať"
+
+# 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:873
+msgid "_Install…"
+msgstr "_Inštalovať…"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1413
+msgid "You need internet access to write a review"
+msgstr "Ak chcete napísať recenziu, musíte byť pripojený k internetu"
+
+#: src/gs-details-page.c:1559 src/gs-details-page.c:1575
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Nie je možné nájsť „%s“"
+
+#. TRANSLATORS: This is a title for the app details page,
+#. * shown when it’s loading the details of an app.
+#: src/gs-details-page.c:2131
+#, fuzzy
+#| msgid "Removing…"
+msgid "Loading…"
+msgstr "Odstraňuje sa…"
+
+# GtkLabel
+#: src/gs-details-page.ui:8
+msgid "Details page"
+msgstr "Stránka s podrobnosťami"
+
+#: src/gs-details-page.ui:40
+#, fuzzy
+#| msgid "Downloading application ratings…"
+msgid "Loading application details…"
+msgstr "Preberajú sa hodnotenia aplikácií…"
+
+#: src/gs-details-page.ui:79
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+
+#: src/gs-details-page.ui:87
+#, fuzzy
+#| msgctxt "Menu subcategory of Development Tools"
+#| msgid "Translation"
+msgid "Help _Translate"
+msgstr "Preklad"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:257
+msgid "_Open"
+msgstr "_Otvoriť"
+
+#: src/gs-details-page.ui:270
+msgid "_Update"
+msgstr "_Aktualizovať"
+
+#: src/gs-details-page.ui:336
+msgid "Downloading"
+msgstr "Preberá sa"
+
+#. Translators: A label for a button to add a shortcut to the selected application.
+#: src/gs-details-page.ui:358
+msgid "_Add shortcut"
+msgstr "_Pridať odkaz"
+
+# GtkButton
+#. Translators: A label for a button to remove a shortcut to the selected application.
+#: src/gs-details-page.ui:374
+msgid "Re_move shortcut"
+msgstr "O_dstrániť odkaz"
+
+#: src/gs-details-page.ui:466 src/gs-installed-page.ui:120
+msgid "Add-ons"
+msgstr "Doplnky"
+
+#: src/gs-details-page.ui:478
+msgid "Selected add-ons will be installed with the application."
+msgstr "Vybraté doplnky budú nainštalované spolu s aplikáciou."
+
+#: src/gs-details-page.ui:586
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Táto aplikácia sa môže používať iba ak je aktívne internetové pripojenie."
+
+#: src/gs-details-page.ui:607
+msgid "Software Repository Included"
+msgstr "Zahrnutý softvérový repozitár"
+
+#: src/gs-details-page.ui:608
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"V tejto aplikácii je zahrnutý repozitár so softvérom, ktorý poskytuje "
+"aktualizácie spolu s prístupom k ďalšiemu softvéru."
+
+#: src/gs-details-page.ui:626
+msgid "No Software Repository Included"
+msgstr "Žiadny zahrnutý softvérový repozitár"
+
+#: src/gs-details-page.ui:627
+msgid ""
+"This application 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 "
+"aktualizovaná na nové verzie."
+
+#: src/gs-details-page.ui:646
+msgid ""
+"This software is already provided by your distribution and should not be "
+"replaced."
+msgstr "Softvér je už poskytovaný vašou distribúciou a nemal by byť nahradený."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:664
+msgid "Software Repository Identified"
+msgstr "Softvérový repozitár identifikovaný"
+
+#: src/gs-details-page.ui:665
+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:666
+msgid "Only use software repositories that you trust."
+msgstr "Používajte iba softvérové repozitáre, ktorým dôverujete."
+
+#: src/gs-details-page.ui:731
+msgid "No Metadata"
+msgstr ""
+
+#: src/gs-details-page.ui:741
+msgid ""
+"This software doesn’t provide any links to a website, code repository or "
+"issue tracker."
+msgstr ""
+
+# GtkButton
+#: src/gs-details-page.ui:769
+#, fuzzy
+#| msgid "_Website"
+msgid "Project _Website"
+msgstr "_Webová stránka"
+
+#: src/gs-details-page.ui:795
+msgid "_Donate"
+msgstr "_Prispieť"
+
+#: src/gs-details-page.ui:821
+#, fuzzy
+#| msgctxt "Menu subcategory of Development Tools"
+#| msgid "Translation"
+msgid "Contribute _Translations"
+msgstr "Preklad"
+
+#: src/gs-details-page.ui:847
+msgid "_Report an Issue"
+msgstr ""
+
+#: src/gs-details-page.ui:873
+msgid "_Help"
+msgstr ""
+
+#. Translators: Header of the section with other users' opinions about the app.
+#: src/gs-details-page.ui:926
+msgid "Reviews"
+msgstr "Recenzie"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:944
+msgid "_Write a Review"
+msgstr "_Napísať recenziu"
+
+#. Translators: This is a label in the header bar, followed by a drop down to choose between different source repos
+#. Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’).
+#: src/gs-details-page.ui:1043 src/gs-safety-context-dialog.ui:189
+msgid "Source"
+msgstr "Zdroj"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:226
+msgid "Downloading extra metadata files…"
+msgstr "Preberajú sa súbory metaúdajov navyše…"
+
+#. 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: Application 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é písma pre skripty jazyka %s"
+msgstr[1] "Dostupné písma pre skript jazyka %s"
+msgstr[2] "Dostupné písma pre skripty jazyka %s"
+
+#. TRANSLATORS: Application 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:243
+#, fuzzy
+#| msgid "Screenshot size not found"
+msgid "Requested software not found"
+msgstr "Veľkosť snímky obrazovky sa nenašla"
+
+#: src/gs-extras-page.c:245
+#, fuzzy
+#| msgid "Unable to Find Requested Software"
+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:341
+#, c-format
+msgid "%s not found"
+msgstr "Kodek %s sa nenašiel"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:345
+msgid "on the website"
+msgstr "na webovej stránke"
+
+#. 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:352
+#, c-format
+msgid "No applications are available that provide the file %s."
+msgstr "Nie sú dostupné žiadne aplikácie, ktoré poskytujú 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:356 src/gs-extras-page.c:367 src/gs-extras-page.c:378
+#, c-format
+msgid ""
+"Information about %s, as well as options for how to get missing applications "
+"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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:363 src/gs-extras-page.c:385
+#, c-format
+msgid "No applications are available for %s support."
+msgstr "Nie sú dostupné žiadne aplikácie s podporou pre %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:374
+#, 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:389
+#, 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 ""
+"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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:396
+#, c-format
+msgid "No fonts are available for the %s script support."
+msgstr "Nie sú dostupné žiadne písma s podporou skriptov v jazyku %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:400
+#, c-format
+msgid ""
+"Information about %s, as well as options for how to get additional fonts "
+"might be found %s."
+msgstr ""
+"Informácie o kodeku %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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:407
+#, 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:411
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:418
+#, c-format
+msgid "No Plasma resources are available for %s support."
+msgstr "Nie sú dostupné žiadne zdroje prostredia Plasma s podporou %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:422
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:429
+#, 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:433
+#, 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 kodeku %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:477
+#, fuzzy
+#| msgid "Documentation"
+msgid "the documentation"
+msgstr "Dokumentácia"
+
+#. 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:483
+#, 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] ""
+"Bohužiaľ, nepodarilo sa nájsť kodeky %s, ktoré ste hľadali. Prosím, pre viac "
+"informácií navštívte %s."
+msgstr[1] ""
+"Bohužiaľ, nepodarilo sa nájsť kodek %s, ktorý ste hľadali. Prosím, pre viac "
+"informácií navštívte %s."
+msgstr[2] ""
+"Bohužiaľ, nepodarilo sa nájsť kodeky %s, ktoré ste hľadali. Prosím, pre viac "
+"informácií navštívte %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:492
+#, 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] ""
+"Bohužiaľ, nepodarilo sa nájsť kodeky %s, ktoré ste hľadali. Prosím, pre viac "
+"informácií navštívte %s."
+msgstr[1] ""
+"Bohužiaľ, nepodarilo sa nájsť kodek %s, ktorý ste hľadali. Prosím, pre viac "
+"informácií navštívte %s."
+msgstr[2] ""
+"Bohužiaľ, nepodarilo sa nájsť kodeky %s, ktoré ste hľadali. Prosím, pre viac "
+"informácií navštívte %s."
+
+#: src/gs-extras-page.c:562 src/gs-extras-page.c:618 src/gs-extras-page.c:657
+#, fuzzy, c-format
+#| msgid "Failed to find any search results"
+msgid "Failed to find any search results: %s"
+msgstr "Zlyhalo nájdenie akýchkoľvek výsledkov hľadania"
+
+#: src/gs-extras-page.c:848
+#, c-format
+msgid "%s file format"
+msgstr "Formát súboru %s"
+
+#: src/gs-extras-page.c:1223
+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-featured-carousel.ui:43
+msgid "Previous"
+msgstr "Predchádzajúca"
+
+#: src/gs-featured-carousel.ui:73
+msgid "Next"
+msgstr "Ďalšia"
+
+# GtkLabel
+#: src/gs-featured-carousel.ui:100
+#, fuzzy
+#| msgid "Featured App"
+msgid "Featured Apps List"
+msgstr "Aplikácia základnej výbavy"
+
+# DK:window title
+#: src/gs-first-run-dialog.ui:10
+msgid "Welcome"
+msgstr "Vitajte"
+
+#: src/gs-first-run-dialog.ui:27
+msgid "Welcome to Software"
+msgstr "Vitajte v programe Softvér"
+
+#: src/gs-first-run-dialog.ui:28
+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."
+
+#: src/gs-first-run-dialog.ui:34
+#, fuzzy
+#| msgid "Free Software"
+msgid "_Browse Software"
+msgstr "Slobodný softvér"
+
+#: src/gs-hardware-support-context-dialog.c:561
+#: src/gs-hardware-support-context-dialog.c:570
+#, fuzzy
+#| msgid "Open Desktop Ratings Support"
+msgid "Desktop Support"
+msgstr "Podpora služby Open Desktop Ratings"
+
+#: src/gs-hardware-support-context-dialog.c:562
+#: src/gs-hardware-support-context-dialog.c:571
+msgid "Supports being used on a large screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:564
+msgid "Desktop Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:565
+msgid "Not enough information to know if large screens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:568
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a large screen"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-hardware-support-context-dialog.c:573
+#, fuzzy
+#| msgid "Open Desktop Ratings Support"
+msgid "Desktop Not Supported"
+msgstr "Podpora služby Open Desktop Ratings"
+
+#: src/gs-hardware-support-context-dialog.c:574
+msgid "Cannot be used on a large screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:581
+#: src/gs-hardware-support-context-dialog.c:590
+#, fuzzy
+#| msgid "Limba Support"
+msgid "Mobile Support"
+msgstr "Podpora nástroja Limba"
+
+#: src/gs-hardware-support-context-dialog.c:582
+#: src/gs-hardware-support-context-dialog.c:591
+msgid "Supports being used on a small screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:584
+msgid "Mobile Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:585
+msgid "Not enough information to know if small screens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:588
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a small screen"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-hardware-support-context-dialog.c:593
+msgid "Mobile Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:594
+msgid "Cannot be used on a small screen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:617
+#: src/gs-hardware-support-context-dialog.c:626
+#, fuzzy
+#| msgid "Limba Support"
+msgid "Keyboard Support"
+msgstr "Podpora nástroja Limba"
+
+#: src/gs-hardware-support-context-dialog.c:620
+msgid "Keyboard Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:621
+msgid "Not enough information to know if keyboards are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:623
+#, fuzzy
+#| msgid "Login Required"
+msgid "Keyboard Required"
+msgstr "Vyžaduje sa prihlásenie"
+
+#: src/gs-hardware-support-context-dialog.c:627
+msgid "Supports keyboards"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:629
+msgid "Keyboard Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:630
+msgid "Cannot be used with a keyboard"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:637
+#: src/gs-hardware-support-context-dialog.c:646
+#, fuzzy
+#| msgid "Steam Support"
+msgid "Mouse Support"
+msgstr "Podpora služby Steam"
+
+#: src/gs-hardware-support-context-dialog.c:638
+#: src/gs-hardware-support-context-dialog.c:644
+msgid "Requires a mouse or pointing device"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:640
+msgid "Mouse Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:641
+msgid ""
+"Not enough information to know if mice or pointing devices are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:643
+#, fuzzy
+#| msgid "Login Required"
+msgid "Mouse Required"
+msgstr "Vyžaduje sa prihlásenie"
+
+#: src/gs-hardware-support-context-dialog.c:647
+msgid "Supports mice and pointing devices"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:649
+msgid "Mouse Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:650
+msgid "Cannot be used with a mouse or pointing device"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:657
+#: src/gs-hardware-support-context-dialog.c:666
+msgid "Touchscreen Support"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Touchscreen Support Unknown"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:661
+msgid "Not enough information to know if touchscreens are supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:663
+#, fuzzy
+#| msgid "Login Required"
+msgid "Touchscreen Required"
+msgstr "Vyžaduje sa prihlásenie"
+
+#: src/gs-hardware-support-context-dialog.c:667
+msgid "Supports touchscreens"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:669
+msgid "Touchscreen Not Supported"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:670
+msgid "Cannot be used with a touchscreen"
+msgstr ""
+
+#: src/gs-hardware-support-context-dialog.c:683
+#, fuzzy
+#| msgid "Login Required"
+msgid "Gamepad Required"
+msgstr "Vyžaduje sa prihlásenie"
+
+#: src/gs-hardware-support-context-dialog.c:684
+#, fuzzy
+#| msgid "Requires Restart"
+msgid "Requires a gamepad"
+msgstr "Vyžaduje sa reštart"
+
+#: src/gs-hardware-support-context-dialog.c:686
+#, fuzzy
+#| msgid "Snap Support"
+msgid "Gamepad Support"
+msgstr "Podpora balíkov Snap"
+
+#: src/gs-hardware-support-context-dialog.c:687
+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:696
+#, c-format
+msgid "%s probably works on this device"
+msgstr "Aplikácia %s bude na tomto zariadení pravdepodobne pracovať"
+
+#. Translators: The app will work on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:703
+#, c-format
+msgid "%s works on this device"
+msgstr "Aplikácia %s bude na tomto zariadení pracovať"
+
+#. Translators: The app may not work fully on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:710
+#, c-format
+msgid "%s will not work properly on this device"
+msgstr "Aplikácia %s nebude na tomto zariadení pracovať správne"
+
+#. Translators: The app will not work properly on the current hardware.
+#. * The placeholder is the app name.
+#: src/gs-hardware-support-context-dialog.c:717
+#, c-format
+msgid "%s will not work on this device"
+msgstr "Aplikácia %s nebude na tomto zariadení pracovať"
+
+#. 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:9
+#| msgid "Firmware Upgrade Support"
+msgid "Hardware Support"
+msgstr "Podpora hardvéru"
+
+#: src/gs-installed-page.ui:7
+msgid "Installed page"
+msgstr "Nainštalovaný balík"
+
+#: src/gs-installed-page.ui:54
+msgid "In Progress"
+msgstr "Prebieha"
+
+# cmdline description
+#. 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:106
+#| msgid "An application"
+msgid "Applications"
+msgstr "Aplikácie"
+
+# cmdline description
+#: src/gs-installed-page.ui:98
+msgid "System Applications"
+msgstr "Systémové aplikácie"
+
+#: src/gs-license-tile.c:93
+msgid "Community Built"
+msgstr ""
+
+#. Translators: The placeholder here is the name of a software license.
+#: src/gs-license-tile.c:101
+#, 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:106
+msgid "Proprietary"
+msgstr "Uzavretá"
+
+#: src/gs-license-tile.c:113
+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."
+msgstr ""
+
+#: src/gs-license-tile.ui:132
+msgid "_Get Involved"
+msgstr ""
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:62 src/gs-loading-page.c:66
+msgid "Software catalog is being downloaded"
+msgstr "Prebieha preberanie katalógu so softvérom"
+
+#: src/gs-loading-page.ui:7
+msgid "Loading page"
+msgstr "Načítava sa stránka"
+
+#: src/gs-loading-page.ui:14
+msgid "Starting up…"
+msgstr "Spúšťa sa…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-metered-data-dialog.ui:17
+#: src/gs-shell.ui:264
+msgid "Automatic Updates Paused"
+msgstr "Automatické aktualizácie pozastavené"
+
+#: 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 ""
+"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é."
+
+#: src/gs-metered-data-dialog.ui:53
+msgid "Open Network _Settings"
+msgstr "Otvoriť nastavenia _siete"
+
+#: src/gs-moderate-page.ui:7
+msgid "Moderate page"
+msgstr "Strana s moderovaním"
+
+#: src/gs-moderate-page.ui:87
+msgid "There are no reviews to moderate"
+msgstr "Neexistujú žiadne recenzie na moderovanie"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-odrs-provider.c:1266
+msgid "Downloading application ratings…"
+msgstr "Preberajú sa hodnotenia aplikácií…"
+
+#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm"
+#: src/gs-origin-popover-row.c:55
+msgid "Name"
+msgstr "Názov"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:72
+msgid "system"
+msgstr "systém"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:75
+msgid "user"
+msgstr "používateľ"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-origin-popover-row.c:91
+msgid "Channel"
+msgstr "Kanál"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:96 src/gs-origin-popover-row.ui:93
+msgid "Branch"
+msgstr "Vetva"
+
+#: src/gs-origin-popover-row.ui:35
+msgid "URL"
+msgstr "URL"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:64
+msgid "Installation"
+msgstr "Inštalácia"
+
+# GtkLabel
+#. Translators: The available version of an app
+#: src/gs-origin-popover-row.ui:122
+msgid "Version"
+msgstr "Verzia"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:271
+msgid "Additions"
+msgstr "Doplnky"
+
+# GtkButton
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:275
+msgid "Removals"
+msgstr "Na odstránenie"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gs-os-update-page.c:279 src/gs-shell.ui:339 src/gs-updates-page.c:1356
+msgid "Updates"
+msgstr "Aktualizácie"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:283
+msgid "Downgrades"
+msgstr "Zníženia verzií"
+
+#. 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:607
+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:609
+#, fuzzy, c-format
+#| msgid ""
+#| "Provides access to additional software, including web browsers and games."
+msgid ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+msgstr ""
+"Poskytuje prístup k dodatočnému softvéru, vrátane webových prehliadačov a "
+"hier."
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:618 src/gs-repos-dialog.c:198
+msgid "Enable"
+msgstr "Povoliť"
+
+#. 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:673 src/gs-shell.ui:306
+#, fuzzy
+#| msgid "_Explore"
+msgid "Explore"
+msgstr "_Prehliadať"
+
+#: src/gs-overview-page.ui:8
+msgid "Overview page"
+msgstr "Strana s náhľadom"
+
+#: src/gs-overview-page.ui:40
+msgid "Enable Third Party Software Repositories?"
+msgstr "Povoliť softvérové repozitáre tretích strán?"
+
+# GtkLabel
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:175
+#, fuzzy
+#| msgid "Categories"
+msgid "Other Categories"
+msgstr "Kategórie"
+
+# GtkLabel
+# PM: čo sú údaje aplikácie? nemá tu byť údaje o aplikácií?
+#: src/gs-overview-page.ui:239
+msgid "No Application Data Found"
+msgstr "Nenašli sa žiadne údaje aplikácie"
+
+#: lib/gs-plugin-loader.c:3023
+#, fuzzy
+#| msgid "Unknown"
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Neznáma"
+
+#: src/gs-page.c:276
+#, fuzzy
+#| msgid "Pending installation…"
+msgid "User declined installation"
+msgstr "Čakajúca inštalácia…"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:359
+#, c-format
+msgid "Prepare %s"
+msgstr "Pripravuje sa aplikácia %s"
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * repository name, e.g. 'GNOME Nightly'
+#: src/gs-page.c:498
+#, c-format
+msgid "Are you sure you want to remove the %s repository?"
+msgstr "Naozaj chcete odstrániť repozitár %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:502
+#, 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 applications from %s will be uninstalled, and you will have to re-"
+"install the repository to use them again."
+msgstr ""
+"Všetky aplikácia z repozitára %s budú odstránené a pre ich opätovné použitie "
+"budete musieť repozitár znova nainštalovať."
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:510
+#, fuzzy, c-format
+#| msgid "Are you sure you want to purchase %s?"
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Naozaj chcete kúpiť aplikáciu %s?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:513
+#, fuzzy, 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 ""
+"Softvér %s bude odstránený a pre opätovné použitie ho budete musieť znova "
+"nainštalovať."
+
+# GtkLabel
+#. Translators: This is the accessibility label for a screenshot.
+#: src/gs-picture.c:391
+#| msgid "Mature"
+msgid "Picture"
+msgstr "Obrázok"
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Aktualizácia predvolieb"
+
+#: src/gs-prefs-dialog.ui:18
+#, 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 ""
+"Automatické aktualizácie sú zakázané, keď ste pripojený na mobilné alebo "
+"obmedzené pripojenia."
+
+#: src/gs-prefs-dialog.ui:22
+msgid "Automatic Updates"
+msgstr "Automatické aktualizácie"
+
+#: src/gs-prefs-dialog.ui:23
+#, fuzzy
+#| msgid "Installs any pending updates in the background"
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Nainštaluje akékoľvek čakajúce aktualizácie na pozadí"
+
+#: src/gs-prefs-dialog.ui:37
+msgid "Automatic Update Notifications"
+msgstr "Oznámenia o automatickej aktualizácii"
+
+#: src/gs-prefs-dialog.ui:38
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Zobraziť oznámenia, po automatickej inštalácii aktualizácií."
+
+#. 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:110
+#, 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 ""
+"Niektorý z nainštalovaného softvéru nie je kompatibilný so systémom %s. Ak "
+"budete pokračovať, nasledovný softvér bude automaticky odstránený počas "
+"aktualizácie:"
+
+#: src/gs-removal-dialog.ui:23
+msgid "Incompatible Software"
+msgstr "Nekompatibilný softvér"
+
+#: src/gs-removal-dialog.ui:36
+msgid "_Continue"
+msgstr "_Pokračovať"
+
+#. TRANSLATORS: The '%s' is replaced with a repository name, like "Fedora Modular - x86_64"
+#: src/gs-repos-dialog.c:265
+#, 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 receive updates."
+msgstr ""
+"Softvér nainštalovaný z tohto repozitára už nebude dostávať aktualizácie, "
+"vrátane bezpečnostných opráv."
+
+#: src/gs-repos-dialog.c:274
+#| msgid "Software Repositories"
+msgid "Disable Repository?"
+msgstr "Zakázať repozitár?"
+
+#: src/gs-repos-dialog.c:274
+#| msgid "Software Repositories"
+msgid "Remove Repository?"
+msgstr "Odstrániť repozitár?"
+
+#. TRANSLATORS: this is button text to disable a repo
+#: src/gs-repos-dialog.c:280
+#| msgid "Disable"
+msgid "_Disable"
+msgstr "_Zakázať"
+
+# GtkButton
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:283
+msgid "_Remove"
+msgstr "O_dstrániť"
+
+#: src/gs-repos-dialog.c:519
+#, fuzzy
+#| msgid "Software Repositories"
+msgid "Enable New Repositories"
+msgstr "Softvérové repozitáre"
+
+#: src/gs-repos-dialog.c:520
+msgid "Turn on new repositories when they are added."
+msgstr ""
+
+# DK:cmd desc
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-repos-dialog.c:529
+#| msgid "More information"
+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:534
+#, fuzzy, c-format
+#| msgid "Access additional software from selected third party sources."
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Prístup k dodatočnému softvéru z vybraných zdrojov tretích strán."
+
+#: src/gs-repos-dialog.c:539
+#, fuzzy
+#| msgid "Third Party Repositories"
+msgid "Fedora Third Party Repositories"
+msgstr "Repozitáre tretích strán"
+
+#. 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:676
+msgid "the operating system"
+msgstr "operačný systém"
+
+#. 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:734
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Tieto repozitáre dodávajú predvolený softvér poskytovaný distribúciou %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:10 src/gs-shell.ui:77 src/gs-update-dialog.ui:10
+msgid "Software Repositories"
+msgstr "Softvérové repozitáre"
+
+#: src/gs-repos-dialog.ui:50
+#| msgid "Software Repositories"
+msgid "No Repositories"
+msgstr "Žiadne repozitáre"
+
+# * https://bugzilla.gnome.org/show_bug.cgi?id=726990
+#. TRANSLATORS: This string is used to construct the 'X applications
+#. installed' sentence, describing a software repository.
+#: src/gs-repo-row.c:156
+#, c-format
+msgid "%u application installed"
+msgid_plural "%u applications 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 is used to construct the 'X add-ons
+#. installed' sentence, describing a software repository.
+#: src/gs-repo-row.c:163
+#, 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"
+
+# cmdline description
+#. 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:171
+#, c-format
+msgid "%u application"
+msgid_plural "%u applications"
+msgstr[0] "%u aplikácií"
+msgstr[1] "%u aplikácia"
+msgstr[2] "%u aplikácie"
+
+#. 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:177
+#, 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 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:184
+#, 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é"
+
+#. 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:233
+#, 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:82
+msgid "Hate it"
+msgstr "Nemám ho rád"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:86
+msgid "Don’t like it"
+msgstr "Nepáči sa mi"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:90
+msgid "It’s OK"
+msgstr "Je v poriadku"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:94
+msgid "Like it"
+msgstr "Páči sa mi"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:98
+msgid "Love it"
+msgstr "Zbožňujem ho"
+
+#. TRANSLATORS: the review can't just be copied and pasted
+#: src/gs-review-dialog.c:120
+msgid "Please take more time writing the review"
+msgstr "Prosím, venujte viac času napísaniu recenzie"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:124
+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:128
+msgid "The summary is too short"
+msgstr "Súhrn je príliš krátky"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:132
+msgid "The summary is too long"
+msgstr "Súhrn je príliš dlhý"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:136
+msgid "The description is too short"
+msgstr "Popis je príliš krátky"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:140
+msgid "The description is too long"
+msgstr "Popis je príliš dlhý"
+
+# dialog title
+#. 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 "Odoslanie recenzie"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:34
+msgid "_Post"
+msgstr "O_doslať"
+
+#: src/gs-review-dialog.ui:74
+msgid "Rating"
+msgstr "Hodnotenie"
+
+#: src/gs-review-dialog.ui:110
+msgid "Summary"
+msgstr "Súhrn"
+
+#: src/gs-review-dialog.ui:120
+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ť“."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:145
+msgctxt "app review"
+msgid "Review"
+msgstr "Recenzia"
+
+#: src/gs-review-dialog.ui:155
+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."
+
+#: src/gs-review-dialog.ui:187
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>."
+msgstr ""
+"Zistite aké údaje sú odosielané v našich <a href=\"https://odrs.gnome.org/"
+"privacy\">zásadách o súkromí</a>."
+
+#: src/gs-review-histogram.c:72
+#, c-format
+msgid "%u review total"
+msgid_plural "%u reviews total"
+msgstr[0] "Celkovo %u recenzií"
+msgstr[1] "Celkovo %u recenzia"
+msgstr[2] "Celkovo %u recenzie"
+
+#: src/gs-review-histogram.ui:100
+#, fuzzy
+#| msgid "About Software"
+msgid "out of 5 stars"
+msgstr "O aplikácii Softvér"
+
+#. TRANSLATORS: this is when a user doesn't specify a name
+#: src/gs-review-row.c:58
+#, fuzzy
+#| msgid "Unknown"
+msgctxt "Reviewer name"
+msgid "Unknown"
+msgstr "Neznáma"
+
+#. 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ásiť nevhodné, nemravné, alebo diskriminujúce správanie."
+
+#. 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ásení bude recenzia skrytá, až kým nebude skontrolovaná "
+"administrátorom."
+
+# dialog title
+#. TRANSLATORS: window title when
+#. * reporting a user-submitted review
+#. * for moderation
+#: src/gs-review-row.c:242
+msgid "Report Review?"
+msgstr "Nahlásiť recenziu?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:246
+msgid "Report"
+msgstr "Nahlásiť"
+
+#. Translators: Users can express their opinions about other users' opinions about the apps.
+#: src/gs-review-row.ui:89
+msgid "Was this review useful to you?"
+msgstr "Bola táto recenzia pre vás užitočná?"
+
+#: src/gs-review-row.ui:106
+msgid "Yes"
+msgstr "Áno"
+
+#: src/gs-review-row.ui:115
+msgid "No"
+msgstr "Nie"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:124
+msgid "Meh"
+msgstr "Nestojí to za reč"
+
+# GtkButton
+#: src/gs-review-row.ui:135
+msgid "Report…"
+msgstr "Nahlásiť…"
+
+# GtkButton
+#: src/gs-review-row.ui:148
+msgid "Remove…"
+msgstr "Odstrániť…"
+
+#: src/gs-safety-context-dialog.c:140
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:143
+msgid ""
+"Application isn’t sandboxed but the distribution has checked that it is not "
+"malicious"
+msgstr ""
+
+# GtkLabel
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:150
+#, fuzzy
+#| msgid "Permissions"
+msgid "No Permissions"
+msgstr "Oprávnenia"
+
+#: src/gs-safety-context-dialog.c:151
+#, fuzzy
+#| msgid "This application is fully sandboxed."
+msgid "App is fully sandboxed"
+msgstr "Aplikácia je úplne izolovaná."
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:162
+#, fuzzy
+#| msgid "Network Settings"
+msgid "Network Access"
+msgstr "Nastavenia siete"
+
+#: src/gs-safety-context-dialog.c:163
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Can access the internet"
+msgstr "Môže pristupovať k súborom systémových zariadení"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:166
+#, fuzzy
+#| msgid "No Network"
+msgid "No Network Access"
+msgstr "Žiadne pripojenie k sieti"
+
+#: src/gs-safety-context-dialog.c:167
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Cannot access the internet"
+msgstr "Môže pristupovať k súborom systémových zariadení"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:173
+#, fuzzy
+#| msgid "System Services"
+msgid "Uses System Services"
+msgstr "Systémové služby"
+
+#: src/gs-safety-context-dialog.c:174
+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:181
+#, fuzzy
+#| msgid "Session Services"
+msgid "Uses Session Services"
+msgstr "Služby relácie"
+
+#: src/gs-safety-context-dialog.c:182
+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:189
+#, fuzzy
+#| msgid "Devices"
+msgid "Device Access"
+msgstr "Zariadenia"
+
+#: src/gs-safety-context-dialog.c:190
+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:193
+#, fuzzy
+#| msgctxt "Menu subcategory of Internet"
+#| msgid "Remote Access"
+msgid "No Device Access"
+msgstr "Vzdialený prístup"
+
+#: src/gs-safety-context-dialog.c:194
+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:200
+#, fuzzy
+#| msgid "Legacy display system"
+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:208
+#, fuzzy
+#| msgid "Permissions"
+msgid "Arbitrary Permissions"
+msgstr "Oprávnenia"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:216
+#, fuzzy
+#| msgid "Settings"
+msgid "User Settings"
+msgstr "Nastavenia"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:228
+msgid "Full File System Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:229
+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:237
+msgid "Home Folder Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:238
+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:246
+msgid "Full File System Read Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:247
+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:256
+msgid "Home Folder Read Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Download Folder Read/Write Access"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:267
+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:278
+#, fuzzy
+#| msgid "Downloads folder"
+msgid "Download Folder Read Access"
+msgstr "Priečinok Stiahnuté"
+
+#: src/gs-safety-context-dialog.c:279
+msgid "Can read 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:292
+#, fuzzy
+#| msgid "File system"
+msgid "No File System Access"
+msgstr "Súborový systém"
+
+#: src/gs-safety-context-dialog.c:293
+#, fuzzy
+#| msgid "Can access system device files"
+msgid "Cannot access the file system at all"
+msgstr "Môže pristupovať k súborom systémových zariadení"
+
+#. Translators: This refers to permissions (for example, from flatpak) which an app requests from the user.
+#: src/gs-safety-context-dialog.c:307
+#| msgid "Proprietary"
+msgid "Proprietary Code"
+msgstr "Uzavretý kód"
+
+#: src/gs-safety-context-dialog.c:308
+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:311
+msgid "Auditable Code"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:312
+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:320
+msgid "App developer is verified"
+msgstr ""
+
+#: src/gs-safety-context-dialog.c:321
+msgid "The developer of this app has been verified to be who they say they are"
+msgstr ""
+
+#. Translators: The app is considered safe to install and run.
+#. * The placeholder is the app name.
+#: src/gs-safety-context-dialog.c:330
+#, c-format
+#| msgid "%s is now installed"
+msgid "%s is safe"
+msgstr "Aplikácia %s je 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:337
+#, c-format
+#| msgid "%s is now installed"
+msgid "%s is potentially unsafe"
+msgstr "Aplikácia %s je potencioná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:344
+#, c-format
+#| msgid "%s is now installed"
+msgid "%s is unsafe"
+msgstr "Aplikácia %s nie je bezpečná"
+
+#. Translators: This is the title of the dialog which contains information about the permissions of an app
+#: src/gs-safety-context-dialog.ui:9
+msgid "Safety"
+msgstr "Bezpečnosť"
+
+# GtkLabel
+#: src/gs-safety-context-dialog.ui:146
+msgid "License"
+msgstr "Licencia"
+
+#: src/gs-safety-context-dialog.ui:232
+msgid "SDK"
+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:41
+#| msgid "Screenshot"
+msgid "Previous Screenshot"
+msgstr "Predchádzajúci snímok 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:82
+#| msgid "Screenshot"
+msgid "Next Screenshot"
+msgstr "Nasledujúci snímok obrazovky"
+
+#: src/gs-screenshot-carousel.ui:150
+msgid "No screenshot provided"
+msgstr "Snímka obrazovky nebola poskytnutá"
+
+#. TRANSLATORS: this is when we try to download a screenshot and
+#. * we get back 404
+#: src/gs-screenshot-image.c:345
+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:362
+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:504
+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:585
+msgid "Could not create cache"
+msgstr "Nepodarilo sa vytvoriť vyrovnávacia pamäť"
+
+#. TRANSLATORS: this is when we try to download a screenshot
+#. * that was not a valid URL
+#: src/gs-screenshot-image.c:595
+msgid "Screenshot not valid"
+msgstr "Snímka obrazovky nie je platná"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:615
+msgid "Screenshot not available"
+msgstr "Snímka obrazovky nie je dostupná"
+
+#: src/gs-screenshot-image.c:694
+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:172
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "%u ďalších výsledkov"
+msgstr[1] "%u ďalší výsledok"
+msgstr[2] "%u ďalšie výsledky"
+
+#: src/gs-search-page.ui:7
+msgid "Search page"
+msgstr "Strana s vyhľadávaním"
+
+# cmdline description
+#: src/gs-search-page.ui:17
+#, fuzzy
+#| msgid "Search for applications"
+msgid "Search for Apps"
+msgstr "Vyhľadá aplikácie"
+
+# GtkLabel
+#: src/gs-search-page.ui:39
+msgid "No Application 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:1155 src/gs-shell.c:1160 src/gs-shell.c:1175
+#: src/gs-shell.c:1179
+#, 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:1225
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Nie je možné 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:1231
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Nie je možné prevziať aktualizácie z %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1238 src/gs-shell.c:1283
+msgid "Unable to download updates"
+msgstr "Nie je možné prevziať aktualizácie"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1244
+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é"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1253
+#, c-format
+msgid "Unable to download updates from %s: not enough disk space"
+msgstr "Nie je možné prevziať aktualizácie z %s: nedostatok miesta na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1258
+msgid "Unable to download updates: not enough disk space"
+msgstr "Nie je možné prevziať aktualizácie: nedostatok miesta na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1265
+msgid "Unable to download updates: authentication was required"
+msgstr ""
+"Nie je možné prevziať aktualizácie: bolo požadované overenie totožnosti"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1270
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Nie je možné prevziať aktualizácie: overenie totožnosti nebolo platné"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1275
+msgid ""
+"Unable to download updates: you do not have permission to install software"
+msgstr ""
+"Nie je možné prevziať aktualizácie: nemáte dostatočné práva na inštaláciu "
+"softvéru"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286
+msgid "Unable to get list of updates"
+msgstr "Nie je možné získať zoznam aktualizácií"
+
+#. 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:1328
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr ""
+"Nie je možné nainštalovať aplikáciu %s, pretože preberanie z lokality %s "
+"zlyhalo"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1334
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Nie je možné nainštalovať aplikáciu %s, pretože preberanie zlyhalo"
+
+#. 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:1347
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"Nie je možné nainštalovať aplikáciu %s, pretože rozhranie %s nie je dostupné"
+
+#. 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 as not supported"
+msgstr "Nie je možné nainštalovať aplikáciu %s, pretože nie je podporovaná"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1360
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Nie je možné vykonať inštaláciu: bolo potrebné internetové pripojenie, ale "
+"nebolo dostupné"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1366
+msgid "Unable to install: the application has an invalid format"
+msgstr "Nie je možné vykonať inštaláciu: aplikácia je v neplatnom formáte"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1371
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1378
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr ""
+"Nie je možné nainštalovať aplikáciu %s: bolo požadované overenie totožnosti"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1385
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr ""
+"Nie je možné nainštalovať aplikáciu %s: overenie totožnosti nebolo platné"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1392
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1400
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Nie je možné nainštalovať aplikáciu %s: vyžaduje sa napájanie zo siete"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1407
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1416
+#, 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,
+#. * 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:1462
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr ""
+"Nie je možné aktualizovať aplikáciu %s zo zdroja %s, pretože zlyhalo "
+"preberanie"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1469
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "Nie je možné aktualizovať aplikáciu %s, pretože 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:1476
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Nie je možné nainštalovať aktualizácie zo zdroja %s, pretože preberanie "
+"zlyhalo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1480
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Nie je možné nainštalovať aktualizácie, pretože preberanie zlyhalo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1486
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr ""
+"Nie je možné vykonať aktualizáciu: bolo potrebné internetové pripojenie, ale "
+"nebolo dostupné"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1496
+#, 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
+#: src/gs-shell.c:1501
+#, c-format
+msgid "Unable to install updates: not enough disk space"
+msgstr "Nie je možné nainštalovať aktualizácie: nedostatok miesta na disku"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1511
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr ""
+"Nie je možné aktualizovať aplikáciu %s: bolo požadované overenie totožnosti"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1516
+#, 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"
+
+#. 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: authentication was invalid"
+msgstr ""
+"Nie je možné aktualizovať aplikáciu %s: overenie totožnosti nebolo platné"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1530
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr ""
+"Nie je možné nainštalovať aktualizácie: overenie totožnosti nebolo platné"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1539
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1545
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1555
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Nie je možné aktualizovať aplikáciu %s: vyžaduje sa napájanie zo siete"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1561
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1570
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1576
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1587
+#, 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:1590
+#, c-format
+msgid "Unable to install updates"
+msgstr "Nie je možné nainštalovať aktualizácie"
+
+#. 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:1632
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "Nie je možné aktualizovať na systém %s z lokality %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1637
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Nie je možné aktualizovať na %s, pretože preberanie zlyhalo"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1646
+#, 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é"
+
+#. 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: not enough disk space"
+msgstr "Nie je aktualizovať na systém %s: 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:1663
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr ""
+"Nie je možné aktualizovať na systém %s: bolo požadované 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:1670
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr ""
+"Nie je možné aktualizovať na systém %s: overenie totožnosti nebolo platné"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1677
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1684
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Nie je možné aktualizovať na systém %s: vyžaduje sa napájanie 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:1691
+#, 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"
+
+#. 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"
+msgstr "Nie je možné aktualizovať na systém %s"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1737
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1743
+#, 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é"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1749
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1756
+#, 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"
+
+#. 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: 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1775
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Nie je možné odstrániť aplikáciu %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:1817
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr "Nie je možné spustiť aplikáciu %s: rozhranie %s nie je nainštalované"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1824 src/gs-shell.c:1875 src/gs-shell.c:1916
+#: src/gs-shell.c:1961
+msgid "Not enough disk space — free up some space and try again"
+msgstr "Nedostatok miesta na disku — uvoľnite nejaké miesto a skúste to znovu"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1835 src/gs-shell.c:1886 src/gs-shell.c:1927
+#: src/gs-shell.c:1985
+msgid "Sorry, something went wrong"
+msgstr "Prepáčte, niekde nastala chyba"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1867
+msgid "Failed to install file: not supported"
+msgstr "Zlyhala inštalácia súboru: bez podpory"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1871
+msgid "Failed to install file: authentication failed"
+msgstr "Zlyhala inštalácia súboru: zlyhalo overenie totožnosti"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1908
+msgid "Failed to install: not supported"
+msgstr "Zlyhala inštalácia: bez podpory"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1912
+msgid "Failed to install: authentication failed"
+msgstr "Zlyhala inštalácia: zlyhalo overenie totožnosti"
+
+#. 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:1955
+#, c-format
+msgid "Unable to contact %s"
+msgstr "Nie je možné kontaktovať lokalitu %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1967
+#| msgid "%s needs to be restarted to use new plugins."
+msgid "Software needs to be restarted to use new plugins."
+msgstr ""
+"Pre používanie nových zásuvných modulov musí byť aplikácia Softvér "
+"reštartovaná."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1972
+msgid "AC power is required"
+msgstr "Požaduje sa napájanie zo siete"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1976
+msgid "The battery level is too low"
+msgstr "Úroveň nabitia batérie je príliš nízka"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Softvérové repozitáre"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Predvoľby aktualizácií"
+
+#: src/gs-shell.ui:21 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "Softvér"
+
+#. button in the info bar
+#: src/gs-shell.ui:86
+msgid "Examine Disk"
+msgstr "Preskúmať disk"
+
+#. button in the info bar
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-shell.ui:95 src/gs-updates-page.c:906
+msgid "Network Settings"
+msgstr "Nastavenia siete"
+
+#. button in the info bar
+#: src/gs-shell.ui:104
+msgid "Restart Now"
+msgstr "Reštartovať teraz"
+
+# DK:cmd desc
+#. button in the info bar
+#: src/gs-shell.ui:113
+msgid "More Information"
+msgstr "Viac informácií"
+
+#: src/gs-shell.ui:168
+msgid "Search"
+msgstr "Vyhľadať"
+
+#: src/gs-shell.ui:194
+msgid "Primary Menu"
+msgstr ""
+
+#: src/gs-shell.ui:284
+msgid "Find Out _More"
+msgstr "Z_istiť viac"
+
+#. 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:93
+#, fuzzy
+#| msgctxt "content rating violence-cartoon"
+#| msgid "None"
+msgid "None"
+msgstr "Žiadne"
+
+#: src/gs-storage-context-dialog.c:132
+#, fuzzy
+#| msgid "Application Updates"
+msgid "Application Data"
+msgstr "Aktualizácie aplikácií"
+
+#: src/gs-storage-context-dialog.c:133
+msgid "Data needed for the application to run"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:137
+msgid "User Data"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:138
+#, fuzzy
+#| msgid "Please restart the application."
+msgid "Data created by you in the application"
+msgstr "Prosím, reštartujte aplikáciu."
+
+#: src/gs-storage-context-dialog.c:144
+msgid "Cache Data"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:145
+msgid "Temporary cached data"
+msgstr ""
+
+# * https://bugzilla.gnome.org/show_bug.cgi?id=726990
+#: src/gs-storage-context-dialog.c:161
+#, fuzzy
+#| msgid "%u application installed"
+#| msgid_plural "%u applications installed"
+msgid "The application itself"
+msgstr "Bolo nainštalovaných %u aplikácií"
+
+#: src/gs-storage-context-dialog.c:165
+msgid "Required Dependencies"
+msgstr ""
+
+#: src/gs-storage-context-dialog.c:166
+msgid "Shared system components required by this application"
+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:9
+msgid "Storage"
+msgstr ""
+
+#. Translators: Please do not translate the markup or link href
+#: src/gs-storage-context-dialog.ui:117
+msgid ""
+"Cached data can be cleared from the <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+
+#: src/gs-summary-tile.c:74
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Nainštalovaný)"
+
+#: src/gs-summary-tile.c:79
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Inštaluje sa)"
+
+#: src/gs-summary-tile.c:84
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Odstraňuje sa)"
+
+# 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:122
+#, 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:142
+msgid "Installed Updates"
+msgstr "Nainštalované aktualizácie"
+
+#: src/gs-update-dialog.ui:70
+msgid "No updates have been installed on this system."
+msgstr "V tomto počítači neboli nainštalované žiadne aktualizácie."
+
+# title
+#: src/gs-update-monitor.c:210
+#| msgid "Software Updates Failed"
+msgid "Software Updates Are Out of Date"
+msgstr "Aktualizácie softvéru nie sú aktuálne"
+
+#: src/gs-update-monitor.c:211
+#| msgid "Check for updates"
+msgid "Please check for software updates."
+msgstr "Prosím, skontrolujte aktualizácie softvéru."
+
+#: src/gs-update-monitor.c:217
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritická aktualizácia softvéru je pripravená na inštaláciu"
+
+#: src/gs-update-monitor.c:218
+#| 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."
+
+#: src/gs-update-monitor.c:221
+#| msgid "Software Updates Available"
+msgid "Critical Software Updates Available to Download"
+msgstr "Sú dostupné kritické aktualizácie softvéru na prevzatie"
+
+#: src/gs-update-monitor.c:222
+msgid "Important: critical software updates are waiting."
+msgstr "Dôležité: kritické aktualizácie softvéru čakajú."
+
+#: src/gs-update-monitor.c:230
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+msgid "Software Updates Ready to Install"
+msgstr "Aktualizácie softvéru sú pripravené na inštaláciu"
+
+#: src/gs-update-monitor.c:231
+#| msgid "An important OS update failed to be installed."
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Aktualizácie softvéru čakajú pripravené na inštaláciu."
+
+#: src/gs-update-monitor.c:236
+#| msgid "Software Updates Available"
+msgid "Software Updates Available to Download"
+msgstr "Sú dostupné aktualizácie softvéru na prevzatie"
+
+#: src/gs-update-monitor.c:237
+#| msgid "Downloading firmware update…"
+msgid "Please download waiting software updates."
+msgstr "Prosím, prevezmite čakajúce aktualizácie softvéru."
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:343
+#, c-format
+msgid "%u Application Updated — Restart Required"
+msgid_plural "%u Applications Updated — Restart Required"
+msgstr[0] "%u aktualizovaných aplikácií — Potrebný reštart"
+msgstr[1] "%u aktualizovaná aplikácia — Potrebný reštart"
+msgstr[2] "%u aktualizované aplikácie — Potrebný reštart"
+
+#. TRANSLATORS: apps were auto-updated
+#: src/gs-update-monitor.c:349
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u aktualizovaných aplikácií"
+msgstr[1] "%u aktualizovaná aplikácia"
+msgstr[2] "%u aktualizované aplikácie"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:360
+#, c-format
+msgid "%s has been updated."
+msgstr "Aplikácia %s bola aktualizovaná."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:363
+msgid "Please restart the application."
+msgstr "Prosím, reštartujte aplikáciu."
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:371
+#, 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 application needs restarting
+#: src/gs-update-monitor.c:377 src/gs-update-monitor.c:396
+#, c-format
+msgid "%u application requires a restart."
+msgid_plural "%u applications 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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:389
+#, c-format
+msgid "Includes %s, %s and %s."
+msgstr "Zahŕňa %s, %s a %s."
+
+#. TRANSLATORS: this is when the current OS version goes end-of-life
+#: src/gs-update-monitor.c:656 src/gs-updates-page.ui:43
+msgid "Operating System Updates Unavailable"
+msgstr "Aktualizácie operačného systému nie sú dostupné"
+
+#. TRANSLATORS: this is the message dialog for the distro EOL notice
+#: src/gs-update-monitor.c:658
+msgid "Upgrade to continue receiving security updates."
+msgstr ""
+"Vykonaním aktualizácie budete naďalej prijímať bezpečnostné aktualizácie."
+
+#. TRANSLATORS: this is a distro upgrade, the replacement would be the
+#. * distro name, e.g. 'Fedora'
+#: src/gs-update-monitor.c:713
+#, 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:717
+msgid "Software Upgrade Available"
+msgstr "Je dostupná aktualizácia softvéru"
+
+# title
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1114
+msgid "Software Updates Failed"
+msgstr "Zlyhanie aktualizácií softvéru"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:1116
+msgid "An important OS update failed to be installed."
+msgstr "Zlyhala inštalácia dôležitej aktualizácie operačného systému."
+
+#: src/gs-update-monitor.c:1117
+msgid "Show Details"
+msgstr "Zobraziť podrobnosti"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1140
+msgid "System Upgrade Complete"
+msgstr "Aktualizácia systému 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:1145
+#, 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:1151
+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:1155
+msgid "An important OS update has been installed."
+msgid_plural "Important OS 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 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:1166
+msgctxt "updates"
+msgid "Review"
+msgstr "Prezrieť"
+
+# title
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1215
+msgid "Failed To Update"
+msgstr "Zlyhanie aktualizácie"
+
+#. TRANSLATORS: the user must have updated manually after
+#. * the updates were prepared
+#: src/gs-update-monitor.c:1221
+msgid "The system was already up to date."
+msgstr "Systém bol už aktuálny."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1226
+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:1232
+msgid ""
+"Internet access was required but wasn’t available. Please make sure that you "
+"have internet access and try again."
+msgstr ""
+"Bolo požadované internetové pripojenie, ale nebolo dostupné. Prosím, uistite "
+"sa, že máte prístup na internet a skúste to znovu."
+
+#. TRANSLATORS: if the package is not signed correctly
+#: src/gs-update-monitor.c:1238
+msgid ""
+"There were security issues with the update. Please consult your software "
+"provider for more details."
+msgstr ""
+"Vyskytla sa bezpečnostná chyba s aktualizáciou. 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:1244
+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:1249
+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:251
+#, c-format
+msgid "Last checked: %s"
+msgstr "Posledná kontrola: %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:576
+#, c-format
+msgid "%s %s is no longer supported."
+msgstr "Systém %s %s už viac nie je podporovaný."
+
+#. TRANSLATORS: OS refers to operating system, e.g. Fedora
+#: src/gs-updates-page.c:581
+msgid "Your OS is no longer supported."
+msgstr "Váš operačný systém už viac nie je podporovaný."
+
+#. TRANSLATORS: EOL distros do not get important updates
+#: src/gs-updates-page.c:586
+msgid "This means that it does not receive security updates."
+msgstr "To znamená, že už neprijíma bezpečnostné aktualizácie."
+
+#. TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26
+#: src/gs-updates-page.c:590
+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."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:874
+msgid "Charges May Apply"
+msgstr "Možné zvýšenie poplatkov"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:878
+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 vám môže zvýšiť poplatky."
+
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-updates-page.c:882
+msgid "Check _Anyway"
+msgstr "Napriek _tomu skontrolovať"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:898
+msgid "No Network"
+msgstr "Žiadne pripojenie k sieti"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: src/gs-updates-page.c:902
+msgid "Internet access is required to check for updates."
+msgstr "Na zistenie dostupnosti aktualizácií je potrebný prístup k internetu."
+
+#: src/gs-updates-page.c:1290
+msgid "Checking…"
+msgstr "Kontroluje sa…"
+
+#: src/gs-updates-page.c:1313
+msgid "Check for updates"
+msgstr "Zistiť dostupnosť aktualizácií"
+
+#: src/gs-updates-page.ui:7
+msgid "Updates page"
+msgstr "Strana s aktualizáciami"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:96
+#| msgid "Pending update…"
+msgid "Loading Updates…"
+msgstr "Načítavajú sa aktualizácie…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:110
+#| msgid "(This could take a while)"
+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:222
+msgid "Up to Date"
+msgstr "Aktuálne"
+
+#: src/gs-updates-page.ui:263
+msgid "Use Mobile Data?"
+msgstr "Použiť mobilné dáta?"
+
+#: src/gs-updates-page.ui:264
+#| 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 ""
+"Kontrola aktualizácií pomocou mobilného širokopásmového pripojenia vám môže "
+"zvýšiť poplatky."
+
+#: src/gs-updates-page.ui:267
+msgid "_Check Anyway"
+msgstr "Napriek tomu _zistiť"
+
+#: src/gs-updates-page.ui:282
+#| msgctxt "Menu subcategory of Education"
+#| msgid "Construction"
+msgid "No Connection"
+msgstr "Bez pripojenia"
+
+#: src/gs-updates-page.ui:283
+#| msgid "Go online to check for updates"
+msgid "Go online to check for updates."
+msgstr "Na kontrolu aktualizácií sa pripojte."
+
+#: src/gs-updates-page.ui:286
+msgid "_Network Settings"
+msgstr "_Nastavenia siete"
+
+#: src/gs-updates-page.ui:312
+msgid "Error"
+msgstr "Chyba"
+
+#: src/gs-updates-page.ui:313
+#| msgid "Updates are automatically managed"
+msgid "Updates are automatically managed."
+msgstr "Aktualizácie sú spravované automaticky."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:334
+msgid "Restart & Update"
+msgstr "Reštartovať a aktualizovať"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:340
+msgid "Update All"
+msgstr "Aktualizovať všetko"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:481
+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:486
+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:491
+msgid "Application Updates"
+msgstr "Aktualizácie aplikácií"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:496
+msgid "Device Firmware"
+msgstr "Firmvér zariadenia"
+
+#: src/gs-updates-section.ui:36 src/gs-upgrade-banner.ui:78
+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:86
+#, c-format
+#| msgid "%s %s Now Available"
+msgid "%s %s Available"
+msgstr "Systém %s %s je dostupný"
+
+#: src/gs-upgrade-banner.c:131
+msgid "Learn about the new version"
+msgstr "Zistite viac o novej verzii"
+
+#: src/gs-upgrade-banner.c:151
+#| msgid "Downloading"
+msgid "Downloading…"
+msgstr "Preberá sa…"
+
+#. 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:169
+#, c-format
+msgid "%s of %s downloaded"
+msgstr "Prevzatých %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:173
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Prevzaté na %u%%"
+
+#: src/gs-upgrade-banner.ui:43
+msgid "A major upgrade, with new features and added polish."
+msgstr "Dôležitá aktualizácia s novými funkciami a vylepšeniami."
+
+#: src/gs-upgrade-banner.ui:213
+#| msgid "_Restart & Update"
+msgid "_Restart & Upgrade"
+msgstr "_Reštartovať a aktualizovať"
+
+#: src/gs-upgrade-banner.ui:230
+#| msgid ""
+#| "It is recommended that you back up your data and files before upgrading."
+msgid "Remember to back up data and files before upgrading."
+msgstr "Nezabudnite zálohovať údaje a súbory pred aktualizáciou."
+
+#: src/org.gnome.Software.desktop.in:4
+msgid "Add, remove or update software on this computer"
+msgstr "Pridáva, odstraňuje alebo aktualizuje softvér vo vašom počítači"
+
+#. 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 ""
+"Aktualizácie;Inovácia;Zdroje;Repozitáre;Nastavenia;Inštalácia;Inštalovanie;"
+"Odinštalovanie;Program;Softvér;Aplikácia;Obchod;"
+
+#. 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:56
+msgid "OS Updates"
+msgstr "Aktualizácie operačného systému"
+
+#. TRANSLATORS: this is a longer description of the
+#. * "OS Updates" string
+#: plugins/core/gs-plugin-generic-updates.c:61
+msgid "Includes performance, stability and security improvements."
+msgstr "Zahŕňa vylepšenia výkonu, stability a zvýšenia bezpečnosti."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:41
+msgid "Downloading featured images…"
+msgstr "Preberajú sa obrázky kategórie základnej výbavy…"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:560
+msgid "Endless OS"
+msgstr "Systém Endless OS"
+
+#. TRANSLATORS: ‘Endless OS’ is a brand name; https://endlessos.com/
+#: plugins/eos-updater/gs-plugin-eos-updater.c:563
+msgid "An Endless OS update with new features and fixes."
+msgstr "Aktualizácia systému Endless OS prinášajúca nové funkcie a opravy."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:824
+msgid "EOS update service could not fetch and apply the update."
+msgstr ""
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:195
+msgid "Downloading upgrade information…"
+msgstr "Preberajú sa informácie o aktualizácii…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:314
+msgid ""
+"Upgrade for the latest features, performance and stability improvements."
+msgstr ""
+"Aktualizácia prinášajúca 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 applications on Linux"
+msgstr "Flatpak je architektúra počítačových aplikácií pre systém Linux"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1160
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Získavajú sa metaúdaje nástroja flatpak pre repozitár %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3164
+#, fuzzy, c-format
+#| msgid "Unable to find “%s”"
+msgid "Failed to refine addon ‘%s’: %s"
+msgstr "Nie je možné nájsť „%s“"
+
+#: plugins/flatpak/gs-flatpak-utils.c:95
+#| msgid "Installation"
+msgid "User Installation"
+msgstr "Používateľská inštalácia"
+
+#: plugins/flatpak/gs-flatpak-utils.c:95
+#| msgid "System Integration"
+msgid "System Installation"
+msgstr "Systémová inštalácia"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:821
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr ""
+
+#: plugins/flatpak/gs-plugin-flatpak.c:835
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %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 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:140
+#, c-format
+msgid "%s System Update"
+msgstr "Aktualizácia systému %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 Update"
+msgstr "Aktualizácia vstavaného ovládača %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 Update"
+msgstr "Aktualizácia 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 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:160
+#, 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:166
+#, c-format
+msgid "%s Controller Update"
+msgstr "Aktualizácia ovládača %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 Update"
+msgstr "Aktualizácia ovládača zariadenia Thunderbolt %s"
+
+#. TRANSLATORS: the CPU microcode is firmware loaded onto the CPU
+#. * at system bootup
+#: plugins/fwupd/gs-fwupd-app.c:177
+#, c-format
+msgid "%s CPU Microcode Update"
+msgstr "Aktualizácia mikrokódu procesora %s"
+
+#. TRANSLATORS: configuration refers to hardware state,
+#. * e.g. a security database or a default power value
+#: plugins/fwupd/gs-fwupd-app.c:182
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Aktualizácia konfigurácie %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:186
+#, c-format
+#| msgid "%s System Update"
+msgid "%s Battery Update"
+msgstr "Aktualizácia batérie %s"
+
+#. TRANSLATORS: camera can refer to the laptop internal
+#. * camera in the bezel or external USB webcam
+#: plugins/fwupd/gs-fwupd-app.c:191
+#, c-format
+#| msgid "%s Controller Update"
+msgid "%s Camera Update"
+msgstr "Aktualizácia fotoaparátu %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:195
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s TPM Update"
+msgstr "Aktualizácia TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:199
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Touchpad Update"
+msgstr "Aktualizácia touchpadu %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:203
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Mouse Update"
+msgstr "Aktualizácia myši %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:207
+#, c-format
+#| msgid "%s ME Update"
+msgid "%s Keyboard Update"
+msgstr "Aktualizácia klávesnice %s"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:716
+msgid "Downloading firmware update signature…"
+msgstr "Preberá sa podpis aktualizácie firmvéru…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:758
+msgid "Downloading firmware update metadata…"
+msgstr "Preberajú sa metaúdaje aktualizácie firmvéru…"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1180
+#| msgid "Device Firmware"
+msgid "Firmware"
+msgstr "Firmvér"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Podpora aktualizácie firmvéru"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:7
+msgid "Provides support for firmware upgrades"
+msgstr "Poskytuje podporu aktualizácií firmvéru"
+
+#: plugins/packagekit/gs-plugin-packagekit.c:301
+#| msgid "Package"
+msgid "Packages"
+msgstr "Balíky"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2225
+#, fuzzy
+#| msgid "Operating System Updates Unavailable"
+msgid "Operating System (OSTree)"
+msgstr "Aktualizácie operačného systému nie sú dostupné"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:239
+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 "Show the prompt to install nonfree software repositories"
+#~ msgstr "Zobraziť otázku pri inštalácii repozitárov neslobodného softvéru"
+
+#~ 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"
+
+# GtkToggleButton
+#~ msgid "_Installed"
+#~ msgstr "Na_inštalovaný"
+
+#~ msgid "_Updates"
+#~ msgstr "_Aktualizácie"
+
+# GtkButton
+#~ msgid "Remove"
+#~ msgstr "Odstrániť"
+
+# GtkLabel
+#~ msgid "Featured %s"
+#~ msgstr "Softvér základnej výbavy kategórie %s"
+
+#~ 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í"
+
+#~ 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 "No references to alcohol"
+#~ msgstr "Žiadne odkazy na alkohol"
+
+#~ msgid "References to alcoholic beverages"
+#~ msgstr "Odkazy na alkoholické nápoje"
+
+#~ msgid "Use of alcoholic beverages"
+#~ msgstr "Požívanie alkoholických nápojov"
+
+#~ msgid "No references to illicit drugs"
+#~ msgstr "Žiadne odkazy na zakázané drogy"
+
+#~ msgid "References to illicit drugs"
+#~ msgstr "Odkazy na zakázané drogy"
+
+#~ msgid "Use of illicit drugs"
+#~ msgstr "Požívanie zakázaných drog"
+
+#~ msgid "No references to tobacco products"
+#~ msgstr "Bez odkazov na tabakové výrobky"
+
+#~ msgid "References to tobacco products"
+#~ msgstr "Odkazy na tabakové výrobky"
+
+#~ msgid "Use of tobacco products"
+#~ msgstr "Požívanie tabakových výrobkov"
+
+#~ msgid "No nudity of any sort"
+#~ msgstr "Žiadna nahota akéhokoľvek druhu"
+
+#~ msgid "Brief artistic nudity"
+#~ msgstr "Občasná umelecká nahota"
+
+#~ msgid "Prolonged nudity"
+#~ msgstr "Dlhotrvajúca nahota"
+
+# cmdline description
+#~ msgid "No references to or depictions of sexual nature"
+#~ msgstr "Bez sexuálnych odkazov alebo vyobrazení"
+
+#~ 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 "No profanity of any kind"
+#~ msgstr "Žiadne zneuctenie akéhokoľvek druhu"
+
+#~ 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 "No discriminatory language of any kind"
+#~ msgstr "Žiadny diskriminačný jazyk akéhokoľvek druhu"
+
+#~ 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 "No advertising of any kind"
+#~ msgstr "Žiadne reklamy akéhokoľvek druhu"
+
+#~ 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 "No gambling of any kind"
+#~ msgstr "Žiadne hazardovanie akéhokoľvek druhu"
+
+#~ 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 "No ability to spend money"
+#~ msgstr "Žiadne možnosti míňania peňazí"
+
+#~ 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 "No way to chat with other users"
+#~ msgstr "Žiadne možnosti textovej komunikácie s ostatnými používateľmi"
+
+#~ 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 chat functionality between users"
+#~ msgstr "Nekontrolovateľné rozhovory medzi používateľmi"
+
+#~ msgid "No way to talk with other users"
+#~ msgstr "Žiadne možnosti hovoriť s ostatnými používateľmi"
+
+#~ msgid "Uncontrolled audio or video chat functionality between users"
+#~ msgstr "Nekontrolovateľné zvukové alebo video rozhovory medzi používateľmi"
+
+#~ msgid "No sharing of social network usernames or email addresses"
+#~ msgstr ""
+#~ "Žiadne zdieľanie používateľských mien alebo emailových adries zo "
+#~ "sociálnych sietí"
+
+#~ 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 "No sharing of user information with third parties"
+#~ msgstr "Žiadne zdieľanie informácií o používateľoch s tretími stranami"
+
+#~ 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 "No sharing of physical location with other users"
+#~ msgstr "Žiadne zdieľanie fyzickej lokality ostatným používateľom"
+
+#~ msgid "Sharing physical location with other users"
+#~ msgstr "Zdieľanie fyzickej lokality ostatným používateľom"
+
+#~ msgid "No references to homosexuality"
+#~ msgstr "Žiadne odkazy na homosexualitu"
+
+#~ 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 "No references to prostitution"
+#~ msgstr "Žiadne odkazy na prostitúciu"
+
+#~ 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 "No references to adultery"
+#~ msgstr "Žiadne odkazy na cudzoložstvo"
+
+#~ 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 "No references to desecration"
+#~ msgstr "Žiadne odkazy na znesvätenie"
+
+#~ 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 "No visible dead human remains"
+#~ msgstr "Bez viditeľných pozostatkov mŕtvych ľudí"
+
+#~ 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 "No references to slavery"
+#~ msgstr "Žiadne odkazy na otroctvo"
+
+#~ 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"
+
+#~ 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"
+
+# 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 "version"
+#~ msgid "Unknown"
+#~ msgstr "Neznáma"
+
+#~ msgctxt "updated"
+#~ msgid "Never"
+#~ msgstr "Nikdy"
+
+#~ msgctxt "origin"
+#~ msgid "Unknown"
+#~ msgstr "Neznámy"
+
+#~ msgid "Low"
+#~ msgstr "Nízke"
+
+#~ msgid "Medium"
+#~ msgstr "Stredné"
+
+#~ msgid "High"
+#~ msgstr "Vysoké"
+
+#~ 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 "Localized in your Language"
+#~ msgstr "Lokalizovaný vo vašom jazyku"
+
+#~ msgid "Release Activity"
+#~ msgstr "Aktivita vydaní"
+
+#~ msgid "Sandboxed"
+#~ msgstr "V izolovanom priestore"
+
+# GtkLabel
+#~ msgid "Category"
+#~ msgstr "Kategória"
+
+#~ msgid "Free"
+#~ msgstr "Slobodná"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Neznáma licencia softvéru"
+
+#~ 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:"
+
+#~ 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ý"
+
+#~ 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"
+
+#~ msgid "Format"
+#~ msgstr "Formát"
+
+#~ 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"
+
+#~ msgid "Are you sure you want to remove %s?"
+#~ msgstr "Naozaj chcete odstrániť %s?"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "Odstrániť repozitár „%s“?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "Zakázať repozitár „%s“?"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Žiadne dodatočné repozitáre"
+
+#~ msgid "_Enable"
+#~ msgstr "_Povoliť"
+
+# 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 "ratings in total"
+#~ msgstr "hodnotení celkom"
+
+#~ 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á."
+
+# GtkButton
+#~ msgid "_Remove All"
+#~ msgstr "O_dstrániť všetky"
+
+#~ 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 "Restart & Install"
+#~ msgstr "Reštartovať a inštalovať"
+
+#~ 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 "Looking for new updates…"
+#~ msgstr "Vyhľadávajú sa nové aktualizácie…"
+
+#~ msgid "Setting up updates…"
+#~ msgstr "Nastavujú sa aktualizácie…"
+
+# GtkLabel
+#~ msgid "Software is up to date"
+#~ msgstr "Softvér je aktuálny"
+
+#~ 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."
+
+#~ msgid "Waiting to Download %s %s"
+#~ msgstr "Čaká sa na prevzatie distribúcie %s %s"
+
+#~ msgid "Downloading %s %s"
+#~ msgstr "Preberá sa systém %s %s"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "Systém %s %s je pripravený na inštalá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 "Reference"
+#~ msgstr "Referencia"
+
+#~ msgid "Utilities"
+#~ msgstr "Pomôcky"
+
+#~ msgid "ODRS is a service providing user reviews of applications"
+#~ msgstr "ODRS je služba poskytujúca používateľské recenzie aplikácií"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Zabudol som heslo"
+
+#~ 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ť"
+
+# title
+#~ msgid "Failed to save file"
+#~ msgstr "Zlyhalo uloženie súboru"
+
+#~ 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"
+
+#~ msgid "App ID"
+#~ msgstr "ID aplikácie"
+
+# 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 "Delete Design"
+#~ msgstr "Odstrániť návrh"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Aktualizácia operačného systému"
+
+#~ 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 "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 "Unable to update %s from %s"
+#~ msgstr "Nie je možné aktualizovať aplikáciu %s z lokality %s"
+
+#~ msgid "Downloading new updates…"
+#~ msgstr "Preberajú sa nové aktualizácie…"
+
+#~ msgid "U_pdate All"
+#~ msgstr "A_ktualizovať všetko"
+
+# 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 "Web Apps Support"
+#~ msgstr "Podpora webových aplikácií"
+
+#~ msgid "Run popular web applications in a browser"
+#~ msgstr "Spúšťanie obľúbených webových aplikácií v prehliadači"
+
+#~ 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 "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"
+
+# GtkButton
+#~ msgid "_Install All"
+#~ msgstr "_Inštalovať všetky"
+
+#~ 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 "Science"
+#~ msgstr "Veda"
+
+#~ 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 "web app"
+#~ msgstr "webová aplikácia"
+
+#~ 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"
+
+#~ msgid "An update was not signed in the correct way."
+#~ msgstr "Aktualizácia nebola správnym spôsobom podpísaná."
+
+#~ msgid "The update could not be completed."
+#~ msgstr "Aktualizáciu sa nepodarilo dokončiť."
+
+#~ 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 "No sources found."
+#~ msgstr "Nenašli sa žiadne zdroje"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ 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..b55a320
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,7465 @@
+# 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.
+#
+# Matej Urbančič <mateju@src.gnome.org>, 2013–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: 2022-09-06 19:57+0000\n"
+"PO-Revision-Date: 2022-09-17 23:32+0200\n"
+"Last-Translator: Matej Urbančič <mateju@src.gnome.org>\n"
+"Language-Team: Slovenščina <gnome-si@googlegroups.com>\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 3.0.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 "Programi GNOME"
+
+#: 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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Program omogoča iskanje, nameščanje in odstranjevanje novih programov in "
+"sistemskih razširitev."
+
+#: 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2018
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "Projekt GNOME"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr "Zadnji časovni žig, ko je bil sistem povezan v omrežje in posodobljen"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "Najmanjša ocena karme za objavljanje ocen in mnenj"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Dovoli dostop do nastavitev programskih virov"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Ponudi tudi posodobitve za predobjave"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://en.wikipedia.org/wiki/Proprietary_software'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Sistemski namestilnik programske opreme za GNOME prek AppStream"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 "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:1027
+#, 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:1031
+#, 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 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 "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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Ocena starosti"
+
+#: 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 manjkajoče podrobnosti"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Na čakanju"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Namestitev na čakanju"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Odstranitev na čakanju"
+
+#: 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 "Nameščeno"
+
+#. 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 "Nameščanje"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Odstranjevanje"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Odstrani namestitev"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Omrežje"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Dovoljeno je sporočanje prek omrežja"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Sistemske storitve"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Storitve seje"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Naprave"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Omogočen je dostop do sistemskih datotek naprave"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Osebna 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 "Omogočeno je pregledovanje, urejanje in ustvarjanje datotek"
+
+#: 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 "Omogočeno je pregledovanje datotek"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Mapa prejemanja"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Nastavitve"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Dovoljeno pregledovati in spreminjati nastavitve"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Opuščen zaslonski sistem"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Uporablja star, ne-varen zaslonski sistem"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Izvajanje v peskovniku mimo varnega okolja"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr ""
+"Omogoča izvajanje v peskovniku mimo varnega okolja kot obvod vseh vrst "
+"omejitev"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Posodobi podrobnosti"
+
+#. 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 "Opis posodobitve ni na voljo."
+
+#: 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 "Pojdi nazaj"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Zahteva dodatna dovoljenja"
+
+#. 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 "Mnenja"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Za ta program še ni nobene ocene."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Ni še vpisanih ocen"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Zgodovina različice"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Novo v različici %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Različica %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Pokaži krajevne metapodatke oziroma datoteko appdata"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Pokaži podroben izpis razhroščevanja"
+
+#: 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 update preferences"
+msgstr "Pokaži nastavitve posodabljanja"
+
+#: 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Avtorske pravice © 2016–2022 Skupnost GNOME Software"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Matej Urbančič <mateju@src.gnome.org>"
+
+#. 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 "O orodju Programi GNOME"
+
+#. 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 "Enostaven način upravljanja s programsko opremo sistema."
+
+#. 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 "Za ta program podrobnosti niso na voljo."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Uporablja strojno opremo"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Lahko dostopa do poljubnih 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Zahteva dovoljenja po potrebi"
+
+#. 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 "Usklajeno z paketi 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 "S podporo tretjih virov"
+
+#. 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 "Lastniška programska koda"
+
+#. 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 "Programska koda je odprta za pregled"
+
+#. 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 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 "Nameščena programska oprema ni več podprta."
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Nevarno"
+
+#: 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 "Le za mobilno"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Le za male zaslone"
+
+#: 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 "Le za namizja"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Le za velike zaslone"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Velikost zaslona ne ustreza"
+
+#: 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 podpira trenutno nastavljene velikosti 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 "Zahteva večdotični zaslon"
+
+#: 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 "Zahteva tipkovnico"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Zahteva miško"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Zahtevana je igralna konzola"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Prilagodljivo"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Deluje na pametnih telefonih, tabličnih in namiznih računalnikih"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Najverjetneje zahteva uporabo miške in tipkovnice"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Program ne vsebuje nobene starostno pogojene vsebine"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Obiščite stran projekta"
+
+#. 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 "Namesti …"
+
+#. 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 "Prekliči"
+
+#. 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 "Namesti"
+
+#. 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 "Posodobi"
+
+#. 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 "Odstrani namestitev"
+
+#. 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 "Odstranjevanje namestitve"
+
+#. 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 "Naprave med posodabljanjem ni mogoče uporabljati."
+
+#. 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 "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:523
+#, 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 "Sodelujte pri prevajanju %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 zasnovana, razvita in prevedena s strani mednarodne skupnosti "
+"prostovoljcev.\n"
+"\n"
+"To pomeni, da čeprav še ni na voljo v vašem jeziku, se lahko sami vključite "
+"in sodelujete pri oblikovanju prevoda."
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "Prevodi"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Spletišče za prevajanje"
+
+#. 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 "Prijavno ime in geslo za %s (območje %s)."
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Zahtevana je prijava"
+
+#: 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 "_Prekliči"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Prijava"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Uporabnik"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Geslo"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Novo in Posodobljeno"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Druga programska oprema"
+
+#. 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 "Vpišite število med 1 in %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Izbor programa:"
+
+#: 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 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 zdaj nameščen"
+
+#. 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 "Za uveljavitev sprememb je treba sejo ponovno zagnati."
+
+#. 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 "Program je pripravljen za uporabo."
+
+#. 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 "Sistemske posodobitve so nameščene"
+
+#. 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 nameščene posodobitve so pripravljene za pregled."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Ponoven zagon"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Zaženi"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Ali naj bo nameščena programska oprema tretjih virov?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Ali naj bodo omogočeni tudi programski viri tretjih oseb?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ni <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">prosta programska oprema</a>, ponuja pa jo ponudnik “%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 "Program %s ponuja ponudnik »%s«."
+
+#: src/gs-common.c:259
+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:269
+#, c-format
+msgid "It may be illegal to install or use %s in some countries."
+msgstr "Lahko ni dovoljeno nameščanje ali uporaba %s v nekaterih državah."
+
+#. 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 ""
+"Lahko ni dovoljeno nameščanje ali uporaba teh kodekov v nekaterih državah."
+
+#. 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 opozori več"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Podrobne napake upravljalnika paketov so:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Podrobnosti"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Sprejmi"
+
+#. 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] "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 removed some apps
+#: src/gs-common.c:760
+msgid "An application has been removed"
+msgid_plural "Applications have been removed"
+msgstr[0] "Programi so odstranjeni"
+msgstr[1] "Program je odstranjen"
+msgstr[2] "Programa sta odstranjena"
+msgstr[3] "Programi so odstranjeni"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Ne zdaj"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Ravnokar"
+
+#: src/gs-common.c:871
+#, 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:875
+#, 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"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: 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 "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:332
+msgid "Find in Software"
+msgstr "Najdi med programi"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Pokaži več _podrobnosti"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Pokaži manj _podrobnosti"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Poteka odstranjevanje …"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Zahteva ponoven zagon za dokončanje namestitve"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Poteka nastavljanje posodobitev …"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Poteka priprava …"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Poteka odstranjevanje namestitve …"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Namesti"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Ponovno zaženi"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Namesti …"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Drugi programi %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "Za objavo mnenja ali ocene je zahtevana internetna povezava."
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Ni mogoče najti »%s«"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Stran podrobnosti"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Poteka nalaganje podrobnosti programa …"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr ""
+"Ta programska oprema ni na voljo v vašem jeziku in bo prikazana v angleškem."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Sodelujte pri _prevajanju"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Odpri"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Posodobi"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Prejemanje"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Vstavki"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Izbrani vstavki bodo nameščeni skupaj s programom."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Programski vir je vključen"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Ni vključenega programskega vira"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Programski vir je določen"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Uporabi le programske vire, ki so vredni zaupanja."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Ni metapodatkov"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "_Spletišče projekta"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Doniraj"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Prispevajte _prevode"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Pošlji poročilo o napaki"
+
+#: src/gs-details-page.ui:813
+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:908
+msgid "_Write Review"
+msgstr "_Napišite oceno"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Mnenja in ocene"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "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: 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] "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:242
+msgid "Requested software not found"
+msgstr "Zahtevane programske opreme ni mogoče najti"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s ni mogoče najti"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "na spletni strani"
+
+#. 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 "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: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 ""
+"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 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 "Za podporo %s ni na voljo programa."
+
+#. 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 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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"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: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] ""
+"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:574 src/gs-extras-page.c:631 src/gs-extras-page.c:671
+#, c-format
+msgid "Failed to find any search results: %s"
+msgstr "Ni zadetkov za naveden iskalni niz: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Zapis %s"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Ni mogoče najti zahtevane programske opreme"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Stran kodekov"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Namizna podpora"
+
+#: 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 "Omogoča uporabo na velikih zaslonih"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Namizna podpora ni znana"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Zahteva uporabo velikega zaslona"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Uporaba namizja ni podprta"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Uporaba na velikih zaslonih ni mogoča"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Podpora za mobilne naprave"
+
+#: 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 "Omogoča uporabo na malih zaslonih"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Podpora za mobilne naprave ni znana"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Zahteva uporabo malega zaslona"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobilna okolja niso podprta"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Uporaba na malih zaslonih ni mogoča"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Podpora tipkovnice"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Podpora za tipkovnice ni določena"
+
+#: src/gs-hardware-support-context-dialog.c:637
+msgid "Not enough information to know if keyboards are supported"
+msgstr "Ni dovolj podatkov o podpori tipkovnice"
+
+#: src/gs-hardware-support-context-dialog.c:639
+msgid "Keyboard Required"
+msgstr "Zahtevana je uporaba tipkovnice"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Omogoča uporabo tipkovnice"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Uporaba tipkovnice ni podprta"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Uporaba s tipkovnico ni mogoča"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Podpora za miško"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Zahteva miško ali podobno sledilno napravo"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Podpora za miško ni znana"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Zahtevana je uporaba miške"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Podprta je uporaba miške in kazalnih naprav"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Uporaba miške ni podprta"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Podpora zaslonom na dotik"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Podpora za zaslone na dotik ni opredeljena"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Zahtevan je večdotični zaslon"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Podpira večdotične zaslone"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Zasloni na dotik niso podprti"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Ne deluje pri uporabi večdotičnega zaslona"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Zahtevana je igralna plošča"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Zahteva uporabo igralne plošče"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Podpora za igralno ploščo"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "Program %s je podprt 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Strojna podpora"
+
+#. 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 "Nameščeno"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Stran nameščenih"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Programi"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Spletni programi"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Sistemski programi"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Vzdržuje skupnost"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Ta programska oprema je odprtokodna in jo razvija skupnost prostovoljcev, "
+"objavljena pa je pod posebnimi <a href=\"%s\">%spogoji</a>..\n"
+"\n"
+"Vsakdo lahko sodeluje pri zasnovi in razvoju, če se za to odloči."
+
+#. 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 ""
+"Ta programska oprema je odprtokodna in jo razvija skupnost prostovoljcev, "
+"objavljena pa je z dovoljenjem %s.\n"
+"\n"
+"Vsakdo lahko sodeluje pri zasnovi in razvoju, če se za to odloči."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Lastniško"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Več podrobnosti"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Prejemanje programskega kataloga"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Nalaganje strani"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Zaganjanje sistema …"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Samodejno posodabljanje je v premoru"
+
+#: 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 ""
+"Trenutno uporabljeno omrežje je plačljivo. Tovrstne povezave imajo omejitve "
+"dostopa do podatkov, ali pa so z dostopom povezani stroški. Samodejne "
+"posodobitve so zato zadržane.\n"
+"\n"
+"Samodejne posodobitve bodo omogočene, ko bo na voljo druga povezava, do "
+"takrat pa je posodobitve mogoče začeti ročno.\n"
+"\n"
+"V primeru, da je vrsta omrežja zaznana napačno in uporaba ni povezana z "
+"dodatnimi stroški, je nastavitev mogoče tudi spremeniti."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Odpri _omrežne nastavitve"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Overi objave"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Ni novih ocen in mnenj za pregled"
+
+#: 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: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 "Uporabnik"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Dodatni paketi"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+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:258
+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:262
+msgid "Downgrades"
+msgstr "Povrnjeni paketi"
+
+#. 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 "izbrani zunanji viri"
+
+#. 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 ""
+"Omogoča dostop do dodatne programske opreme %s, vključno s plačljivimi "
+"programi."
+
+#. 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 "Omogoč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 "Razišči"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Stran pregleda"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Ali naj bodo omogočeni tudi programski viri tretje roke?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Druge kategorije"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Podatkov o programu ni mogoče najti"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Neznano"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Uporabnik je zavrnil namestitev"
+
+#. 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 "Pripravi %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 "Ali res želite odstraniti shrambo %s?"
+
+#. 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 ""
+"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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Ali ste prepričani, da želite odstraniti %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 ""
+"Program %s bo odstranjen. Za ponovno uporabo ga bo treba znova namestiti."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Nastavitve posodabljanja"
+
+#: 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 ""
+"Zaradi možnih nepričakovanih stroškov samodejno posodabljanje na plačljivih "
+"in merjenih povezavah ni samodejno."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Samodejno posodabljanje"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"V ozadju začne in namesti posodobitve programske opreme, če je to mogoče."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Obvestila samodejnega posodabljanja"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Pokaži obvestilo, ko so posodobitve samodejno nameščene."
+
+#. 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 ""
+"Nekatera trenutno nameščena programska oprema ni združljiva z %s. Če "
+"nadaljujete, bodo med nadgradnjo samodejno odstranjeni naslednji paketi:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Neskladna programska oprema"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "N_adaljuj"
+
+#. 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 ""
+"Programska oprema, nameščene z vira »%s«, ne bo več deležna posodobitev."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Ali želite onemogočiti shrambo?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Odstrani"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Omogoči nova skladišča"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Dodatna skladišča izbranih virov tretjih oseb –%s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr "Ta skladišča so dodatek v privzeti programski opremi sistema %s."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Viri programske opreme"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Ni vpisanih skladišč"
+
+#. 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 nameščenih programov"
+msgstr[1] "%u nameščen program"
+msgstr[2] "%u nameščena programa"
+msgstr[3] "%u nameščeni programi"
+
+#. 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 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 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 programov"
+msgstr[1] "%u program"
+msgstr[2] "%u programa"
+msgstr[3] "%u programi"
+
+#. 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 vstavkov"
+msgstr[1] "%u vstavek"
+msgstr[2] "%u vstavka"
+msgstr[3] "%u vstavki"
+
+#. 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] "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"
+
+#. 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 "Bedast je"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Ni mi všeč"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "V redu je"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Všeč mi je"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Noro dober je"
+
+#. 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 "Priporočljivo je nameniti več časa pisanju mnenja ali ocene"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Izberite tudi oceno z zvedzicami"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Povzetek je prekratek"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Povzetek je predolg"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Opis je prekratek"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Objavi mnenje"
+
+#. 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 "Ocena"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Povzetek"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"Podajte kratek povzetek mnenja oziroma ocene, na primer »Odličen program, ki "
+"ga toplo priporočam!«"
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Ocena"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr "Kakšno je vaše mnenje o programu. Podajte razloge za opis programa."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Preglejte, kateri podatki so poslani, med <a href=\"https://odrs.gnome.org/"
+"privacy\">pravili zasebnosti</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Ali želite objaviti mnenje in oceno?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Poročilo"
+
+#. 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 bil ta opis ocene uporaben?"
+
+#: 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 "Poročilo …"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Odstrani …"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr "Prepričajte se, da zaupate ponudniku, ker program ni sistemsko omejen."
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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."
+
+#. 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 "Ni posebnih dovoljenj"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Zahteva dostop do omrežja"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ne zahteva dostopa do omrežja"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Uporablja sistemske storitve"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Uporablja storitve seje"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Zahteva dostop do povezanih naprav"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Ne zahteva dostopa do povezanih naprav"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Poln dostop za branje/pisanje vsebine datotečnega sistema"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Dovoljenje za branje/pisanje vsebine v osebno mapo"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Poln dostop za branje vsebine datotečnega sistema"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Dovoljenje za branje vsebine osebne mape"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Dovoljenje za branje/pisanje vsebine v mapo prejema"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Dovoljenje za branje vsebine mape prejema"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "Bere vse podatke v mapi prejemov"
+
+#: src/gs-safety-context-dialog.c:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Ne zahteva dostopa do datotečnega sistema"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Ne zahteva in nima dovoljenj za dostop do 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:341
+msgid "Proprietary Code"
+msgstr "Lastniška programska koda"
+
+#: 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 ""
+"Izvorna koda ni javna, je ni mogoče preveriti, zato je program morda ni varen"
+
+#. 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 "Koda je odprta za pregled"
+
+#: 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 ""
+"Izvorna koda je javno dostopna in jo je mogoče skrbno pregledati, kar naredi "
+"program veliko bolj varen"
+
+#. 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 "Razvijalci programa so preverjeni"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Ne-varne zahtevane odvisnosti"
+
+#: src/gs-safety-context-dialog.c:367
+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."
+
+#. 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 "Program %s 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:383
+#, 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "Program %s ni varen."
+
+#. 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 "Dovoljenja programa"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Vir"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Zastarela različica 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 "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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ni pripadajoče zaslonske slike"
+
+#. 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:622
+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:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Zaslonska slika ni veljavna"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Iskalna stran"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Poišči program"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "Ni mogoče prejeti strojne programske opreme prek spletišča %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 "Ni mogoče prejeti posodobitev prek spletišča %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 "Prejemanje datotek posodobitev je spodletelo"
+
+#. 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 ""
+"Prejemanje datotek posodobitev je spodletelo: zahtevana je omrežna povezava, "
+"ki pa ni na voljo"
+
+#. 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 ""
+"Ni mogoče prejeti posodobitev prek spletišča %s: ni dovolj prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr ""
+"Prejemanje datotek posodobitev je spodletelo: ni dovolj prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Ni mogoče prejeti posodobitev: zahtevana je overitev"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Ni mogoče prejeti posodobitev: overitev je spodletela"
+
+#. 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 ""
+"Ni mogoče prejeti posodobitev: ni ustreznih dovoljenj za nameščanje "
+"programske opreme"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Pridobivanje seznama posodobitev je spodletelo"
+
+#. 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 ""
+"Paketa %s ni mogoče namestiti, ker je prejemanje prek spletišča %s "
+"spodletelo."
+
+#. 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 "Ni mogoče namestiti paketa %s, ker je prejemanje spodletelo"
+
+#. 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 "Nameščanje %s je spodletelo, ker zagonsko okolje %s ni na voljo"
+
+#. 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 "Namestitev %s ni mogoča, ker paket ni podprt"
+
+#. 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 "Namestitev ni mogoča: zahtevana je omrežna povezava, ki pa ni na voljo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Paketa ni mogoče namestiti: program je shranjen v napačnem zapisu"
+
+#. 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 "Namestitev %s ni mogoča: ni dovolj prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Paketa %s ni mogoče namestiti: zahtevana je overitev"
+
+#. 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 "Paketa %s ni mogoče namestiti: overitev je spodletela"
+
+#. 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 ""
+"Paketa %s ni mogoče namestiti: ni ustreznih dovoljenj za nameščanje "
+"programske opreme"
+
+#. 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 ""
+"Paketa %s ni mogoče namestiti: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 "Paketa %s ni mogoče namestiti: napetost baterije je prenizka"
+
+#. 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 "Namestitev %s ni mogoča"
+
+#. 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 ""
+"Ni mogoče posodobiti programa %s projekta %s, ker je prejemanje spodletelo"
+
+#. 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 "Paketa %s ni mogoče posodobiti., ker je prejemanje 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Ni mogoče namestiti posodobitev %s, ker je prejemanje spodletelo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Ni mogoče namestiti posodobitev, ker je prejemanje spodletelo"
+
+#. 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 ""
+"Posodobitev je spodletela: zahtevana je omrežna povezava, ki pa ni na voljo"
+
+#. 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 "Posodobitev %s je spodletela: ni dovolj prostora na disku"
+
+#. 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 "Ni mogoče namestiti posodobitev: ni dovolj prostora na disku"
+
+#. 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 "Paketa %s ni mogoče posodobiti: zahtevana je overitev"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Ni mogoče namestiti posodobitev: zahtevana je overitev"
+
+#. 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 "Paketa %s ni mogoče posodobiti: overitev je spodletela"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Ni mogoče namestiti posodobitev: overitev je spodletela"
+
+#. 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 ""
+"Paketa %s ni mogoče posodobiti: ni ustreznih dovoljenj za nameščanje "
+"programske opreme"
+
+#. 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 ""
+"Ni mogoče namestiti posodobitev: ni ustreznih dovoljenj za nameščanje "
+"programske opreme"
+
+#. 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 ""
+"Paketa %s ni mogoče posodobiti: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 ""
+"Ni mogoče namestiti posodobitev: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 "Paketa %s ni mogoče posodobiti: napetost baterije je prenizka"
+
+#. 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 "Ni mogoče namestiti posodobitev: napetost baterije je prenizka"
+
+#. 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 "Posodobitev %s je spodletela"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Ni mogoče namestiti posodobitev"
+
+#. 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 "Okolja ni mogoče nadgraditi na različico %s prek spletišča %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 "Nadgradnja na %s ni mogoče, ker je prejemanje datotek spodletelo."
+
+#. 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 ""
+"Nadgradnja na %s ni mogoča: zahtevana je omrežna povezava, ki pa ni na voljo"
+
+#. 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 "ni mogoče posodobiti na različico %s: ni dovolj 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "Okolja ni mogoče nadgraditi na različico %s: 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:1694
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr "Okolja ni mogoče nadgraditi na različico %s: overitev je spodletela"
+
+#. 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 ""
+"Okolja ni mogoče nadgraditi na različico %s: ni ustreznih dovoljenj za "
+"nameščanje programske opreme"
+
+#. 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 ""
+"Okolja ni mogoče nadgraditi na različico %s: zahtevan je priklop napajanja "
+"iz omrežja"
+
+#. 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 ""
+"Okolja ni mogoče nadgraditi na različico %s: 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:1721
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr ""
+"Paketa %s ni mogoče posodobiti: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 ""
+"Paketa %s ni mogoče odstraniti: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 "Paketa %s ni mogoče odstraniti: zahtevana je overitev"
+
+#. 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 ""
+"Paketa %s ni mogoče odstraniti: ni ustreznih dovoljenj za odstranjevanje "
+"programske opreme"
+
+#. 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 ""
+"Paketa %s ni mogoče posodobiti: zahtevan je priklop napajanja iz omrežja"
+
+#. 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 "Paketa %s ni mogoče odstraniti: napetost baterije je prenizka"
+
+#. 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 "Paketa %s ni mogoče odstraniti"
+
+#. 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 "Ni mogoče zagnati %s: %s ni nameščen"
+
+#. 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 "Ni dovolj prostora na disku. Sprostite ga in poskusite znova."
+
+#. 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 "Opravila ni bilo mogoče izvesti!"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Namestitev datoteke je spodletela: vrsta ni podprta"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Namestitev paketa je prekinjena: overitev je spodletela"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Namestitev je spodletela: opravilo ni podprto"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Namestitev je spodletela: ni mogoče izvesti overitve"
+
+#. 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 "Povezava s spletiščem %s ni mogoča."
+
+#. 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 "Program je treba pred uporabo novih vstavkov ponovno zagnati."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Zahtevan je priklop napajanja iz omrežja"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "Napetost baterije je prenizka"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Viri programske opreme"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Nastavitve posodabljanja"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Preuči nosilec"
+
+#. 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 "Omrežne nastavitve"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Ponovno zaženi"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Več podrobnosti"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Iskanje"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Osnovni meni"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "_Več o tem"
+
+#. 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 "Posodobitve"
+
+#. 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 "Application Data"
+msgstr "Podatki programa"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Sistemsko dodeljene knjižnice, ki jih program zahteva"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Neznano"
+
+#. 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 "Mesta za shranjevanje"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Predpomnjene podatke je mogoče počistiti med <a href=\"dummy\"> nastavitvami "
+"_programa</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (nameščeno)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (poteka nameščanje)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (poteka odstranjevanje)"
+
+#. 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 "Nameščene posodobitve"
+
+#. 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 "Nameščeno na %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Ni nameščenih posodobitev"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Programske posodobitve so zastarele"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Preveri za posodobitve."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Pomembne programske posodobitve so pripravljene za namestitev."
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Pomembne programske posodobitve so pripravljene za namestitev."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Pomembne programske posodobitve so pripravljene za prejem."
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Pomembno: na voljo so kritične programske posodobitve."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Programske posodobitve, pripravljene za namestitev"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Izbrane programske posodobitve so pripravljene za namestitev."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Programske posodobitve, pripravljene za prejem"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Priporočljivo je prejeti posodobitve, pripravljene za namestitev."
+
+#. 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 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:361
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications 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 application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "Program %s je posodobljen."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Program je treba ponovno zagnati."
+
+#. 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 "Programa %s in %s sta posodobljena."
+
+#. 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 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 application names, e.g. Firefox
+#: src/gs-update-monitor.c:401
+#, 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:671 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Posodobitve operacijskega sistema niso na voljo."
+
+#. 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 "Posodobite sistem za nadaljnje prejemanje varnostnih posodobitev."
+
+#. 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 "Za namestitev je na voljo je nova različica %s"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Na voljo so posodobitve programske opreme"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Posodabljanje programske opreme je spodletelo"
+
+#. 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 "Namestitev pomembne posodobitve operacijskega sistema je spodletela."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Pokaži podrobnosti"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Ocena"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Nazadnje preverjeno: %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 "Distribucija %s %s ni več podprta."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Nameščen operacijski sistem ni več podprt."
+
+#. 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 pomeni, da ne bo več mogoče prejemati varnostnih posodobitev."
+
+#. 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 "Priporočljivo je nadgraditi sistem na novejšo različico."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+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:853
+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čna za telefon."
+
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-updates-page.c:857
+msgid "Check _Anyway"
+msgstr "_Vseeno preveri"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Ni omrežne povezave"
+
+#. 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 ""
+"Za preverjanje za posodobitve mora biti vzpostavljena povezava v splet."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Preveri za posodobitve"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Posodobitve"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Stran posodobitev"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Poteka nalaganje posodobitev …"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Posodobljeno"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Ali želite uporabiti mobilne podatke?"
+
+#: src/gs-updates-page.ui:243
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Preverjanje za posodobitve z uporabo dostopa preko mobilne širokopasovne "
+"povezave lahko povzroči nepričakovane stroške."
+
+#: src/gs-updates-page.ui:246
+msgid "_Check Anyway"
+msgstr "_Vseeno preveri"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Brez povezave"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Preveri za posodobitve preko interneta"
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Omrežne nastavitve"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Napaka"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Posodobitve se upravljalo samodejno."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Ponovni zagon in namestitev"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Posodobi vse"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Posodobitve programov"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Strojna programska oprema naprave"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "Na voljo je posodobitev distribucije %s"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Več o novi različici"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Poteka prejemanje …"
+
+#. 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 "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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Prejeto je %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+msgid "A major upgrade, with new features and added polish."
+msgstr "Večja posodobitev z novimi zmožnostmi."
+
+#: src/gs-upgrade-banner.ui:187
+msgid "_Restart & Upgrade"
+msgstr "_Ponovni zagon in posodobitev"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr ""
+"Pred posodabljanjem je priporočljivo je ustvariti varnostno kopijo podatkov "
+"in datotek."
+
+#: 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 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 ""
+"Posodobitve;Posodobitev;Viri;Skladišča;Programi;Namestitev;Lastnosti;"
+"Odnamestitev;App;Trgovina;Update;"
+
+#. 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 "Sistemske posodobitve"
+
+#. 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 ""
+"Splošne sistemske posodobitve, kot so varnostni popravki ali odprava "
+"hroščev, izboljšanje delovanja."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Poteka prejemanje zaslonskih slik programov …"
+
+#. 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 "Posodobitev %s z novimi zmožnostmi in popravki."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Splet"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Poteka prejemanje podrobnosti posodobitev …"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Sistemska mapa %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Podrejena osebna mapa %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Sistemske gostiteljske mape"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Nastavitve gostiteljevega sistema iz /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Mapa namizja"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Podrejena mapa namizja %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Mapa dokumentov"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Podrejena mapa dokumentov %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Glasbena mapa"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Podrejena mapa glasbe %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Mapa s slikami"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Podrejena mapa slik %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Mapa javne souporabe"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Podrejena mapa javne souporabe %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Mapa video posnetkov"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Podrejena mapa videa %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Mapa predlog"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Podrejena mapa predlog %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Uporabnikova mapa predpomnilnika"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Podrejena mapa uporabnikovega predpomnilnika %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Mapa uporabniških nastavitev"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Podrejena mapa uporabniških nastavitev %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Uporabniška podatkovna mapa"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Podrejena mapa uporabnikovih podatkov %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Uporabniška izvajalna mapa"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Podrejena uporabnikova izvedbena mapa %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Pridobi metapodatke flatpak za %s …"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"Oddaljeno mesto »%s« ne dovoli namestitve »%s«, najverjetneje zaradi filtra. "
+"Odstranite ga in poskusite znova. Podrobna napaka je: %s"
+
+#. 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 "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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Posodobitev nastavitev %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Posodobitev kamere %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Posodobitev pogona USB %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Strojna programska oprema"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Ali želite namestiti nepodpisano programsko opremo?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Ali želite prejeti nepodpisano programsko opremo?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Ali želite posodobiti nepodpisano programsko opremo?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paketi"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Upravljalnik programov za GNOME"
+
+#~ msgid "A list of popular applications"
+#~ msgstr "Seznam priljubljene programske opreme"
+
+#~ msgid "A list of applications to use, overriding the system defined ones."
+#~ msgstr ""
+#~ "Seznam programov za uporabo, ki prepišejo privzeta določila sistema."
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ msgid "Software catalog is being downloaded"
+#~ msgstr "Katalog programske opreme se posodablja"
+
+#~ msgid "Name"
+#~ msgstr "Ime"
+
+#~ msgid "system"
+#~ msgstr "sistem"
+
+#~ msgid "user"
+#~ msgstr "uporabnik"
+
+#~ msgid "Channel"
+#~ msgstr "Kanal"
+
+#~ msgid "Branch"
+#~ msgstr "Veja"
+
+#~ msgid "URL"
+#~ msgstr "Naslov URL"
+
+#~ msgid "Installation"
+#~ msgstr "Namestitev"
+
+#~ msgid "Version"
+#~ msgstr "Različica"
+
+#~ msgid "No updates have been installed on this system."
+#~ msgstr "Sistem ni bil posodobljen."
+
+#~ msgid "Checking…"
+#~ msgstr "Poteka preverjanje …"
+
+#~ msgid "Endless OS"
+#~ msgstr "Endless OS"
+
+#~ msgid "Loading…"
+#~ msgstr "Poteka nalaganje …"
+
+#~ msgid "Downloading application ratings…"
+#~ msgstr "Poteka prejemanje ocen programske preme …"
+
+#~ msgid "The URI that references the background for an upgrade banner."
+#~ msgstr "Naslov URI, ki pomeni sklic za ozadje pasice posodobitve"
+
+#~ msgid ""
+#~ "The URI can contain up to three '%u', which will be replaced by the "
+#~ "upgrade version."
+#~ msgstr ""
+#~ "Naslov URI lahko vsebuje do tri »%u«, ki bodo zamenjanji pri "
+#~ "posodobitveni različici."
+
+#~ msgid "_Add shortcut"
+#~ msgstr "_Dodaj tipkovno bližnjico"
+
+#~ msgid "Re_move shortcut"
+#~ msgstr "Od_strani tipkovno bližnjico"
+
+#~ msgid "Welcome"
+#~ msgstr "Dobrodošli"
+
+#~ msgid "Welcome to Software"
+#~ msgstr "Dobrodošli med programi"
+
+#~ 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 ""
+#~ "Orodje omogoča nameščanje programske opreme. Oglejte si priporočene "
+#~ "programe, prebrskajte med kategorijami in poiščite programe po vaših "
+#~ "željah."
+
+#~ msgid "_Browse Software"
+#~ msgstr "_Prebrskaj programsko opremo"
+
+#~ msgid "OS Updates"
+#~ msgstr "Posodobitve sistema"
+
+#~ msgid "Includes performance, stability and security improvements."
+#~ msgstr ""
+#~ "Vključuje izboljšave delovanja, stabilnosti in varnosti za vse uporabnike."
+
+#~ msgid "Downloading firmware update signature…"
+#~ msgstr "Prejemanje podpisov posodobitev strojne programske opreme …"
+
+#~ msgid "Downloading firmware update metadata…"
+#~ msgstr "Prejemanje metapodatkov posodobitev strojne programske opreme …"
+
+#~ msgid "Software has unknown permissions"
+#~ msgstr "Zahteve programa niso znane"
+
+#~ msgid "Software comes from a trusted source"
+#~ msgstr "Program objavlja zaupanja vreden vir"
+
+#~ msgid "Unknown Permissions"
+#~ msgstr "Neznana dovoljenja"
+
+#~ msgid "The permissions needed by this app aren’t known"
+#~ msgstr "Posebne zahteve programa niso znane"
+
+#~ msgid "App comes from a trusted source"
+#~ msgstr "Program objavlja zaupanja vreden vir"
+
+#~ msgid "Your distribution has verified that this app can be trusted"
+#~ msgstr "Program je sistemsko overjen kot varen"
+
+#~ msgid "Show the prompt to install nonfree software repositories"
+#~ msgstr ""
+#~ "Pokaži potrditveno okno pred nameščanjem plačljive programske opreme"
+
+#~ msgid "Not optimized for touch devices or phones"
+#~ msgstr "Ni prilagojeno za mobilne naprave in telefone"
+
+#~ msgid "Editor’s Picks"
+#~ msgstr "Izbor urednikov"
+
+#~ msgid "Recently Updated"
+#~ msgstr "Nedavno posodobljeno"
+
+#~ msgid "_Read More"
+#~ msgstr "_Preberi več"
+
+#~ msgid "_Read Less"
+#~ msgstr "_Preberi manj"
+
+#~ msgid "_Launch"
+#~ msgstr "_Zaženi"
+
+#~ msgid ""
+#~ "Some of this software is proprietary and therefore has restrictions on "
+#~ "use, sharing, and access to source code."
+#~ msgstr ""
+#~ "Nekateri programski viri so lastniški in omejujejo dovoljenja za uporabo, "
+#~ "izmenjavo oziroma dostop do izvorne programske kode."
+
+#~ msgid "Find out more…"
+#~ msgstr "Več o tem …"
+
+#~ msgid "Recent Releases"
+#~ msgstr "Nedavne objave"
+
+#, c-format
+#~ msgid "Remove “%s”?"
+#~ msgstr "Ali želite odstraniti »%s«?"
+
+#, c-format
+#~ msgid "Disable “%s”?"
+#~ msgstr "Ali želite onemogočiti »%s«?"
+
+#~ msgid "Remove"
+#~ msgstr "Odstrani"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Ni dodatnih programskih virov"
+
+#~ msgid "_Enable"
+#~ msgstr "_Omogoči"
+
+#~ msgid "_Remove…"
+#~ msgstr "_Odstrani …"
+
+#~ msgid "_Disable…"
+#~ msgstr "O_nemogoči …"
+
+#~ msgid "Enabling"
+#~ msgstr "Omogočeno"
+
+#~ msgid "Disabling"
+#~ msgstr "Onemogočeno"
+
+#~ msgid "Enabled"
+#~ msgstr "Omogočeno"
+
+#~ msgid "Disabled"
+#~ msgstr "Onemogočeno"
+
+#~ msgid "_Remove All"
+#~ msgstr "_Odstrani vse"
+
+#~ msgid "_Restart Now"
+#~ msgstr "_Ponovno zaženi"
+
+#~ msgid "Updates will be applied when the computer is restarted."
+#~ msgstr "Posodobitve bodo uveljavljene ob naslednjem zagonu naprave."
+
+#, c-format
+#~ msgid "Waiting to Download %s %s"
+#~ msgstr "Poteka prejemanje paketov %s %s"
+
+#, c-format
+#~ msgid "Downloading %s %s"
+#~ msgstr "Prejemanje posodobitve %s %s"
+
+#, c-format
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s Pripravljeno za namestitev"
+
+#~ msgid "Requires a specific screen size"
+#~ msgstr "Zahteva določeno velikost zaslona"
+
+#~ msgctxt "updated"
+#~ msgid "Never"
+#~ msgstr "Nikoli"
+
+#~ msgid "Localized in your Language"
+#~ msgstr "Na voljo je jezikovna prilagoditev"
+
+#~ msgid "Release Activity"
+#~ msgstr "Objava"
+
+#~ msgid "Developer"
+#~ msgstr "Razvijalec"
+
+#~ msgctxt "app status"
+#~ msgid "Uninstalled"
+#~ msgstr "Odstranjena namestitev"
+
+#~ msgctxt "app status"
+#~ msgid "Installed"
+#~ msgstr "Nameščeno"
+
+#~ msgctxt "app status"
+#~ msgid "Updated"
+#~ msgstr "Posodobljeno"
+
+#~ msgctxt "app status"
+#~ msgid "Unknown"
+#~ msgstr "Neznano"
+
+#~ msgid "History"
+#~ msgstr "Zgodovina"
+
+#~ msgid "More…"
+#~ msgstr "Več …"
+
+#~ msgid "Recommended Games"
+#~ msgstr "Priporočene igre"
+
+#, fuzzy
+#~| msgid "Recommended Audio Applications"
+#~ msgid "Recommended Creation Applications"
+#~ msgstr "Priporočeni zvočni programi"
+
+#, fuzzy
+#~| msgid "Recommended Audio Applications"
+#~ msgid "Recommended Work Applications"
+#~ msgstr "Priporočeni zvočni programi"
+
+#~ msgid "Navigation sidebar"
+#~ msgstr "Navigacijska stranska vrstica"
+
+#, c-format
+#~ msgid "%s (needs attention)"
+#~ msgstr "%s (zahteva pregled)"
+
+#, fuzzy
+#~| msgid "Setting up updates…"
+#~ msgid "Setting Up Updates…"
+#~ msgstr "Poteka nastavljanje posodobitev …"
+
+#~ msgid "Looking for New Updates…"
+#~ msgstr "Poteka preverjanje za posodobitve …"
+
+#~ msgid "Select All"
+#~ msgstr "Izberi vse"
+
+#~ msgid "Select None"
+#~ msgstr "Odstrani izbor"
+
+#~ msgid "_Installed"
+#~ msgstr "_Nameščeno"
+
+#~ msgid "_Updates"
+#~ msgstr "_Posodobitve"
+
+#, c-format
+#~ msgid "Featured %s"
+#~ msgstr "Novosti %s"
+
+#~ msgid "Show"
+#~ msgstr "Pokaži"
+
+#~ msgid "Subcategories filter menu"
+#~ msgstr "Meni filtrov podkategorij"
+
+#~ msgid "Sort"
+#~ msgstr "Razvrsti"
+
+#~ msgid "Subcategories sorting menu"
+#~ msgstr "Meni razvrščanja podkategorij"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Games"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "All"
+#~ msgstr "Vsi"
+
+#~ msgctxt "Menu of Utilities"
+#~ msgid "Featured"
+#~ msgstr "Novosti"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Reference"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgid "Audio & Video"
+#~ msgstr "Zvok in slika"
+
+#~ msgid "Developer Tools"
+#~ msgstr "Razvojna orodja"
+
+#~ msgid "Education & Science"
+#~ msgstr "Izobraževanje in Znanost"
+
+#~ msgid "Games"
+#~ msgstr "Igre"
+
+#~ msgid "Graphics & Photography"
+#~ msgstr "Grafika in fotografija"
+
+#~ msgid "Productivity"
+#~ msgstr "Produktivnost"
+
+#~ msgid "Communication & News"
+#~ msgstr "Sporočanje in novičarstvo"
+
+#~ msgid "Reference"
+#~ msgstr "Sklici"
+
+#~ msgid "Utilities"
+#~ msgstr "Pripomočki"
+
+#~ msgid ""
+#~ "Unable to determine which parts of the system this application accesses. "
+#~ "This is typical for older applications."
+#~ msgstr ""
+#~ "Ni mogoče določiti, do katerih delov sistema program dostopa. Napaka je "
+#~ "običajno zaznana pri starejših programih."
+
+#~ msgctxt "App permissions"
+#~ msgid "Low"
+#~ msgstr "Nizka"
+
+#~ msgctxt "App permissions"
+#~ msgid "Medium"
+#~ msgstr "Srednja"
+
+#~ msgctxt "App permissions"
+#~ msgid "High"
+#~ msgstr "Visoka"
+
+#~ msgctxt "App permissions"
+#~ msgid "Unknown"
+#~ msgstr "Neznana"
+
+#~ msgid "Public domain"
+#~ msgstr "Javna domena"
+
+#~ msgid "https://en.wikipedia.org/wiki/Public_domain"
+#~ msgstr "https://sl.wikipedia.org/wiki/Javna_last"
+
+#~ msgid "https://www.gnu.org/philosophy/free-sw"
+#~ msgstr "https://www.gnu.org/philosophy/free-sw.sl"
+
+#~ msgid "Users are bound by the following license:"
+#~ msgid_plural "Users are bound by the following licenses:"
+#~ msgstr[0] ""
+#~ "Uporabniki so zavezani k upoštevanju določil naslednjih dovoljenj:"
+#~ msgstr[1] ""
+#~ "Uporabniki so zavezani k upoštevanju določil naslednega dovoljenja:"
+#~ msgstr[2] ""
+#~ "Uporabniki so zavezani k upoštevanju določil naslednjih dovoljenj:"
+#~ msgstr[3] ""
+#~ "Uporabniki so zavezani k upoštevanju določil naslednjih dovoljenj:"
+
+#~ msgid "Sandboxed"
+#~ msgstr "Izvedeno v peskovniku"
+
+#~ msgid "Category"
+#~ msgstr "Kategorija"
+
+#~ msgid "Free"
+#~ msgstr "Prosto"
+
+#~ msgctxt "Application license"
+#~ msgid "Unknown"
+#~ msgstr "Neznano"
+
+#~ msgid ""
+#~ "This means that the software can be freely run, copied, distributed, "
+#~ "studied and modified."
+#~ msgstr ""
+#~ "To pomeni, da je programska oprema brez omejitev uporabe, kopiranja, "
+#~ "razširjanja in tudi spreminjanja izvorne kode."
+
+#~ msgid "Proprietary Software"
+#~ msgstr "Lastniški programski viri"
+
+#~ 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 pomeni, da je programska oprema v lasti posameznika ali podjetja. "
+#~ "Obstajajo pogosto omejitve uporabe in dostopa do izvorne kode."
+
+#~ msgid "Unknown Software License"
+#~ msgstr "Neznano dovoljenje programske opreme"
+
+#~ msgid "The license terms of this software are unknown."
+#~ msgstr "Pogoji dovoljenja te programske opreme niso znani."
+
+#~ msgid "The application was rated this way because it features:"
+#~ msgstr "Program je tako ocenjen zaradi:"
+
+#~ msgid "No details were available for this rating."
+#~ msgstr "Ni podrobnosti o tej oceni."
+
+#~ msgid "Recommended Audio & Video Applications"
+#~ msgstr "Priporočeni zvočni in video programi"
+
+#~ msgid "Recommended Graphics Applications"
+#~ msgstr "Priporočeni grafični programi"
+
+#~ msgid "Recommended Productivity Applications"
+#~ msgstr "Priporočeni pisarniški programi"
+
+#~ msgid "ratings in total"
+#~ msgstr "skupno število ocen"
+
+#~ msgid "Software is up to date"
+#~ msgstr "Programska oprema je posodobljena"
+
+#~ msgid "ODRS is a service providing user reviews of applications"
+#~ msgstr ""
+#~ "Storitev ODRS omogoča objavljanje in prebiranje uporabniških mnenj o "
+#~ "programski opremi."
+
+#~ msgid "Cartoon characters in unsafe situations"
+#~ msgstr "Risani liki v nevarnih situacijah"
+
+#~ msgid "Cartoon characters in aggressive conflict"
+#~ msgstr "Risani liki v nasilnih konfliktih"
+
+#~ msgid "Graphic violence involving cartoon characters"
+#~ msgstr "Nazorno nasilje med risanimi liki"
+
+#~ msgid "Characters in unsafe situations easily distinguishable from reality"
+#~ msgstr ""
+#~ "Liki v nevarnih situacijah, ki jih je mogoče zlahka razlikovati od "
+#~ "realnosti"
+
+#~ msgid ""
+#~ "Characters in aggressive conflict easily distinguishable from reality"
+#~ msgstr ""
+#~ "Liki v nasilnem konfliktu, ki ga je mogoče zlahka razlikovati od realnosti"
+
+#~ msgid "Graphic violence easily distinguishable from reality"
+#~ msgstr "Nazorno nasilje, ki ga je mogoče zlahka razlikovati od realnosti"
+
+#~ msgid "Mildly realistic characters in unsafe situations"
+#~ msgstr "Napol realistični liki v nevarnih situacijah"
+
+#~ msgid "Depictions of realistic characters in aggressive conflict"
+#~ msgstr "Prikazovanje realističnih likov v nasilnih konfliktih"
+
+#~ msgid "Graphic violence involving realistic characters"
+#~ msgstr "Nazorno nasilje, ki vključuje realistične like"
+
+#~ msgid "No bloodshed"
+#~ msgstr "Brez prelivanja krvi"
+
+#~ msgid "Unrealistic bloodshed"
+#~ msgstr "Nerealistično prelivanje krvi"
+
+#~ msgid "Realistic bloodshed"
+#~ msgstr "Realistično prelivanje krvi"
+
+#~ msgid "Depictions of bloodshed and the mutilation of body parts"
+#~ msgstr "Prikazi prelivanja krvi in pohabljanje delov telesa"
+
+#~ msgid "Rape or other violent sexual behavior"
+#~ msgstr "Posilstvo ali drugo nasilno vedenje"
+
+#~ msgid "References to alcoholic beverages"
+#~ msgstr "Omenjanje alkoholnih pijač"
+
+#~ msgid "Use of alcoholic beverages"
+#~ msgstr "Uporaba alkoholnih pijač"
+
+#~ msgid "References to illicit drugs"
+#~ msgstr "Omenjanje prepovedanih drog"
+
+#~ msgid "Use of illicit drugs"
+#~ msgstr "Uporaba prepovedanih drog"
+
+#~ msgid "References to tobacco products"
+#~ msgstr "Sklici na tobačne izdelke"
+
+#~ msgid "Use of tobacco products"
+#~ msgstr "Uporaba tobačnih izdelkov"
+
+#~ msgid "Brief artistic nudity"
+#~ msgstr "Krajše umetniško ponazorjena spolnost"
+
+#~ msgid "Prolonged nudity"
+#~ msgstr "Daljši prikazi golote"
+
+#~ msgid "Provocative references or depictions"
+#~ msgstr "Izzivalno obnašanje ali upodobljanje"
+
+#~ msgid "Sexual references or depictions"
+#~ msgstr "Prikrit spolni akt"
+
+#~ msgid "Graphic sexual behavior"
+#~ msgstr "Nazorno seksualno vedenje"
+
+#~ msgid "Mild or infrequent use of profanity"
+#~ msgstr "Nežno ali redko preklinjanje"
+
+#~ msgid "Moderate use of profanity"
+#~ msgstr "Zmerno preklinjanje"
+
+#~ msgid "Strong or frequent use of profanity"
+#~ msgstr "Izrazito ali pogosto preklinjanje"
+
+#~ msgid "Slapstick humor"
+#~ msgstr "Situacijski humor"
+
+#~ msgid "Vulgar or bathroom humor"
+#~ msgstr "Vulgaren humor"
+
+#~ msgid "Mature or sexual humor"
+#~ msgstr "Humor za odrasle"
+
+#~ msgid "Negativity towards a specific group of people"
+#~ msgstr "Negativen odnos do specifične skupine ljudi"
+
+#~ msgid "Discrimination designed to cause emotional harm"
+#~ msgstr "Diskriminatorno delovanje, ki lahko sproži močan čustven odziv"
+
+#~ msgid "Explicit discrimination based on gender, sexuality, race or religion"
+#~ msgstr "Izrecna diskriminacija na podlagi spola, spolnosti, rase ali vere"
+
+#~ msgid "Product placement"
+#~ msgstr "Opredelitev izdelka"
+
+#~ msgid "Explicit references to specific brands or trademarked products"
+#~ msgstr "Izrecna sklicevanja na določene blagovne znamke ali izdelke"
+
+#~ msgid "Users are encouraged to purchase specific real-world items"
+#~ msgstr "Uporabnike spodbuja k nakupu določenih fizičnih predmetov"
+
+#~ msgid "Gambling on random events using tokens or credits"
+#~ msgstr ""
+#~ "Igranje na srečo na naključnih dogodkih z uporabo žetonov ali kreditnih "
+#~ "točk"
+
+#~ msgid "Gambling using “play” money"
+#~ msgstr "Igranje na srečo s namišljenim denarjem"
+
+#~ msgid "Gambling using real money"
+#~ msgstr "Igranje na srečo s pravim denarjem"
+
+#~ msgid "Users are encouraged to donate real money"
+#~ msgstr "Uporabnike spodbuja k donaciji uradnih denarnih valut"
+
+#~ msgid "Ability to spend real money in-app"
+#~ msgstr "Možnost uporabe pravega denarja v programu"
+
+#~ msgid "User-to-user interactions without chat functionality"
+#~ msgstr "Interakcije med uporabniki brez funkcije za klepet"
+
+#~ msgid "Moderated chat functionality between users"
+#~ msgstr "Nadzorovana možnost klepeta med uporabniki"
+
+#~ msgid "Uncontrolled audio or video chat functionality between users"
+#~ msgstr "Nenadzorovana možnost zvočnega ali video klepeta med uporabniki"
+
+#~ msgid "Sharing social network usernames or email addresses"
+#~ msgstr ""
+#~ "Objavljanje uporabniškega imena ali elektronskega naslova socialnega "
+#~ "omrežja"
+
+#~ msgid "Checking for the latest application version"
+#~ msgstr "Poteka preverjanje najnovejše različice programa"
+
+#~ msgid "Sharing diagnostic data that does not let others identify the user"
+#~ msgstr ""
+#~ "Objavljanje podatkov diagnostike, ki ne vključuje podatkov o istovetnosti "
+#~ "uporabnika"
+
+#~ msgid "Sharing information that lets others identify the user"
+#~ msgstr "Objavljanje podrobnosti o uporabniku"
+
+#~ msgid "Sharing physical location with other users"
+#~ msgstr "Omogočeno je objavljanje trenutnega mesta drugim uporabnikom"
+
+#~ msgid "Indirect references to homosexuality"
+#~ msgstr "Posredno namigovanje na homoseksualnost"
+
+#~ msgid "Kissing between people of the same gender"
+#~ msgstr "Poljubljanje med osebami istega spola"
+
+#~ msgid "Graphic sexual behavior between people of the same gender"
+#~ msgstr "Nazorno spolno obnašanje med osebami istega spola"
+
+#~ msgid "Indirect references to prostitution"
+#~ msgstr "Posredno namigovanje na prostitucijo"
+
+#~ msgid "Direct references to prostitution"
+#~ msgstr "Neposredno omenjanje prostitucije"
+
+#~ msgid "Graphic depictions of the act of prostitution"
+#~ msgstr "Nazoren prikaz prostitucije"
+
+#~ msgid "Indirect references to adultery"
+#~ msgstr "Posredno namigovanje na nezvestobo"
+
+#~ msgid "Direct references to adultery"
+#~ msgstr "Neposredno omenjanje nezvestobe"
+
+#~ msgid "Graphic depictions of the act of adultery"
+#~ msgstr "Nazoren prikaz prešuštva"
+
+#~ msgid "Scantily clad human characters"
+#~ msgstr "Pomanjkljivo oblečeni človeški liki"
+
+#~ msgid "Overtly sexualized human characters"
+#~ msgstr "Prekomerno spolno izraženi človeški liki"
+
+#~ msgid "Depictions of or references to historical desecration"
+#~ msgstr "Prikazovanje ali sklicevanja na zgodovinsko skrunitev"
+
+#~ msgid "Depictions of modern-day human desecration"
+#~ msgstr "Prikazovanje sodobnega skrunjenja človeškega telesa"
+
+#~ msgid "Graphic depictions of modern-day desecration"
+#~ msgstr "Nazorno prikazovanje sodobnega skrunjenja človeškega telesa"
+
+#~ msgid "Visible dead human remains"
+#~ msgstr "Vidni deli mrtvih ljudi"
+
+#~ msgid "Dead human remains that are exposed to the elements"
+#~ msgstr "Izpostavljanje ostankov človeških teles"
+
+#~ msgid "Graphic depictions of desecration of human bodies"
+#~ msgstr "Nazorno prikazovanje oskrunjenja človeškega telesa"
+
+#~ msgid "Depictions of or references to historical slavery"
+#~ msgstr "Prikazovanje suženjstva v preteklosti"
+
+#~ msgid "Depictions of modern-day slavery"
+#~ msgstr "Prikazovanje sodobnega suženjstva"
+
+#~ msgid "Graphic depictions of modern-day slavery"
+#~ msgstr "Nazorno prikazovanje sodobnega suženjstva"
+
+#~ msgid "General"
+#~ msgstr "Splošno"
+
+#~ msgid "ALL"
+#~ msgstr "Vse"
+
+#~ msgid "Teen"
+#~ msgstr "Najstniki"
+
+#~ msgid "Everyone 10+"
+#~ msgstr "Kdorkoli nad 10"
+
+#~ msgid "Everyone"
+#~ msgstr "Vsi"
+
+#~ msgid "Early Childhood"
+#~ msgstr "Zgodnje otroštvo"
+
+#~ msgctxt "version"
+#~ msgid "Unknown"
+#~ msgstr "Neznano"
+
+#, fuzzy
+#~| msgid "Recent Releases"
+#~ msgid "Released"
+#~ msgstr "Nedavne objave"
+
+#~ msgid "Format"
+#~ msgstr "Zapis"
+
+#~ msgid "%R"
+#~ msgstr "%R"
+
+#~ msgid "%l:%M %p"
+#~ msgstr "%H:%M"
+
+#~ msgid "Yesterday, %R"
+#~ msgstr "Včeraj, %R"
+
+#~ msgid "Yesterday, %l:%M %p"
+#~ msgstr "Včeraj, %l:%M %p"
+
+#~ msgid "Three days ago"
+#~ msgstr "Pred tremi dnevi"
+
+#~ msgid "Four days ago"
+#~ msgstr "Pred štirimi dnevi"
+
+#~ msgid "Five days ago"
+#~ msgstr "Pred petimi dnevi"
+
+#~ msgid "Six days ago"
+#~ msgstr "Pred šestimi dnevi"
+
+#~ msgid "Two weeks ago"
+#~ msgstr "Pred dvema tednoma"
+
+#~ msgid "Enable GNOME Shell extensions repository"
+#~ msgstr "Omogoči skladišče razširitev za lupino GNOME"
+
+#~ msgid "this website"
+#~ msgstr "ta spletna stran"
+
+#~ msgid "_Let’s Go Shopping"
+#~ msgstr "_Začnimo z nakupi"
+
+#~ msgctxt "app status"
+#~ msgid "Removed"
+#~ msgstr "Odstranjeno"
+
+#~ msgid "Are you sure you want to remove %s?"
+#~ msgstr "Ali ste prepričani, da želite odstraniti %s?"
+
+#~ msgid "This application needs to be restarted to use new plugins."
+#~ msgstr "Program je treba pred uporabo novih vstavkov ponovno zagnati."
+
+#~ msgid "Security Updates Pending"
+#~ msgstr "Pripravljene so varnostne posodobitve programov"
+
+#~ msgid "It is recommended that you install important updates now"
+#~ msgstr "Priporočljivo je takoj namestiti pomembne posodobitve"
+
+#~ msgid "Restart & Install"
+#~ msgstr "Ponovno zaženi in namesti"
+
+#~ msgid "Important OS and application updates are ready to be installed"
+#~ msgstr "Na voljo so pomembne sistemske posodobitve in posodobitve programov"
+
+#~ msgid "View"
+#~ msgstr "Pogled"
+
+#~ msgid "About %s"
+#~ msgstr "O programu %s"
+
+#~ msgid "%s ME"
+#~ msgstr "Upravljalnik %s"
+
+#~ msgid "Show the folder management UI"
+#~ msgstr "Pokaži vmesnik upravljanja map"
+
+#~ msgid "Folder Name"
+#~ msgstr "Ime mape"
+
+#~ msgid "_Add"
+#~ msgstr "_Dodaj"
+
+#~ msgid "Add to Application Folder"
+#~ msgstr "Dodaj v programsko mapo"
+
+#~ msgid "Top Rated"
+#~ msgstr "Najbolje ocenjeno"
+
+#~ msgid "Extension Settings"
+#~ msgstr "Nastavitev pripone"
+
+#~ msgid ""
+#~ "Extensions are used at your own risk. If you have any system problems, it "
+#~ "is recommended to disable them."
+#~ msgstr ""
+#~ "Razširitve uporabljate na lastno odgovornost. Če imate kakšne sistemske "
+#~ "težave, je priporočljito te onemogočiti."
+
+#~ msgid "Failed to load components"
+#~ msgstr "Nalaganje paketov je spodletelo"
+
+#~ msgid "CSS validated OK!"
+#~ msgstr "Slogovna predloga CSS je uspešno overjena!"
+
+#~ msgid "Failed to load file"
+#~ msgstr "Nalaganje datoteke je spodletelo"
+
+#~ msgid "Unsaved changes"
+#~ msgstr "Neshranjene spremembe"
+
+#~ msgid "The application list is already loaded."
+#~ msgstr "Seznam programov je že naložen"
+
+#~ msgid "Merge documents"
+#~ msgstr "Združi dokumente"
+
+#~ msgid "Throw away changes"
+#~ msgstr "Zavrzi spremembe"
+
+#~ msgid "Open AppStream File"
+#~ msgstr "Odpri datoteko AppStream"
+
+#~ msgid "Save AppStream File"
+#~ msgstr "Shrani datoteko AppStream"
+
+#~ msgid "_Save"
+#~ msgstr "_Shrani"
+
+#~ msgid "Failed to save file"
+#~ msgstr "Shranjevanje datoteke je spodletelo"
+
+#~ msgid "%s banner design deleted."
+#~ msgstr "Zasnova oblikovanja pasice %s je izbrisana."
+
+#~ msgid "Banner design deleted."
+#~ msgstr "Zasnova oblikovanja pasice je izbrisana."
+
+#~ msgid "The application list has unsaved changes."
+#~ msgstr "Seznam programov vključuje še ne shranjene spremembe."
+
+#~ msgid "Use verbose logging"
+#~ msgstr "Shranjuj podroben izpis"
+
+#~ msgid "GNOME Software Banner Designer"
+#~ msgstr "Oblikovalnik vmesnikov za okolje GNOME"
+
+#~ msgid "No Designs"
+#~ msgstr "Ni zasnov"
+
+#~ msgid "Error message here"
+#~ msgstr "Sporočilo o napaki"
+
+#~ msgid "App ID"
+#~ msgstr "ID programa"
+
+#~ msgid "Category Featured"
+#~ msgstr "Kategorija novosti"
+
+#~ msgid "Undo"
+#~ msgstr "Razveljavi"
+
+#~ msgid "Banner Designer"
+#~ msgstr "Snovalnik pasic"
+
+#~ msgid "New Banner"
+#~ msgstr "Nova pasica"
+
+#~ msgid "Import from file"
+#~ msgstr "Uvozi iz datoteke"
+
+#~ msgid "Export to file"
+#~ msgstr "Izvozi v datoteko"
+
+#~ msgid "Delete Design"
+#~ msgstr "Izbriši zasnovo"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Posodobitev sistema"
+
+#~ msgid "Spacing"
+#~ msgstr "Razmik"
+
+#~ msgid "The amount of space between children"
+#~ msgstr "Velikost prostora med podrejenimi predmeti"
+
+#~ msgid "Click on items to select them"
+#~ msgstr "S klikom se predmeti izberejo"
+
+#~ msgid "Select"
+#~ msgstr "Izberi"
+
+#~ msgid "_Add to Folder…"
+#~ msgstr "_Dodaj v mapo …"
+
+#~ msgid "_Move to Folder…"
+#~ msgstr "_Premakni v mapo …"
+
+#~ msgid "_Remove from Folder"
+#~ msgstr "_Odstrani iz mape"
+
+#~ msgid "Featured Applications"
+#~ msgstr "Izbrani programi"
+
+#~ msgid "Design the featured banners for GNOME Software"
+#~ msgstr "Oblikovanje pasic za programsko opremo GNOME"
+
+#~ msgid "AppStream;Software;App;"
+#~ msgstr "AppStream;Programi;Programska oprema;Oprema;Aplikacije;App;"
+
+#~ msgctxt "Menu of Add-ons"
+#~ msgid "Shell Extensions"
+#~ msgstr "Razširitve lupine"
+
+#~ msgid "GNOME Shell Extensions Repository"
+#~ msgstr "Skladišče razširitev Lupine GNOME"
+
+#~ msgid "Downloading shell extension metadata…"
+#~ msgstr "Prejemanje metapodatkov razširitev ukazne lupine …"
+
+#~ msgid "GNOME Shell Extension"
+#~ msgstr "Razširitve lupine GNOME"
+
+#~ msgid "system-software-install"
+#~ msgstr "system-software-install"
+
+#~ msgid "_All"
+#~ msgstr "_Vse"
+
+#~ msgid "Sign In / Register…"
+#~ msgstr "Prijava / Vpis"
+
+#~ msgid "Continue"
+#~ msgstr "Nadaljuj"
+
+#~ msgid "Use"
+#~ msgstr "Uporabi"
+
+#~ msgid "Add another…"
+#~ msgstr "Dodaj drugo …"
+
+#~ msgid "%s will be installed, and you will be charged %s."
+#~ msgstr "Program %s bo nameščen, prejem pa bo obračunan z %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 "Prijava kot %s"
+
+#~ msgid "Sign in…"
+#~ msgstr "Prijava …"
+
+#~ msgid "Sign out"
+#~ msgstr "Odjava"
+
+#~ msgid "Unable to purchase %s: authentication was required"
+#~ msgstr "Nakup paketa %s je spodletel: zahtevana je overitev"
+
+#~ msgid "Unable to purchase %s: authentication was invalid"
+#~ msgstr "Nakup paketa %s je spodletel: overitev ni veljavna"
+
+#~ msgid "Unable to purchase %s: no payment method setup"
+#~ msgstr "Nakup paketa %s je spodletel: ni določenega načina plačila"
+
+#~ msgid "Unable to purchase %s: payment was declined"
+#~ msgstr "Nakup paketa %s je spodletel: nakup je zavrnjen"
+
+#~ msgid "Unable to purchase %s"
+#~ msgstr "Nakup paketa %s je spodletel"
+
+#~ msgid "org.gnome.Software"
+#~ msgstr "org.gnome.Software"
+
+#~ msgid "To continue, you need to use an Ubuntu One account."
+#~ msgstr "Za nadaljevanje se je treba uporabiti račun Ubuntu One."
+
+#~ msgid "To continue, you need to use your Ubuntu One account."
+#~ msgstr "Za nadaljevanje se je treba prijaviti v račun Ubuntu One."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Software catalog is being loaded"
+#~ msgstr "Katalog programske opreme se posodablja"
+
+#~ msgid "To continue you need to sign in to %s."
+#~ msgstr "Za nadaljevanje se je treba prijaviti v %s."
+
+#~ msgid "Email address"
+#~ msgstr "Elektronski naslov"
+
+#~ msgid "I have an account already"
+#~ msgstr "Račun že imam"
+
+#~ msgid "I want to register for an account now"
+#~ msgstr "Želim se vpisati za račun"
+
+#~ msgid "I have forgotten my password"
+#~ msgstr "Ne spomnim se gesla"
+
+#~ msgid "Sign in automatically next time"
+#~ msgstr "Naslednjič se samodejno prijavi"
+
+#~ msgid "Enter your one-time pin for two-factor authentication."
+#~ msgstr "Vpišite enkratno kodo PIN za dvofaktorsko overjanje."
+
+#~ msgid "PIN"
+#~ msgstr "Koda PIN"
+
+#~ msgid "Authenticate"
+#~ msgstr "Overi"
+
+#~ msgid "Your %s account has been suspended."
+#~ msgstr "Račun %s je onemogočen."
+
+#~ msgid "It is not possible to install software until this has been resolved."
+#~ msgstr ""
+#~ "Programske opreme ni mogoče namestiti, dokler težava ni odpravljena."
+
+#~ msgid "For more information, visit %s."
+#~ msgstr "Več podrobnosti je zabeleženih na %s"
+
+#~ msgid "Unable to update %s from %s"
+#~ msgstr "Paketa %s prek spletišča %s ni mogoče posodobiti."
+
+#~ msgid "_About"
+#~ msgstr "_O programu"
+
+#~ msgid "_Quit"
+#~ msgstr "_Končaj"
+
+#~ 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 ""
+#~ "Podrobnosti o %s in o možnostih za nameščenje kodekov za predvajanje "
+#~ "predstavnega zapisa, so na voljo na spletišču programa."
+
+#~ msgid "Downloading new updates…"
+#~ msgstr "Prejemanje novih posodobitev ..."
+
+#~ msgid "Downloading application page…"
+#~ msgstr "Poteka prejemanje strani programske opreme ..."
+
+#~ msgid "The ultimate entertainment platform from Valve"
+#~ msgstr "Ultimativno zabavno okolje Valve"
+
+#~ msgid "Show profiling information for the service"
+#~ msgstr "Pokaži podrobnosti profila za storitev"
+
+#~ msgid "U_pdate All"
+#~ msgstr "Posodobi _vse"
+
+#~ msgid "Restart & _Install"
+#~ msgstr "Ponovno zaženi in _namesti"
+
+#~ msgid "Getting runtime source…"
+#~ msgstr "Pridobivanje virov zagonskih programov ..."
+
+#~ msgid "Limba Support"
+#~ msgstr "Podpora Limba"
+
+#~ msgid "Limba provides developers a way to easily create software bundles"
+#~ msgstr ""
+#~ "Sistem Limba omogoča razvijalcem enostavno ustvarjanje paketov programske "
+#~ "opreme"
+
+#~ msgid "The list of extra sources that have been previously enabled"
+#~ msgstr "Seznam dodatnih virov, ki so v preteklosti že bili omogočeni"
+
+#~ msgid ""
+#~ "The list of sources that have been previously enabled when installing "
+#~ "third-party applications."
+#~ msgstr ""
+#~ "Seznam virov, ki so v preteklosti med nameščanjem programske opreme "
+#~ "tretjih oseb že bili omogočeni ."
+
+#~ msgid "Show non-free software in search results"
+#~ msgstr "Pokaži tudi ne-prosto programsko opremo v zadetkih iskanja"
+
+#~ msgid "A list of non-free sources that can be optionally enabled"
+#~ msgstr ""
+#~ "Seznam dodatnih lastniških virov, ki jih je mogoče izbirno omogočiti"
+
+#~ msgid "Player-to-player preset interactions without chat functionality"
+#~ msgstr ""
+#~ "Predložene interakcije med igralci znotraj igre brez funkcije za klepet"
+
+#~ msgid "Enable Proprietary Software Sources?"
+#~ msgstr "Ali želite omogočiti lastniške vire programske opreme?"
+
+#~ msgid "No applications or addons installed; other software might still be"
+#~ msgstr "Ni nameščenih programov; druga programska oprema še vedno je lahko"
+
+#~ msgid "Typically has restrictions on use and access to source code."
+#~ msgstr "Običajne so omejitve uporabe in dostopa do programske kode."
+
+#~ msgid "Proprietary Software Sources"
+#~ msgstr "Lastniški programski viri"
+
+#~ msgid "Remove Source"
+#~ msgstr "Odstrani vir"
+
+#~ msgid ""
+#~ "Software sources can be downloaded from the internet. They give you "
+#~ "access to additional software that is not provided by %s."
+#~ msgstr ""
+#~ "Programske vire je mogoče prejeti prek interneta. Omogočajo dostop do "
+#~ "dodatne programske opreme, ki ni podprta s strani %s."
+
+#~ msgid ""
+#~ "Removing a source will also remove any software you have installed from "
+#~ "it."
+#~ msgstr ""
+#~ "Z odstranjevanjem vira bodo odstranjeni tudi programski paketi, ki so "
+#~ "bili preko vira nameščeni."
+
+#~ msgid "No software installed from this source"
+#~ msgstr "Iz tega vira ni nameščenih programskih paketov"
+
+#~ msgid "Installed from this Source"
+#~ msgstr "Nameščeno iz podanega vira"
+
+#~ msgid "Last Checked"
+#~ msgstr "Nazadnje preverjeno"
+
+#~ msgid "Added"
+#~ msgstr "Dodano"
+
+#~ msgid "Website"
+#~ msgstr "Spletišče"
+
+#~ msgid "“%s” [%s]"
+#~ msgstr "“%s” [%s]"
+
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of AudioVideo"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Development"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Development"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Education and Science"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Education and Science"
+#~ msgid "Featured"
+#~ msgstr "Novosti"
+
+#~ msgctxt "Menu of Graphics"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Graphics"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Office"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Office"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Communication"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Communication"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Utility"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Utility"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgid "Total"
+#~ msgstr "Skupno"
+
+#~ msgid "Could not find '%s'"
+#~ msgstr "Ni mogoče najti »%s«"
+
+#~ msgid "_Install All"
+#~ msgstr "_Namesti vse"
+
+#~ msgid "Installation of %s failed."
+#~ msgstr "Namestitev %s je spodletela."
+
+#~ msgid "Removal of %s failed."
+#~ msgstr "Odstranjevanje %s je spodletelo."
+
+#~ msgid "Please make sure that you have internet access and try again."
+#~ msgstr ""
+#~ "Prepričajte se, da je vzpostavljena spletna povezava in nato poskusite "
+#~ "znova."
+
+#~ msgid "Please free up some space and try again."
+#~ msgstr "Sprostite prostor in poskusite znova."
+
+#~ msgid "If the problem persists, contact your software provider."
+#~ msgstr ""
+#~ "Če se težava ponavlja, stopite v stik s ponudnikom programske opreme."
+
+#~ msgctxt "content rating violence-fantasy"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating violence-realistic"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating violence-bloodshed"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating violence-sexual"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating drugs-alcohol"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating drugs-narcotics"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating sex-nudity"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating sex-themes"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating language-profanity"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating language-humor"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating language-discrimination"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating money-advertising"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating money-gambling"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating money-purchasing"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating social-chat"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating social-audio"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating social-contacts"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating social-info"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "content rating social-location"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgctxt "Menu of Education"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Education"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ msgctxt "Menu of Science"
+#~ msgid "All"
+#~ msgstr "Vse"
+
+#~ msgctxt "Menu of Science"
+#~ msgid "Featured"
+#~ msgstr "Novosti v ospredju"
+
+#~ 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 " ali "
+
+#~ msgid "3rd party"
+#~ msgstr "program tretje osebe"
+
+#~ msgid "web app"
+#~ msgstr "spletni program"
+
+#~ msgid "nonfree"
+#~ msgstr "lastniški program"
+
+#~ msgid "_Installing"
+#~ msgstr "_Nameščanje"
+
+#~ msgid "_Removing"
+#~ msgstr "_Odstranjevanje"
+
+#~ msgctxt "license"
+#~ msgid "Unknown"
+#~ msgstr "Neznano"
+
+#~ msgctxt "size"
+#~ msgid "Calculating…"
+#~ msgstr "Poteka preračunavanje ..."
+
+#~ msgctxt "size"
+#~ msgid "Unknown"
+#~ msgstr "Neznano"
+
+#~ msgctxt "menu category"
+#~ msgid "None"
+#~ msgstr "Brez"
+
+#~ msgid "This software comes from a 3rd party."
+#~ msgstr "Programska oprema je iz tretje roke."
+
+#~ msgid ""
+#~ "This software comes from a 3rd party and may contain non-free components."
+#~ msgstr ""
+#~ "Programsko opremo razvijajo tretje osebe in lahko vključuje tudi "
+#~ "lastniško kodo."
+
+#~ msgid "This software may contain non-free components."
+#~ msgstr "Programska oprema lahko vključuje tudi lastniško kodo."
+
+#~ msgid "_History"
+#~ msgstr "_Zgodovina"
+
+#~ msgid "Size"
+#~ msgstr "Velikost"
+
+#~ msgid "non-free"
+#~ msgstr "Lastniški program"
+
+#~ msgid "Recommended Office Applications"
+#~ msgstr "Priporočeni pisarniški programi"
+
+#~ msgid "Software sources give you access to additional software."
+#~ msgstr "Programski viri omogočajo dostop do dodatne programske opreme."
+
+#~ msgid "One Star"
+#~ msgstr "Ena zvezdica"
+
+#~ msgid "Two Stars"
+#~ msgstr "Dve zvezdici"
+
+#~ msgid "Three Stars"
+#~ msgstr "Tri zvezdice"
+
+#~ msgid "Four Stars"
+#~ msgstr "Štiri zvezdice"
+
+#~ msgid "Five Stars"
+#~ msgstr "Pet zvezdic"
+
+#~ msgid "Audio"
+#~ msgstr "Zvok"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Editing"
+#~ msgstr "Montaža"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Databases"
+#~ msgstr "Podatkovne zbirke"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Disc Burning"
+#~ msgstr "Zapisovanje diska"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Ham Radio"
+#~ msgstr "Radioamaterstvo"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "MIDI"
+#~ msgstr "MIDI"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Mixer"
+#~ msgstr "Mešanje"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Music"
+#~ msgstr "Glasba"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Recorders"
+#~ msgstr "Snemalniki"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Sequencers"
+#~ msgstr "Zaporejevalniki"
+
+#~ msgctxt "Menu subcategory of Audio"
+#~ msgid "Tuners"
+#~ msgstr "Uravnalniki"
+
+#~ msgid "Development Tools"
+#~ msgstr "Razvojna orodja"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Building"
+#~ msgstr "Izgradnja paketov"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Databases"
+#~ msgstr "Podatkovne zbirke"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Debuggers"
+#~ msgstr "Razhroščevalniki"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "IDE"
+#~ msgstr "IDE"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Profiling"
+#~ msgstr "Profiliranje"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Project Management"
+#~ msgstr "Upravljanje projektov"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Web Development"
+#~ msgstr "Spletni razvoj"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Art"
+#~ msgstr "Umetnost"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Artificial Intelligence"
+#~ msgstr "Umetna inteligenca"
+
+#~ 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čunalniške znanosti"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Data Visualization"
+#~ msgstr "Predočenje podatkov"
+
+#~ 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ženirstvo"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geology"
+#~ msgstr "Geologija"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Geoscience"
+#~ msgstr "Geoznanost"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "History"
+#~ msgstr "Zgodovina"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Image Processing"
+#~ msgstr "Obdelava slik"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Languages"
+#~ msgstr "Jeziki"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Literature"
+#~ msgstr "Literatura"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Maps"
+#~ msgstr "Zemljevidi"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Math"
+#~ msgstr "Matematika"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Music"
+#~ msgstr "Glasba"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Številska analiza"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Parallel Computing"
+#~ msgstr "Vzporedno računanje"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Physics"
+#~ msgstr "Fizika"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Robotics"
+#~ msgstr "Robotika"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Spirituality"
+#~ msgstr "Duhovnost in vera"
+
+#~ msgctxt "Menu subcategory of Education"
+#~ msgid "Sports"
+#~ msgstr "Šport"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Action"
+#~ msgstr "Akcijske igre"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Adventure"
+#~ msgstr "Pustolovščine"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Arcade"
+#~ msgstr "Arkadne igre"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Blocks"
+#~ msgstr "Bloki"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Board"
+#~ msgstr "Tabla"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Card"
+#~ msgstr "Karte"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Emulators"
+#~ msgstr "Posnemovalniki"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Kids"
+#~ msgstr "Za otroke"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Logic"
+#~ msgstr "Logika"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Role Playing"
+#~ msgstr "Igra vlog"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Shooter"
+#~ msgstr "Strelske igre"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Simulation"
+#~ msgstr "Simulacija"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Sports"
+#~ msgstr "Šport"
+
+#~ msgctxt "Menu subcategory of Games"
+#~ msgid "Strategy"
+#~ msgstr "Strateške igre"
+
+#~ 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 "OCR"
+#~ msgstr "Optično prepoznavanje znakov"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Photography"
+#~ msgstr "Fotografija"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Publishing"
+#~ msgstr "Založništvo"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Raster Graphics"
+#~ msgstr "Rastrska grafika"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Scanning"
+#~ msgstr "Optično branje"
+
+#~ msgctxt "Menu subcategory of Graphics"
+#~ msgid "Vector Graphics"
+#~ msgstr "Vektorska grafika"
+
+#~ msgid "Internet"
+#~ msgstr "Splet"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Chat"
+#~ msgstr "Klepetanje"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Dialup"
+#~ msgstr "Klicanje"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Email"
+#~ msgstr "Elektronska pošta"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Feed"
+#~ msgstr "Viri"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "File Transfer"
+#~ msgstr "Prenos datotek"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Ham Radio"
+#~ msgstr "Ham radio"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Instant Messaging"
+#~ msgstr "Hipno sporočanje"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "IRC Clients"
+#~ msgstr "Odjemalci IRC"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Monitor"
+#~ msgstr "Zaslon"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "News"
+#~ msgstr "Novice"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "P2P"
+#~ msgstr "Protokol P2P"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Telephony"
+#~ msgstr "Telefonija"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Video Conference"
+#~ msgstr "Video konferenca"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Web Browser"
+#~ msgstr "Spletni brskalnik"
+
+#~ msgctxt "Menu subcategory of Internet"
+#~ msgid "Web Development"
+#~ msgstr "Spletni razvoj"
+
+#~ msgid "Office"
+#~ msgstr "Pisarna"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Calendar"
+#~ msgstr "Koledar"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Chart"
+#~ msgstr "Grafikon"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Contact Management"
+#~ msgstr "Upravljanje s stiki"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Database"
+#~ msgstr "Podatkovna zbirka"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Dictionary"
+#~ msgstr "Slovar"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Email"
+#~ msgstr "Elektronska pošta"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Finance"
+#~ msgstr "Finance"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Flow Chart"
+#~ msgstr "Diagram poteka"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "PDA"
+#~ msgstr "Dlančnik"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Photography"
+#~ msgstr "Fotografija"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Project Management"
+#~ msgstr "Upravljanje projektov"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Publishing"
+#~ msgstr "Založništvo"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Spreadsheet"
+#~ msgstr "Preglednica"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Viewer"
+#~ msgstr "Pregledovalnik"
+
+#~ msgctxt "Menu subcategory of Office"
+#~ msgid "Word Processor"
+#~ msgstr "Urejanje besedila"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Art"
+#~ msgstr "Umetnost"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Artificial Intelligence"
+#~ msgstr "Umetna inteligenca"
+
+#~ 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čunalniške znanosti"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Construction"
+#~ msgstr "Gradnja"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Data Visualization"
+#~ msgstr "Predočenje podatkov"
+
+#~ 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ženirstvo"
+
+#~ 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 "Geoznanost"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "History"
+#~ msgstr "Zgodovina"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Humanities"
+#~ msgstr "Humanistika"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Image Processing"
+#~ msgstr "Obdelava slik"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Languages"
+#~ msgstr "Jeziki"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Literature"
+#~ msgstr "Literatura"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Maps"
+#~ msgstr "Zemljevidi"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Math"
+#~ msgstr "Matematika"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Medical"
+#~ msgstr "Zdravstvo"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Numerical Analysis"
+#~ msgstr "Številska analiza"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Parallel Computing"
+#~ msgstr "Vzporedno računanje"
+
+#~ 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 in vera"
+
+#~ msgctxt "Menu subcategory of Science"
+#~ msgid "Sports"
+#~ msgstr "Šport"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Emulator"
+#~ msgstr "Posnemovalnik"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "File Manager"
+#~ msgstr "Upravljalnik datotek"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "File Tools"
+#~ msgstr "Datotečna orodja"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Monitor"
+#~ msgstr "Zaslon"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Security"
+#~ msgstr "Varnost"
+
+#~ msgctxt "Menu subcategory of System"
+#~ msgid "Terminal Emulator"
+#~ msgstr "Posnemovalnik terminala"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Accessibility"
+#~ msgstr "Dostopnost"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Archiving"
+#~ msgstr "Arhiviranje"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Calculator"
+#~ msgstr "Računalo"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Clock"
+#~ msgstr "Ura"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Compression"
+#~ msgstr "Stiskanje"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "File Tools"
+#~ msgstr "Datotečna orodja"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Maps"
+#~ msgstr "Zemljevidi"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Spirituality"
+#~ msgstr "Duhovnost"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Telephony Tools"
+#~ msgstr "Telefonska orodja"
+
+#~ msgctxt "Menu subcategory of Utilities"
+#~ msgid "Text Editor"
+#~ msgstr "Urejevalnik besedil"
+
+#~ msgid "Video"
+#~ msgstr "Video"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Editing"
+#~ msgstr "Montaža"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Database"
+#~ msgstr "Podatkovna zbirka"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Disc Burning"
+#~ msgstr "Zapisovanje diska"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Players"
+#~ msgstr "Predvajalniki"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "Recorders"
+#~ msgstr "Snemalniki"
+
+#~ msgctxt "Menu subcategory of Video"
+#~ msgid "TV"
+#~ msgstr "TV"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Fonts"
+#~ msgstr "Pisave"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Codecs"
+#~ msgstr "Kodeki"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Input Sources"
+#~ msgstr "Vhodni viri"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Language Packs"
+#~ msgstr "Jezikovni paketi"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Shell Extensions"
+#~ msgstr "Razširitve lupine"
+
+#~ msgctxt "Menu subcategory of Add-ons"
+#~ msgid "Localization"
+#~ msgstr "Jezikovno prilagajanje"
+
+#~ msgid "A previous update was unfinished."
+#~ msgstr "Predhodna posodobitev ni bila uspešno končana."
+
+#~ 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 ""
+#~ "Posodobitve ni mogoče namestiti; najverjetneje je težava v sami "
+#~ "posodobitvi. Počakajte na naslednjo posodobitev in poskusite znova."
+
+#~ msgid "Internet Only Application"
+#~ msgstr "Le spletni programi"
+
+#~ msgid "Review"
+#~ msgstr "Ocena"
+
+#~ msgid "No AppStream data found"
+#~ msgstr "Ni najdenih podatkov AppStream"
+
+#~ msgid "An update was not signed in the correct way."
+#~ msgstr "Paketi posodobitve niso podpisani na ustrezen način."
+
+#~ msgid "The update could not be completed."
+#~ msgstr "Posodobitve ni mogoče končati."
+
+#~ msgid "An offline update was requested but no packages required updating."
+#~ msgstr ""
+#~ "Zahtevana je posodobitev brez povezave, vendar ni paketov za posodobitev."
+
+#~ msgid "No space was left on the drive."
+#~ msgstr "Ni več prostora na pogonu."
+
+#~ msgid "An update failed to install correctly."
+#~ msgstr "Namestitev posodobitve je spodletela."
+
+#~ msgid "The offline update failed in an unexpected way."
+#~ msgstr "Posodobitev brez povezave je spodletela na nepričakovan način."
+
+#~ msgid "No addon fonts are available for %s support."
+#~ msgstr "Za podporo %s ni na voljo dodatnih pisav."
+
+#~ msgid "No sources found."
+#~ msgstr "Ni najdenih virov"
+
+#~ msgid "OK"
+#~ msgstr "V redu"
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..dead12d
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,7332 @@
+# 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:
+# Милош Поповић <gpopac@gmail.com>, 2015.
+# Марко М. Костић <marko.m.kostic@gmail.com>, 2016.
+# Борисав Живановић <borisavzivanovic@gmail.com>, 2017.
+# Мирослав Николић <miroslavnikolić@rocketmail.com>, 2013–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: 2022-09-05 19:35+0000\n"
+"PO-Revision-Date: 2022-09-06 09:19+0200\n"
+"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
+"Language-Team: Serbian <српски <gnome-sr@googlegroups.org>>\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: 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 "Програми"
+
+#: 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:2018
+#: src/gs-application.c:256
+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 "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 ""
+"Бирање веће вредности ће узроковати мање обилазака ка удаљеном серверу али "
+"ће ажурирање снимака екрана и приказ кориснику трајати дуже. Вредност „0“ "
+"значи да се никада не проверава сервер уколико слика већ постоји у кешу."
+
+#: 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://sr.wikipedia.org/wiki/Власнички_софтвер'"
+
+#: 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 ""
+"Списак УРЛ-ова који показују на датотеке тока које ће бити преузете у "
+"swcatalog фасциклу"
+
+#: 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 ""
+"Инсталирај датотеку тока у системску локацију, за све кориснике. Ако је "
+"нетачно, датотеке биће инсталиране у нестандардни директоријум "
+"$XDG_DATA_HOME/swcatalog/xml"
+
+#: 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 ""
+"Поредак приоритета формата паковања који се желе, са прво исписаним важнијим "
+"форматима. Празан низ значи основни поредак. Подразумева се да изостављени "
+"формати буду наведени последњи. примери формата паковања су: deb, flatpak, "
+"rpm, snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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: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 "Нисам успео да потврдим врсту садржаја: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 програм је за тинејџере"
+
+#. 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 програм је само за одрасле"
+
+#. 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 програм је за старосну групу %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 "Оцена старосне прикладности"
+
+#: 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 "Ново у издању %s"
+
+#: 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 ""
+"Режим покретања: „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: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 доприносиоци Гномовим Програмима"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Марко М. Костић <marko.m.kostic@gmail.com>\n"
+"Борисав Живановић <borisavzivanovic@gmail.com>\n"
+"\n"
+"https://гном.срб — превод Гнома на српски језик."
+
+#. 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 "Потребно је %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: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 "Извор: %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 "Преименовано из „%s“"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Помозите у преводу „%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“ је осмишљен, развијен и превођен од стране међународне заједнице "
+"добровољаца.\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: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 "Унеси број од 1 до %u: "
+
+#. 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 "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 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“ је сада инсталиран"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"Програм „%s“ није <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">слободан софтвер и софтвер отвореног изворног кода</a>, а "
+"обезбеђује га ризница „%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 обезбеђује ризница „%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 ""
+"Инсталација или коришћење „%s“ може бити противзаконито у неком државама."
+
+#. 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] "Ажурирања су инсталирана"
+msgstr[2] "Ажурирања су инсталирана"
+msgstr[3] "Ажурирање је инсталирано"
+
+#. 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] "Програм је уклоњен"
+msgstr[2] "Програм је уклоњен"
+msgstr[3] "Програм је уклоњен"
+
+#. 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] "Потребно је поновно покретање како би ступила у дејство."
+msgstr[2] "Потребно је поновно покретање како би ступила у дејство."
+msgstr[3] "Потребно је поновно покретање како би ступило у дејство."
+
+#. 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] "Пре %d минут"
+msgstr[1] "Пре %d минута"
+msgstr[2] "Пре %d минута"
+msgstr[3] "Пре једног минута"
+
+#: src/gs-common.c:875
+#, 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:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, 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: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 "Програм"
+
+#. 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:332
+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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Инсталирај"
+
+#: src/gs-details-page.c:876
+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:900
+msgid "_Install…"
+msgstr "_Инсталирај…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Други програми од %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "Потребна вам је веза са интернетом да бисте написали преглед"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Не могу да пронађем „%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 "Учес_твуј у преводу"
+
+#. 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:216
+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] "Доступан је словни лик за писмо „%s“"
+msgstr[1] "Доступни су словни ликови за писмо „%s“"
+msgstr[2] "Доступни су словни ликови за писмо „%s“"
+msgstr[3] "Доступан је словни лик за писмо „%s“"
+
+#. 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] "Доступан је програм за „%s“"
+msgstr[1] "Доступни су програми за „%s“"
+msgstr[2] "Доступни су програми за „%s“"
+msgstr[3] "Доступан је програм за „%s“"
+
+#: 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 "Нисам пронашао „%s“"
+
+#. 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 "Нису доступни програми који обезбеђују датотеку „%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 ""
+"Податке о „%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Податке о „%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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Податке о „%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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"Податке о „%s“, као и начин набављања управљачког програма који може да "
+"подржи овај штампач можете наћи на %s."
+
+#. 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] ""
+"Не можемо наћи „%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: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] ""
+"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више "
+"података."
+msgstr[1] ""
+"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више "
+"података."
+msgstr[2] ""
+"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више "
+"података."
+msgstr[3] ""
+"Не можемо наћи „%s“ кодек(е), које сте тражили. Погледајте одељак %s за више "
+"података."
+
+#: 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 "Нисам успео наћи било шта: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s формат датотеке"
+
+#: 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 "„%s“ вероватно ради на овом уређају"
+
+#. 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“ ради на овом уређају"
+
+#. 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“ неће исправно радити на овом уређају"
+
+#. 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“ неће радити на овом уређају"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Овај софтвер је развијен као слободан од стране заједнице добровољаца, и "
+"издат је под <a href=\"%s\">%s лиценцом</a>.\n"
+"\n"
+"Можете допринети и помоћи да постане много бољи."
+
+#. 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 ""
+"Овај софтвер је развијен као слободан од стране заједнице добровољаца, и "
+"издат је под „%s“ лиценцом.\n"
+"\n"
+"Можете допринети и помоћи да постане много бољи."
+
+#: 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 ""
+"Овај софтвер није развијен као слободан, тако да само његови програмери "
+"знају како ради. Можда је небезбедан и теже је променити га по потреби.\n"
+"\n"
+"Нећете бити у могућности да допринесете овом софтверу."
+
+#. 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 ""
+"Тренутна мрежа је ограничена. Ограничене мреже, осим самих ограничења, могу "
+"имати и додатне новчане трошкове. Да бисте уштедели податке, самостална "
+"ажурирања су паузирана.\n"
+"\n"
+"Самостална ажурирања биће настављена када се будете повезали на неограничену "
+"мрежу. До тада, могуће је ручно инсталирати ажурирања.\n"
+"\n"
+"Уколико је тренутна мрежа означена ограниченом грешком, ово подешавање се "
+"може променити."
+
+#: 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 ""
+"Обезбеђује приступ додатном софтверу из „%s“. Неки власнички програми се ту "
+"налазе."
+
+#. 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 "Да ли сигурно желите да уклоните ризницу „%s“?"
+
+#. 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 ""
+"Све програми из ризнице „%s“ биће уклоњени, мораћете поново да инсталирате "
+"ризницу да бисте их поново користили."
+
+#. 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 "Да ли сигурно желите уклонити „%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“ биће уклоњен, мораћете да га инсталирате поново да бисте га "
+"користили."
+
+#: 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 ""
+"Неки од тренутно инсталираних програма нису сагласни са дистрибуцијом „%s“. "
+"Ако наставите, следећи ће бити сами уклоњени за време надоградње:"
+
+#: 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 "Програми инсталирани из ризнице „%s“ више неће добијати ажурирања."
+
+#: 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 "Додатни програми са извора пробраних трећих страна — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 ""
+"Ове ризнице допуњавају подразумеване програме које пружа дистрибуција „%s“."
+
+#. 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] "%u инсталирани програм"
+msgstr[1] "%u инсталирана програма"
+msgstr[2] "%u инсталираних програма"
+msgstr[3] "Један инсталирани програм"
+
+#. 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 инсталирани додатак"
+msgstr[1] "%u инсталирана додатка"
+msgstr[2] "%u инсталираних додатака"
+msgstr[3] "Један инсталирани додатак"
+
+#. 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 програм"
+msgstr[1] "%u програма"
+msgstr[2] "%u програма"
+msgstr[3] "Један програм"
+
+#. 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 додатак"
+msgstr[1] "%u додатка"
+msgstr[2] "%u додатака"
+msgstr[3] "Један додатак"
+
+#. 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 и %s су инсталирани"
+msgstr[1] "%s и %s су инсталирана"
+msgstr[2] "%s и %s је инсталирано"
+msgstr[3] "%s и %s су инсталирани"
+
+#. 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 "Никакав"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Погледајте појединости података које шаљемо у нашој <a href=\"https://odrs."
+"gnome.org/privacy\">политици приватности</a>. Цело име и презиме везано за "
+"ваш налог биће приказано јавно."
+
+#: 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:93
+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: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 "„%s“ је потенцијално небезбедан"
+
+#. 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“ је небезбедан"
+
+#. 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 "СДК"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Неисправан снимак екрана"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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] "још %u погодак"
+msgstr[1] "још %u поготка"
+msgstr[2] "још %u погодака"
+msgstr[3] "још %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 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 "Не могу да преузмем ажурирања фирмвера са извора „%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 "Не могу да преузмем ажурирања са извора „%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 "Не могу да преузмем ажурирања"
+
+#. 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 ""
+"Не могу да преузмем ажурирања са извора „%s“: нема довољно простора на диску"
+
+#. 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 ""
+"Не могу да инсталирам програм „%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 "Не могу да инсталирам програм „%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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Не могу да инсталирам програм „%s“ јер тај програм није подржан"
+
+#. 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 "Не могу да инсталирам програм „%s“: нема довољно простора на диску"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Не могу да инсталирам „%s“: ниво батерије је пренизак"
+
+#. 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 "Не могу да инсталирам програм „%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 ""
+"Не могу да ажурирам програм „%s“ из ризнице „%s“ јер преузимање није успело"
+
+#. 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 "Не могу да ажурирам програм „%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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Не могу да инсталирам ажурирања из ризнице „%s“ јер преузимање није успело"
+
+#. 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 "Не могу да ажурирам програм „%s“: нема довољно простора на диску"
+
+#. 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 "Не могу да ажурирам програм „%s“: била је потребна пријава"
+
+#. 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 "Не могу да ажурирам програм „%s“: пријава није била исправна"
+
+#. 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 ""
+"Не могу да ажурирам програм „%s“: немате овлашћење за ажурирање програма"
+
+#. 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 "Не могу да ажурирам програм „%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: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 "Не могу да ажурирам програм „%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: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 "Не могу да ажурирам програм „%s“"
+
+#. 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 "Не могу да се надоградим са дистрибуције „%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 "Не могу да надоградим на „%s“ зато што преузимање није успело"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: потребан је приступ интернету "
+"а тога нема"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: нема довољно простора на диску"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: била је потребна пријава"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: пријава није била исправна"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: немате овлашћење за "
+"надограђивање"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: струјно напајање је потребно"
+
+#. 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 ""
+"Не могу да се надоградим на дистрибуцију „%s“: ниво батерије је пренизак"
+
+#. 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 "Не могу да се надоградим на дистрибуцију „%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 "Не могу да уклоним програм „%s“: била је потребна пријава"
+
+#. 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 "Не могу да уклоним програм „%s“: пријава није била исправна"
+
+#. 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 "Не могу да уклоним програм „%s“: немате овлашћење за уклањање програма"
+
+#. 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 "Не могу да уклоним програм „%s“: струјно напајање је потребно"
+
+#. 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 "Не могу да уклоним програм „%s“: ниво батерије је пренизак"
+
+#. 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 "Не могу да уклоним програм „%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 "Не могу да покренем програм „%s“: део „%s“ није инсталиран"
+
+#. 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 "Не могу да контактирам извор „%s“"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Причувани подаци се могу очистити из <a href=\"dummy\">_поставки програма</"
+"a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Инсталиран)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Инсталирам)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Уклањам)"
+
+#. 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 "Инсталиран је %s"
+
+#: 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] "%u програм је ажуриран, потребно је поновно покретање"
+msgstr[1] "%u програма је ажурирано, потребно је поновно покретање"
+msgstr[2] "%u програма је ажуриран, потребно је поновно покретање"
+msgstr[3] "Један програм је ажуриран, потребно је поновно покретање"
+
+#. 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 програм је ажуриран"
+msgstr[1] "%u програма је ажурирано"
+msgstr[2] "%u програма је ажурирано"
+msgstr[3] "Један програм је ажуриран"
+
+#. 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 "Програми „%s“ и „%s“ су ажурирани."
+
+#. 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 програм."
+msgstr[1] "Потребно је поново покренути %u програма."
+msgstr[2] "Потребно је поново покренути %u програма."
+msgstr[3] "Потребно је поново покренути један програм."
+
+#. 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 "Нова верзија дистрибуције %s је доступна за инсталацију"
+
+#. 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 "Добро дошли у дистрибуцију %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] "Програми су ажурирани"
+msgstr[2] "Програми су ажурирани"
+msgstr[3] "Један програм је ажуриран"
+
+#. 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] "Важна ажурирања система су инсталирана."
+msgstr[2] "Важна ажурирања система су инсталирана."
+msgstr[3] "Једно важно ажурирање система је инсталирано."
+
+# Мислим да се ова ниска односи на део Програма који је посвећен рецензијама програма.
+#. 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 "Последња провера: %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."
+
+#: 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 "Грeшкa"
+
+#: 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 "Дистрибуција %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:95
+#, c-format
+msgid "%s Available"
+msgstr "Дистрибуција %s је доступна"
+
+#: 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 "%s од %s је преузето"
+
+#. 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%% је преузето"
+
+#: 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 ""
+"Ажурирања;освежења;доградње;надоградње;извори;ризнице;складишта;поставке;"
+"инсталација;уклањање;програм;софтвер;апликација;радња;исправке;апдејтови;"
+"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: 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 "%s надоградња са новим функцијама и исправкама."
+
+#: 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:404
+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 "Системска фасцикла %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Лична подфасцикла %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Фасцикле система домаћина"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Подешавања из /etc система домаћина"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Фасцикал радне површи"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Подфасцикла радне површи %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Фасцикла са документима"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Подфасцикла са документима %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Фасцикла музике"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Подфасцикла музике %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Фасцикла са сликама"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Подфасцикла са сликама %s"
+
+#: 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 "Подфасцикла јавног дељења %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Видео фасцикла"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Видео подфасцикла %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Фасцикла са шаблонима"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Подфасцикла шаблона %s"
+
+#: 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 "Корисничка кеш подфасцикла %s"
+
+#: 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 "Подфасцикла корисничких подешавања %s"
+
+#: 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 "Корисничка подфасцикла са подацима %s"
+
+#: 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 "Корисничка подфасцикла извршног окружења %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Приступ путањи %s система датотека"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Добављам флетпек метаподатке за %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Неуспех при инсталирању додатка „%s“: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1051
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Неуспех при уклањању додатка „%s“: %s"
+
+#: 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 ""
+"Удаљени извор „%s“ не дозвољава инсталирање програма „%s“, највероватније "
+"због свог филтера. Уклоните филтер и поновите инсталирање. Опширна грешка: %s"
+
+#. 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“ уређаја"
+
+#. 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“ система"
+
+#. 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“ угнежђеног контролера"
+
+#. 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)"
+
+#. 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)"
+
+#. 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)"
+
+#. 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“ контролера"
+
+#. 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“ тандерболт контролера"
+
+#. 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“ процесорског микрокода"
+
+#. 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“ подешавања хардвера"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Ажурирање „%s“ камере"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Ажурирање „%s“ ТПМ-а"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Ажурирање „%s“ додирне табле"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Ажурирање „%s“ миша"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Ажурирање „%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“ контролера складишта"
+
+#. 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“ мрежне картице"
+
+#. 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“ екрана"
+
+#. 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“ 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Ажурирање УСБ пријемника %s"
+
+#: 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 "Оперативни систем (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 "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 ""
+#~ "Списак програма за коришћење, који преписује оне које одреди систем."
+
+#, 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 "Адреса"
+
+#~ 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 "_Installed"
+#~ msgstr "_Инсталирани"
+
+#~ msgid "_Updates"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Remove"
+#~ msgstr "Уклони"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Нема додатних ризница"
+
+#~ msgid "_Enable"
+#~ 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 "_Restart Now"
+#~ 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 "ОДРС је услуга која пружа прегледе програма од стране корисника"
+
+#~ 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 "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 "Дизајнер банера за Гномове програме"
+
+#~ msgid "No Designs"
+#~ msgstr "Нема дизајна"
+
+#~ msgid "Error message here"
+#~ msgstr "Порука о грешци"
+
+#~ msgid "App ID"
+#~ 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 "Delete Design"
+#~ msgstr "Обриши дизајн"
+
+#~ msgid "OS Upgrade"
+#~ 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 "Unable to purchase %s"
+#~ 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 "I have forgotten my password"
+#~ 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 "U_pdate All"
+#~ 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 "_Install All"
+#~ msgstr "_Инсталирај све"
+
+#~ 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 "web app"
+#~ 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 "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 "No sources found."
+#~ msgstr "Нисам пронашао изворе."
+
+#~ msgid "OK"
+#~ 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..1fa8fc2
--- /dev/null
+++ b/po/sr@latin.po
@@ -0,0 +1,5220 @@
+# Serbian translation of gnome-software
+# Courtesy of Prevod.org team (http://prevod.org/) -- 2012—2017.
+# Copyright (C) 2013 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+# Translators:
+# Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2013—2017.
+# Miloš Popović <gpopac@gmail.com>, 2015.
+# Marko M. Kostić <marko.m.kostic@gmail.com>, 2016.
+# Borisav Živanović <borisavzivanovic@gmail.com>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-software\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2018-03-09 08:58+0000\n"
+"PO-Revision-Date: 2018-03-03 07:10+0100\n"
+"Last-Translator: Marko M. Kostić <marko.m.kostic@gmail.com>\n"
+"Language-Team: \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: Poedit 2.0.6\n"
+"X-Poedit-Bookmarks: -1,-1,49,-1,-1,-1,-1,-1,-1,-1\n"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:7
+msgid "GNOME Software"
+msgstr "Gnomovi programi"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Gnomov upravnik programa"
+
+#: 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 ""
+"Programi vam dozvoljavaju da pronađete i instalirate nove programe i "
+"proširenja sistema i da uklonite postojeće instalirane programe."
+
+#: 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 ""
+"Gnomovi 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/appdata/org.gnome.Software.appdata.xml.in:25
+msgid "Overview panel"
+msgstr "Panel pregleda"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:29
+msgid "Details panel"
+msgstr "Panel pojedinosti"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:33
+msgid "Installed panel"
+msgstr "Panel instaliranih"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:37
+msgid "Updates panel"
+msgstr "Panel ažuriranja"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:41
+msgid "The update details"
+msgstr "Pojedinosti ažuriranja"
+
+#: data/appdata/org.gnome.Software.appdata.xml.in:1031
+msgid "The GNOME Project"
+msgstr "Gnomov projekat"
+
+#: data/org.gnome.software.external-appstream.policy.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: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 "Whether to automatically download updates"
+msgstr "Da li će sam preuzeti ažuriranja"
+
+#: 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 ""
+"Ako je uključeno, Gnomovi programi će sam preuzeti ažuriranja u pozadini i "
+"tražiti od korisnika da ih instalira kada bude bio spreman."
+
+#: data/org.gnome.software.gschema.xml:20
+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: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 ""
+"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:25
+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:29
+msgid "Show star ratings next to applications"
+msgstr "Prikazuje zvezdice ocenjivanja pored programa"
+
+#: data/org.gnome.software.gschema.xml:33
+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:37
+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:38
+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:42
+msgid "A list of popular applications"
+msgstr "Spisak popularnih programa"
+
+#: data/org.gnome.software.gschema.xml:43
+msgid "A list of applications to use, overriding the system defined ones."
+msgstr "Spisak programa za korišćenje, koji prepisuje one koje odredi sistem."
+
+#: 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 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:59
+msgid "The last update timestamp"
+msgstr "Vremenska oznaka poslednjeg ažuriranja"
+
+#: data/org.gnome.software.gschema.xml:63
+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: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 ""
+"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:73
+msgid "The server to use for application reviews"
+msgstr "Server koji će se koristiti za preglede programa"
+
+#: data/org.gnome.software.gschema.xml:77
+msgid "The minimum karma score for reviews"
+msgstr "Najmanji rezultat karme za preglede"
+
+#: data/org.gnome.software.gschema.xml:78
+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:82
+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:86
+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:90
+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:94
+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:98
+msgid "Show the folder management UI"
+msgstr "Prikazuje sučelje upravljanja fasciklama"
+
+#: data/org.gnome.software.gschema.xml:102
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Dopusti pristup prozorčetu izvora softvera"
+
+#: data/org.gnome.software.gschema.xml:106
+msgid "Offer upgrades for pre-releases"
+msgstr "Nudi nadogradnje za predizdanja"
+
+#: data/org.gnome.software.gschema.xml:110
+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:114
+msgid "Show the prompt to install nonfree software repositories"
+msgstr "Prikaži upit za instaliranje izvora neslobodnog softvera"
+
+#: 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 "
+"app-info folder"
+msgstr ""
+"Spisak URL-ova koji pokazuju na datoteke toka koje će biti preuzete u ap-"
+"info fasciklu"
+
+#: data/org.gnome.software.gschema.xml:131
+msgid "Install the AppStream files to a system-wide location for all users"
+msgstr "Instaliraj datoteku toka u sistemsku lokaciju"
+
+#: data/org.gnome.software.gschema.xml:135
+msgid "Enable GNOME Shell extensions repository"
+msgstr "Omogući riznicu za proširenja Gnomove školjke"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Instalacija programa"
+
+#: src/gnome-software-local-file.desktop.in:4
+msgid "Install selected software on the system"
+msgstr "Instalirajte izabrane programe na sistem"
+
+#. 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 "Izaberi sve"
+
+#: src/gnome-software.ui:16
+msgid "Select None"
+msgstr "Poništi izbor"
+
+#: src/gnome-software.ui:24 src/org.gnome.Software.desktop.in:3
+msgid "Software"
+msgstr "Programi"
+
+#: src/gnome-software.ui:43 src/gs-update-dialog.ui:21
+msgid "Go back"
+msgstr "Idite nazad"
+
+#. Translators: A label for a button to show all available software.
+#: src/gnome-software.ui:77
+msgid "_All"
+msgstr "_Sve"
+
+#. Translators: A label for a button to show only software which is already installed.
+#: src/gnome-software.ui:104
+msgid "_Installed"
+msgstr "_Instalirani"
+
+#. Translators: A label for a button to show only updates which are available to install.
+#: src/gnome-software.ui:155
+msgid "_Updates"
+msgstr "Až_uriranja"
+
+#: src/gnome-software.ui:251
+msgid "Search"
+msgstr "Pretraži"
+
+#. 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 "Riznice programa"
+
+#. button in the info bar
+#: src/gnome-software.ui:361
+msgid "Examine Disk"
+msgstr "Ispitaj disk"
+
+#. 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 "Podešavanja mreže"
+
+#. button in the info bar
+#: src/gnome-software.ui:383
+msgid "Restart Now"
+msgstr "Ponovo pokreni"
+
+#. button in the info bar
+#: src/gnome-software.ui:394
+msgid "More Information"
+msgstr "Još podataka"
+
+#: src/gs-app-addon-row.c:96 src/gs-app-row.c:428
+msgid "Pending"
+msgstr "Na čekanju"
+
+#: src/gs-app-addon-row.c:102 src/gs-app-row.ui:209 src/gs-app-tile.ui:51
+#: src/gs-feature-tile.c:88
+msgid "Installed"
+msgstr "Instaliran"
+
+#. 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 "Instaliram"
+
+#. 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 "Uklanjam"
+
+#: src/gs-app-folder-dialog.c:309
+msgid "Folder Name"
+msgstr "Naziv fascikle"
+
+#: 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 "_Otkaži"
+
+#: src/gs-app-folder-dialog.c:325 src/gs-app-folder-dialog.ui:24
+msgid "_Add"
+msgstr "_Dodaj"
+
+#: src/gs-app-folder-dialog.ui:5
+msgid "Add to Application Folder"
+msgstr "Dodaj u fasciklu programa"
+
+#. 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
+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 "Open a local package file"
+msgstr "Otvara lokalnu datoteku sa paketom"
+
+#: src/gs-application.c:134
+msgid "FILENAME"
+msgstr "NAZIV DATOTEKE"
+
+#: src/gs-application.c:136
+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 "Show verbose debugging information"
+msgstr "Prikazuje opširne podatke pročišćavanja"
+
+#: src/gs-application.c:141
+msgid "Show profiling information for the service"
+msgstr "Prikazuje podatke profilisanja za uslugu"
+
+#: src/gs-application.c:143
+msgid "Quit the running instance"
+msgstr "Zatvara pokrenuti primerak"
+
+#: src/gs-application.c:145
+msgid "Prefer local file sources to AppStream"
+msgstr "Daje prednost lokalnim izvorima datoteka nad tokom programa"
+
+#: src/gs-application.c:147
+msgid "Show version number"
+msgstr "Prikazuje broj izdanja"
+
+#: src/gs-application.c:344
+msgid "translator-credits"
+msgstr ""
+"Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
+"Marko M. Kostić <marko.m.kostic@gmail.com>\n"
+"Borisav Živanović <borisavzivanovic@gmail.com>\n"
+"\n"
+"http://prevod.org — prevod na srpski jezik."
+
+#. 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 "O programu „%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 "Fin način za upravljanje programima na vašem sistemu."
+
+#. 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 "Poseti veb 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:177
+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:184
+msgid "Cancel"
+msgstr "Otkaži"
+
+#. 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:568
+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:198
+msgid "Update"
+msgstr "Ažuriraj"
+
+#. 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:725
+#: src/gs-repos-dialog.c:272
+msgid "Remove"
+msgstr "Ukloni"
+
+#. 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 "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:338 src/gs-details-page.ui:988
+msgid "Source"
+msgstr "Izvor"
+
+#. 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 "Da nastavite treba da se prijavite."
+
+#. 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 "Da nastavite treba da se prijavite na „%s“."
+
+#: src/gs-auth-dialog.ui:70
+msgid "Email address"
+msgstr "Adresa e-pošte"
+
+#: src/gs-auth-dialog.ui:94
+msgid "I have an account already"
+msgstr "Već imam nalog"
+
+#: src/gs-auth-dialog.ui:113
+msgid "Password"
+msgstr "Lozinka"
+
+#: src/gs-auth-dialog.ui:137
+msgid "I want to register for an account now"
+msgstr "Želim sada da se registrujem za nalog"
+
+#: src/gs-auth-dialog.ui:154
+msgid "I have forgotten my password"
+msgstr "Zaboravio sam lozinku"
+
+#: src/gs-auth-dialog.ui:181
+msgid "Sign in automatically next time"
+msgstr "Sam se prijavi sledeći put"
+
+#: src/gs-auth-dialog.ui:210
+msgid "Enter your one-time pin for two-factor authentication."
+msgstr "Unesite vaš jednovremeni pin za potvrđivanje identiteta sa dva činioca."
+
+#: src/gs-auth-dialog.ui:223
+msgid "PIN"
+msgstr "PIN"
+
+#: src/gs-auth-dialog.ui:325
+msgid "Authenticate"
+msgstr "Potvrdi identitet"
+
+#: src/gs-auth-dialog.ui:337
+msgid "Continue"
+msgstr "Nastavi"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: lib/gs-category.c:194
+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:199
+msgid "All"
+msgstr "Sve"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: lib/gs-category.c:203
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#. 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 "Izdvojeno u kategoriji „%s“"
+
+#. Translators: A label for a button to sort apps by their rating.
+#: src/gs-category-page.ui:24
+msgid "Top Rated"
+msgstr "Najbolje ocene"
+
+#. Translators: A label for a button to sort apps alphabetically.
+#: src/gs-category-page.ui:30 src/gs-editor.ui:296
+msgid "Name"
+msgstr "Naziv"
+
+#. 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 "Podešavanja proširenja"
+
+#: 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 ""
+"Proširenja koristite na sopstvenu odgovornost. Ako imate problema sa "
+"sistemom, preporučuje vam se da ih isključite."
+
+#. 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 "Prikaži"
+
+#: src/gs-category-page.ui:219
+msgid "Subcategories filter menu"
+msgstr "Meni filtera potkategorija"
+
+#. 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 "Poređaj po"
+
+#: src/gs-category-page.ui:288
+msgid "Subcategories sorting menu"
+msgstr "Meni sortiranja potkategorija"
+
+#. 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 "Unesi broj od 1 do %u:"
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:269
+msgid "Choose an application:"
+msgstr "Odaberite program:"
+
+#. 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 "Ažuriranja sistema su sada instalirana"
+
+#. 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 "Pregled skoro instaliranih ažuriranja je dostupan"
+
+#. 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“ je sada instaliran"
+
+#. 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 "Program je spreman za upotrebu."
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: src/gs-common.c:152
+msgid "Launch"
+msgstr "Pokreni"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:210
+msgid "Install Third-Party Software?"
+msgstr "Da instaliram programe treće strane?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:214
+msgid "Enable Third-Party Software Repository?"
+msgstr "Da uključim riznicu programa 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:230
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"„%s“ nije <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">nije slobodan softver i softver otvorenog izvornog koda</"
+"a>, a obezbeđuje ga „%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 obezbeđuje „%s“"
+
+#: src/gs-common.c:249
+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:259
+#, 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:265
+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:272
+msgid "Don’t Warn Again"
+msgstr "Ne upozoravaj više"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:281
+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:426
+msgid "Detailed errors from the package manager follow:"
+msgstr "Opširnije greške upravnika paketa slede:"
+
+#: src/gs-common.c:445 src/gs-details-page.ui:595
+msgid "Details"
+msgstr "Pojedinosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:75
+msgid "No cartoon violence"
+msgstr "Nema crtanog nasilja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:78
+msgid "Cartoon characters in unsafe situations"
+msgstr "Likovi iz crtaća u nepoželjnim situacijama"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:81
+msgid "Cartoon characters in aggressive conflict"
+msgstr "Likovi iz crtaća u agresivnom sukobu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:84
+msgid "Graphic violence involving cartoon characters"
+msgstr "Grafičko nasilje koje uključuje likove iz crtaća"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:87
+msgid "No fantasy violence"
+msgstr "Nema fantazijskog nasilja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:90
+msgid "Characters in unsafe situations easily distinguishable from reality"
+msgstr "Likovi u nesigurnim situacijama koje se lako razlikuju od stvarnosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:93
+msgid "Characters in aggressive conflict easily distinguishable from reality"
+msgstr "Likovi u agresivnom sukobu koji se lako razlikuje od stvarnosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:96
+msgid "Graphic violence easily distinguishable from reality"
+msgstr "Grafičko nasilje koje se lako razlikuje od stvarnosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:99
+msgid "No realistic violence"
+msgstr "Nema realističnog nasilja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:102
+msgid "Mildly realistic characters in unsafe situations"
+msgstr "Blago stvarni likovi u nesigurnim situacijama"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:105
+msgid "Depictions of realistic characters in aggressive conflict"
+msgstr "Prikaz stvarnih likova u agresivnom sukobu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:108
+msgid "Graphic violence involving realistic characters"
+msgstr "Grafičko nasilje koje uključuje stvarne likove"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:111
+msgid "No bloodshed"
+msgstr "Nema krvoprolića"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:114
+msgid "Unrealistic bloodshed"
+msgstr "Nerealno krvoproliće"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:117
+msgid "Realistic bloodshed"
+msgstr "Realno krvoproliće"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:120
+msgid "Depictions of bloodshed and the mutilation of body parts"
+msgstr "Prikaz krvoprolića i sakaćenje delova tela"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:123
+msgid "No sexual violence"
+msgstr "Nema seksualnog nasilja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:126
+msgid "Rape or other violent sexual behavior"
+msgstr "Silovanje ili drugo nasilno seksualno ponašanje"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:129
+msgid "No references to alcohol"
+msgstr "Nema upućivanja na alkohol"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:132
+msgid "References to alcoholic beverages"
+msgstr "Upućivanje na alkoholna pića"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:135
+msgid "Use of alcoholic beverages"
+msgstr "Upotreba alkoholnih pića"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:138
+msgid "No references to illicit drugs"
+msgstr "Nema upućivanja na zabranjene droge"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:141
+msgid "References to illicit drugs"
+msgstr "Upućivanje na zabranjene droge"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:144
+msgid "Use of illicit drugs"
+msgstr "Upotreba zabranjenih droga"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:147
+msgid "References to tobacco products"
+msgstr "Upućivanje na duvanske proizvode"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:150
+msgid "Use of tobacco products"
+msgstr "Upotreba duvanskih proizvoda"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:153
+msgid "No nudity of any sort"
+msgstr "Nema bilo kakve nagosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:156
+msgid "Brief artistic nudity"
+msgstr "Kratka umetnička golotinja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:159
+msgid "Prolonged nudity"
+msgstr "Produžena golotinja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:162
+msgid "No references or depictions of sexual nature"
+msgstr "Nema seksualnih prikaza ili upućivanja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:165
+msgid "Provocative references or depictions"
+msgstr "Provokativne upute ili prikazi"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:168
+msgid "Sexual references or depictions"
+msgstr "Seksualne upute ili prikazi"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:171
+msgid "Graphic sexual behavior"
+msgstr "Grafičko seksualno ponašanje"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:174
+msgid "No profanity of any kind"
+msgstr "Nema bilo kakve vulgarnosti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:177
+msgid "Mild or infrequent use of profanity"
+msgstr "Blaga ili retka upotreba psovki"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:180
+msgid "Moderate use of profanity"
+msgstr "Umerena upotreba psovki"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:183
+msgid "Strong or frequent use of profanity"
+msgstr "Jaka ili česta upotreba psovki"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:186
+msgid "No inappropriate humor"
+msgstr "Nema neumesnog humora"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:189
+msgid "Slapstick humor"
+msgstr "Urnebesna komedija"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:192
+msgid "Vulgar or bathroom humor"
+msgstr "Vulgaran ili neumesni humor"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:195
+msgid "Mature or sexual humor"
+msgstr "Erotski i humor za odrasle"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:198
+msgid "No discriminatory language of any kind"
+msgstr "Nema bilo kakvog diskriminacionog govora"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:201
+msgid "Negativity towards a specific group of people"
+msgstr "Negativnost prema određenoj grupi ljudi"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:204
+msgid "Discrimination designed to cause emotional harm"
+msgstr "Diskriminacija osmišljena da izazove emotivnu povredu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:207
+msgid "Explicit discrimination based on gender, sexuality, race or religion"
+msgstr ""
+"Eksplicitna diskriminacija na osnovu pola, seksualnosti, rase ili "
+"veroispovesti"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:210
+msgid "No advertising of any kind"
+msgstr "Nema bilo kakvog oglašavanja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:213
+msgid "Product placement"
+msgstr "Plasman proizvoda"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:216
+msgid "Explicit references to specific brands or trademarked products"
+msgstr "Eksplicitno upućivanje na naročite robne marke ili zaštićene proizvode"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:219
+msgid "Users are encouraged to purchase specific real-world items"
+msgstr "Korisnici se ohrabruju da kupuju određene stavke u stvarnom svetu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:222
+msgid "No gambling of any kind"
+msgstr "Nema bilo kakvog kockanja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:225
+msgid "Gambling on random events using tokens or credits"
+msgstr "Kockanje na nasumičnim događajima koji koriste žetone ili kredite"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:228
+msgid "Gambling using “play” money"
+msgstr "Kockanje koje koristi „igrački“ novac (play)"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:231
+msgid "Gambling using real money"
+msgstr "Kockanje koje koristi stvarni novac"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:234
+msgid "No ability to spend money"
+msgstr "Ne može se trošiti stvaran novac"
+
+#. v1.1
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:237
+msgid "Users are encouraged to donate real money"
+msgstr "Korisnici se ohrabruju da doniraju stvarni novac"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:240
+msgid "Ability to spend real money in-game"
+msgstr "Sposobnost potrošnje stvarnog novca u igri"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:243
+msgid "No way to chat with other users"
+msgstr "Nema načina za ćaskanje sa drugim korisnicima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:246
+msgid "User-to-user game interactions without chat functionality"
+msgstr "Međudejstvo između korisnika bez mogućnosti ćaskanja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:249
+msgid "Moderated chat functionality between users"
+msgstr "Umerena mogućnost ćaskanja između korisnika"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:252
+msgid "Uncontrolled chat functionality between users"
+msgstr "Nekontrolisana mogućnost ćaskanja između korisnika"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:255
+msgid "No way to talk with other users"
+msgstr "Nema načina za razgovor sa drugim korisnicima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:258
+msgid "Uncontrolled audio or video chat functionality between users"
+msgstr "Nekontrolisana mogućnost zvučnog i video ćaskanja između korisnika"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:261
+msgid "No sharing of social network usernames or email addresses"
+msgstr ""
+"Nema razmene korisničkih imena društvenih mreža ili adresa elektronske pošte"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:264
+msgid "Sharing social network usernames or email addresses"
+msgstr ""
+"Razmena korisničkih imena društvenih mreža ili adresa elektronske pošte"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:267
+msgid "No sharing of user information with 3rd parties"
+msgstr "Nema razmene korisničkih podataka sa trećim stranama"
+
+#. v1.1
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:270
+msgid "Checking for the latest application version"
+msgstr "Proverava poslednje izdanje programa"
+
+#. 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 ""
+"Dele se dijagnostički podaci preko kojih drugi ne mogu prepoznati korisnika"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:276
+msgid "Sharing information that lets others identify the user"
+msgstr ""
+"Dele se dijagnostički podaci preko kojih drugi mogu prepoznati korisnika"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:279
+msgid "No sharing of physical location to other users"
+msgstr "Nema razmene fizičke lokacije sa drugim korisnicima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:282
+msgid "Sharing physical location to other users"
+msgstr "Razmena stvarnih lokacija sa drugim korisnicima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:287
+msgid "No references to homosexuality"
+msgstr "Nema upućivanja na homoseksualnost"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:290
+msgid "Indirect references to homosexuality"
+msgstr "Posredna upućivanja na homoseksualnost"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:293
+msgid "Kissing between people of the same gender"
+msgstr "Ljubljenje između osoba istog pola"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:296
+msgid "Graphic sexual behavior between people of the same gender"
+msgstr "Grafičko seksualno ponašanje između osoba istog pola"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:299
+msgid "No references to prostitution"
+msgstr "Nema upućivanja na prostituciju"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:302
+msgid "Indirect references to prostitution"
+msgstr "Posredna upućivanja na prostituciju"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:305
+msgid "Direct references of prostitution"
+msgstr "Neposredna upućivanja na prostituciju"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:308
+msgid "Graphic depictions of the act of prostitution"
+msgstr "Grafički prikazi čina prostitucije"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:311
+msgid "No references to adultery"
+msgstr "Nema upućivanja na preljubu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:314
+msgid "Indirect references to adultery"
+msgstr "Posredna upućivanja na preljubu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:317
+msgid "Direct references of adultery"
+msgstr "Neposredna upućivanja na preljubu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:320
+msgid "Graphic depictions of the act of adultery"
+msgstr "Grafički prikazi čina preljube"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:323
+msgid "No sexualized characters"
+msgstr "Nema seksualizovanih karaktera"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:326
+msgid "Scantily clad human characters"
+msgstr "Oskudno obučeni ljudski karakteri"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:329
+msgid "Overtly sexualized human characters"
+msgstr "Preterano seksualizovani ljudski karakteri"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:332
+msgid "No references to desecration"
+msgstr "Nema upućivanja na skrnavljenje"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:335
+msgid "Depictions or references to historical desecration"
+msgstr "Prikazi ili upućivanja ka istorijskim skrnavljenjima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:338
+msgid "Depictions of modern-day human desecration"
+msgstr "Prikazi savremenog ljudskog skrnavljenja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:341
+msgid "Graphic depictions of modern-day desecration"
+msgstr "Grafički prikazi savremenog skrnavljenja"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:344
+msgid "No visible dead human remains"
+msgstr "Bez vidljivih ljudskih posmrtnih ostataka"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:347
+msgid "Visible dead human remains"
+msgstr "Sa vidljivim ljudskim posmrtnim ostacima"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:350
+msgid "Dead human remains that are exposed to the elements"
+msgstr "Posmrtni ostaci ljudi koji su izloženi vremenskim prilikama"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:353
+msgid "Graphic depictions of desecration of human bodies"
+msgstr "Grafički prikazi skrnavljenja ljudskih tela"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:356
+msgid "No references to slavery"
+msgstr "Nema upućivanja na robovlasništvo"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:359
+msgid "Depictions or references to historical slavery"
+msgstr "Prikazi ili upućivanja ka istorijskom robovlasništvu"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:362
+msgid "Depictions of modern-day slavery"
+msgstr "Prikazi savremenog robovlasništva"
+
+#. TRANSLATORS: content rating description
+#: src/gs-content-rating.c:365
+msgid "Graphic depictions of modern-day slavery"
+msgstr "Grafički prikazi savremenog robovlasništva"
+
+#. 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 "Program"
+
+#. 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“ zahteva dodatnu podršku za korišćenje ove vrste datoteke."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:303
+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:307
+#, c-format
+msgid "%s is requesting additional fonts."
+msgstr "„%s“ zahteva dodatne slovne likove."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:309
+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:313
+#, c-format
+msgid "%s is requesting additional multimedia codecs."
+msgstr "„%s“ zahteva dodatne multimedijalne kodeke."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:315
+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:319
+#, 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:321
+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:325
+#, c-format
+msgid "%s is requesting additional packages."
+msgstr "„%s“ zahteva dodatne pakete."
+
+#. TRANSLATORS: notification title
+#: src/gs-dbus-helper.c:327
+msgid "Additional Packages Required"
+msgstr "Potrebni su dodatni paketi"
+
+#. TRANSLATORS: this is a button that launches gnome-software
+#: src/gs-dbus-helper.c:336
+msgid "Find in Software"
+msgstr "Nađi u Programima"
+
+#. 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 "_Instaliraj"
+
+#. TRANSLATORS: button text in the header when an application
+#. * can be live-updated
+#: src/gs-details-page.c:319
+msgid "_Update"
+msgstr "Až_uriraj"
+
+#. 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 "_Instaliraj…"
+
+#. TRANSLATORS: A label for a button to execute the selected
+#. application.
+#: src/gs-details-page.c:366
+msgid "_Launch"
+msgstr "_Pokreni"
+
+#. 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 "_Ukloni"
+
+#: src/gs-details-page.c:459
+msgid "Removing…"
+msgstr "Uklanjam…"
+
+#. 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 "Č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:485
+msgid "Pending update…"
+msgstr "Čeka na ažuriranje…"
+
+#. 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 "Ovaj program se može koristiti samo ako postoji veza sa internetom."
+
+#. TRANSLATORS: this is where the version is not known
+#: src/gs-details-page.c:967
+msgctxt "version"
+msgid "Unknown"
+msgstr "Nepoznato"
+
+#. TRANSLATORS: this is where the updated date is not known
+#: src/gs-details-page.c:980
+msgctxt "updated"
+msgid "Never"
+msgstr "Nikada"
+
+#. TRANSLATORS: this is where we don't know the origin of the
+#. * application
+#: src/gs-details-page.c:1028
+msgctxt "origin"
+msgid "Unknown"
+msgstr "Nepoznato"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1425
+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:1559
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Ne mogu da pronađem „%s“"
+
+#. TRANSLATORS: see the wikipedia page
+#: src/gs-details-page.c:2162
+msgid "Public domain"
+msgstr "Javno vlasništvo"
+
+#. 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://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"
+
+#. 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.sr"
+
+#. TRANSLATORS: see GNU page
+#: src/gs-details-page.c:2182 src/gs-details-page.ui:1383
+msgid "Free Software"
+msgstr "Slobodan softver"
+
+#. 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] "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:"
+
+#: src/gs-details-page.c:2266 src/gs-details-page.ui:1492
+msgid "More information"
+msgstr "Još podataka"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Stranica pojedinosti"
+
+#. Translators: A label for a button to add a shortcut to the selected application.
+#: src/gs-details-page.ui:346
+msgid "_Add shortcut"
+msgstr "_Dodaj prečicu"
+
+#. 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 "_Ukloni prečicu"
+
+#: src/gs-details-page.ui:456
+msgid "No screenshot provided"
+msgstr "Nije dostavljen snimak ekrana"
+
+#: src/gs-details-page.ui:492
+msgid "Software Repository Included"
+msgstr "Sadrži riznicu programa"
+
+#: src/gs-details-page.ui:493
+msgid ""
+"This application 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:506
+msgid "No Software Repository Included"
+msgstr "Ne sadrži riznicu programa"
+
+#: src/gs-details-page.ui:507
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:521
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:534
+msgid "Software Repository Identified"
+msgstr "Riznica programa je prepoznata"
+
+#: src/gs-details-page.ui:535
+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:536
+msgid "Only use software repositories that you trust."
+msgstr "Koristite samo proverene riznice programa."
+
+#: src/gs-details-page.ui:552
+msgid "_Website"
+msgstr "_Veb stranica"
+
+#: src/gs-details-page.ui:567
+msgid "_Donate"
+msgstr "Pošalji _donaciju"
+
+#: src/gs-details-page.ui:701
+msgid "Localized in your Language"
+msgstr "Preveden na srpski"
+
+#: src/gs-details-page.ui:713
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: src/gs-details-page.ui:725
+msgid "Release Activity"
+msgstr "Održavan program"
+
+#: src/gs-details-page.ui:737
+msgid "System Integration"
+msgstr "Usklađenost sa sistemom"
+
+#: src/gs-details-page.ui:749
+msgid "Sandboxed"
+msgstr "Izolovan"
+
+#: src/gs-details-page.ui:774
+msgid "Version"
+msgstr "Izdanje"
+
+#: src/gs-details-page.ui:811
+msgid "Age Rating"
+msgstr "Ocena starosne prikladnosti"
+
+#: src/gs-details-page.ui:849
+msgid "Updated"
+msgstr "Ažuriran"
+
+#: src/gs-details-page.ui:884
+msgid "Category"
+msgstr "Kategorija"
+
+#: src/gs-details-page.ui:922
+msgid "Installed Size"
+msgstr "Veličina instaliranog"
+
+#: src/gs-details-page.ui:955
+msgid "Download Size"
+msgstr "Veličina preuzetog"
+
+#: src/gs-details-page.ui:1021
+msgid "Developer"
+msgstr "Programer"
+
+#: src/gs-details-page.ui:1055
+msgid "License"
+msgstr "Dozvola"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:1075
+msgid "Free"
+msgstr "Slobodan"
+
+#. This refers to the license of the application
+#: src/gs-details-page.ui:1092
+msgid "Proprietary"
+msgstr "Vlasnički"
+
+#. 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 "Nepoznato"
+
+#. 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 "Dodaci"
+
+#: src/gs-details-page.ui:1176
+msgid "Selected add-ons will be installed with the application."
+msgstr "Izabrani dodaci biće instalirani sa programom."
+
+# 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-details-page.ui:1219
+msgid "Reviews"
+msgstr "Pregledi"
+
+#. 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 "_Napiši pregled"
+
+#. Translators: Button to return more application-submitted reviews.
+#: src/gs-details-page.ui:1257
+msgid "_Show More"
+msgstr "_Prikaži još"
+
+#: src/gs-details-page.ui:1400
+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."
+
+#: src/gs-details-page.ui:1459
+msgid "Proprietary Software"
+msgstr "Vlasnički softver"
+
+#: 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 ""
+"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."
+
+#: src/gs-details-page.ui:1521
+msgid "Unknown Software License"
+msgstr "Nepoznata dozvola softvera"
+
+#: src/gs-details-page.ui:1538
+msgid "The license terms of this software are unknown."
+msgstr "Odredbe dozvole ovog softvera su nepoznate."
+
+#: src/gs-details-page.ui:1565
+msgid "The application was rated this way because it features:"
+msgstr "Program je ocenjen ovako zato što ga odlikuje sledeće:"
+
+#: src/gs-details-page.ui:1591
+msgid "No details were available for this rating."
+msgstr "Nema pojedinosti za ovu ocenu starosne prikladnosti."
+
+#: src/gs-editor.c:361
+msgid "CSS validated OK!"
+msgstr "CSS je uspešno proveren!"
+
+#. TRANSLATORS: error dialog title
+#: src/gs-editor.c:564
+msgid "Failed to load file"
+msgstr "Nisam uspeo da učitam datoteku"
+
+#. TRANSLATORS: window title
+#: src/gs-editor.c:598 src/gs-editor.c:874
+msgid "Unsaved changes"
+msgstr "Nesačuvane izmene"
+
+#: src/gs-editor.c:600
+msgid "The application list is already loaded."
+msgstr "Spisak sa programima je već učitan."
+
+#. TRANSLATORS: button text
+#: src/gs-editor.c:604
+msgid "Merge documents"
+msgstr "Spoji dokumente"
+
+#. TRANSLATORS: button text
+#: src/gs-editor.c:608 src/gs-editor.c:879
+msgid "Throw away changes"
+msgstr "Odbaci izmene"
+
+#. import the new file
+#: src/gs-editor.c:620 src/gs-editor.c:652
+msgid "Open AppStream File"
+msgstr "Otvori AppStream datoteku"
+
+#: src/gs-editor.c:624
+msgid "_Open"
+msgstr "_Otvori"
+
+#: src/gs-editor.c:656
+msgid "_Save"
+msgstr "_Sačuvaj"
+
+#. TRANSLATORS: error dialog title
+#: src/gs-editor.c:676
+msgid "Failed to save file"
+msgstr "Nisam uspeo da sačuvam datoteku"
+
+#. TRANSLATORS, the %s is the app name, e.g. 'Inkscape'
+#: src/gs-editor.c:751
+#, c-format
+msgid "%s banner design deleted."
+msgstr "Dizajn banera za %s je obrisan."
+
+#. TRANSLATORS, this is a notification
+#: src/gs-editor.c:754
+msgid "Banner design deleted."
+msgstr "Dizajn banera je obrisan."
+
+#: src/gs-editor.c:876
+msgid "The application list has unsaved changes."
+msgstr "Spisak programa sadrži nesačuvane izmene."
+
+#. TRANSLATORS: show the program version
+#: src/gs-editor.c:1111
+msgid "Use verbose logging"
+msgstr "Koristi detaljno zapisivanje"
+
+#. TRANSLATORS: program name, an application to add and remove software repositories
+#: src/gs-editor.c:1119
+msgid "GNOME Software Banner Designer"
+msgstr "Dizajner banera za Gnomove programe"
+
+#: src/gs-editor.ui:63 src/gs-editor.ui:77
+msgid "No Designs"
+msgstr "Nema dizajna"
+
+#: src/gs-editor.ui:163
+msgid "Error message here"
+msgstr "Poruka o grešci"
+
+#: src/gs-editor.ui:250
+msgid "App ID"
+msgstr "IB programa"
+
+#: src/gs-editor.ui:341 src/gs-review-dialog.ui:142
+msgid "Summary"
+msgstr "Sažetak"
+
+#: src/gs-editor.ui:382
+msgid "Editor’s Pick"
+msgstr "Izbor urednika"
+
+#. This check button controls whether the application’s banner appears in the “Featured” category
+#: src/gs-editor.ui:397
+msgid "Category Featured"
+msgstr "Izdvojeno u kategoriji"
+
+#. button in the info bar
+#: src/gs-editor.ui:471
+msgid "Undo"
+msgstr "Opozovi"
+
+#: src/gs-editor.ui:524 src/org.gnome.Software.Editor.desktop.in:3
+msgid "Banner Designer"
+msgstr "Dizajner banera"
+
+#: src/gs-editor.ui:547
+msgid "New Banner"
+msgstr "Novi baner"
+
+#: src/gs-editor.ui:615
+msgid "Import from file"
+msgstr "Uvezi iz datoteke"
+
+#: src/gs-editor.ui:629
+msgid "Export to file"
+msgstr "Izvezi u datoteku"
+
+#: src/gs-editor.ui:643
+msgid "Delete Design"
+msgstr "Obriši dizajn"
+
+#: src/gs-editor.ui:670
+msgid "Featured App"
+msgstr "Izdvojeni program"
+
+#: src/gs-editor.ui:684
+msgid "OS Upgrade"
+msgstr "Nadogradnja sistema"
+
+#. TRANSLATORS: separator for a list of items
+#: src/gs-extras-page.c:147
+msgid " and "
+msgstr " i "
+
+#. 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] "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: 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] "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:226
+msgid "Unable to Find Requested Software"
+msgstr "Ne mogu da nađem potrebne programe"
+
+#. TRANSLATORS: This string is used for codecs that weren't found
+#: src/gs-extras-page.c:328
+#, c-format
+msgid "%s not found"
+msgstr "Nisam pronašao „%s“"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:332
+msgid "on the website"
+msgstr "na veb 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:339
+#, c-format
+msgid "No applications 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: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 ""
+"Podatke o „%s“, kao i način nabavljanja nedostajućih programa možete 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:350 src/gs-extras-page.c:372
+#, c-format
+msgid "No applications are available for %s support."
+msgstr "Nisu dostupni programi 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:361
+#, 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: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 ""
+"Podatke o „%s“, kao i način nabavljanja programa koji može da podrži ovu vrstu "
+"datoteka možete nać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:383
+#, 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:387
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:394 lib/gs-plugin-loader.c:1474
+#, 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: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 ""
+"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 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 "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:409
+#, 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 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 "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: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 ""
+"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:464
+msgid "this website"
+msgstr "ovom veb sajtu"
+
+#. 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] "Na žalost, ne mogu pronaći „%s“. Na „%s“ možete naći više podataka."
+msgstr[1] "Na žalost, ne mogu pronaći „%s“. Na „%s“ možete naći više podataka."
+msgstr[2] "Na žalost, ne mogu pronaći „%s“. Na „%s“ možete naći više podataka."
+msgstr[3] "Na žalost, ne mogu pronaći „%s“. Na „%s“ možete naći više podataka."
+
+#: 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 "Neuspeh pri dobavljanju rezultata pretrage"
+
+#: src/gs-extras-page.c:828
+#, c-format
+msgid "%s file format"
+msgstr "%s format datoteke"
+
+#: src/gs-extras-page.ui:7
+msgid "Codecs page"
+msgstr "Stranica kodeka"
+
+#: src/gs-first-run-dialog.ui:7 src/gs-first-run-dialog.ui:16
+msgid "Welcome"
+msgstr "Dobro došli"
+
+#: src/gs-first-run-dialog.ui:50
+msgid "Welcome to Software"
+msgstr "Dobro došli u Programe"
+
+#: 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 ""
+"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."
+
+#: src/gs-first-run-dialog.ui:85
+msgid "_Let’s Go Shopping"
+msgstr "_Ajmo u kupovinu"
+
+#. 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 "Razmaci"
+
+#: src/gs-hiding-box.c:382
+msgid "The amount of space between children"
+msgstr "Količina razmaka među sadržanim elementima"
+
+#. 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 "Uklonjen"
+
+#. 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 "Instaliran"
+
+#. 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 "Ažuriran"
+
+#. 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 "Nepoznato"
+
+#: src/gs-history-dialog.ui:6
+msgid "History"
+msgstr "Istorijat"
+
+#. TRANSLATORS: This is the header dividing the normal
+#. * applications and the system ones
+#: src/gs-installed-page.c:486
+msgid "System Applications"
+msgstr "Sistemski programi"
+
+#: src/gs-installed-page.c:618
+msgid "Click on items to select them"
+msgstr "Pritisnite na stavke da ih izaberete"
+
+#: src/gs-installed-page.c:820
+msgid "Select"
+msgstr "Izaberi"
+
+#: src/gs-installed-page.ui:7
+msgid "Installed page"
+msgstr "Stranica instaliranog"
+
+#: src/gs-installed-page.ui:65
+msgid "_Add to Folder…"
+msgstr "_Dodaj u fasciklu…"
+
+#: src/gs-installed-page.ui:73
+msgid "_Move to Folder…"
+msgstr "_Premesti u fasciklu…"
+
+#: src/gs-installed-page.ui:81
+msgid "_Remove from Folder"
+msgstr "_Ukloni iz fascikle"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:75
+msgid "Software catalog is being downloaded"
+msgstr "Katalog softvera je preuzet"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:79
+msgid "Software catalog is being loaded"
+msgstr "Katalog softvera je učitan"
+
+#: src/gs-loading-page.ui:7
+msgid "Loading page"
+msgstr "Učitavam stranicu"
+
+#: src/gs-loading-page.ui:53
+msgid "Starting up…"
+msgstr "Pokrećem…"
+
+#: src/gs-menus.ui:7
+msgid "_Software Repositories"
+msgstr "R_iznice programa"
+
+#: src/gs-menus.ui:14
+msgid "_About"
+msgstr "_O programu"
+
+#: src/gs-menus.ui:18
+msgid "_Quit"
+msgstr "_Izađi"
+
+#: src/gs-moderate-page.ui:7
+msgid "Moderate page"
+msgstr "Stranica uređenja"
+
+#: src/gs-moderate-page.ui:87
+msgid "There are no reviews to moderate"
+msgstr "Nema pregleda za uređenje"
+
+#. add button
+#: src/gs-overview-page.c:330
+msgid "More…"
+msgstr "Još…"
+
+#. 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 "Preporučeni audio i video programi"
+
+#. 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 "Preporučene igre"
+
+#. 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 "Preporučeni grafički programi"
+
+#. 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 "Preporučeni stvaralački programi"
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:890 src/gs-repos-dialog.c:777
+msgid "Access additional software from selected third party sources."
+msgstr "Pristupite dodatnim programima sa izvora probranih trećih strana."
+
+#. TRANSLATORS: this is the third party repositories info bar.
+#: src/gs-overview-page.c:894 src/gs-repos-dialog.c:781
+msgid ""
+"Some of this software is proprietary and therefore has restrictions on use, "
+"sharing, and access to source code."
+msgstr ""
+"Deo ovog programa je vlasnički te je deljenje, korišćenje i pristupanje izvornom "
+"kodu ograničeno."
+
+#. TRANSLATORS: this is the clickable
+#. * link on the third party repositories info bar
+#: src/gs-overview-page.c:901 src/gs-repos-dialog.c:788
+msgid "Find out more…"
+msgstr "Saznaj više…"
+
+#. TRANSLATORS: button to turn on third party software repositories
+#: src/gs-overview-page.c:910
+msgid "Enable"
+msgstr "Uključi"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Stranica pregleda"
+
+#: src/gs-overview-page.ui:49
+msgid "Enable Third Party Software Repositories?"
+msgstr "Da uključim riznice programa treće strane?"
+
+#: src/gs-overview-page.ui:117
+msgid "Featured Application"
+msgstr "Izdvojeni programi"
+
+#: src/gs-overview-page.ui:150
+msgid "Categories"
+msgstr "Kategorije"
+
+#. 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 "Izbori urednika"
+
+#. Translators: This is a heading for software which has been recently released upstream.
+#: src/gs-overview-page.ui:348
+msgid "Recent Releases"
+msgstr "Nedavna izdanja"
+
+#: src/gs-overview-page.ui:435
+msgid "No Application Data Found"
+msgstr "Nisam pronašao podatke o programima"
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:468
+#, c-format
+msgid "Are you sure you want to purchase %s?"
+msgstr "Da li sigurno želite da kupite „%s“?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:472
+#, c-format
+msgid "%s will be installed, and you will be charged %s."
+msgstr "%s će biti instaliran i biće vam naplaćeno %s."
+
+#. TRANSLATORS: this is button text to purchase the application
+#: src/gs-page.c:485
+msgid "Purchase"
+msgstr "Kupi"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:559
+#, c-format
+msgid "Prepare %s"
+msgstr "Pripremam „%s“"
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * source name, e.g. 'GNOME Nightly'
+#: src/gs-page.c:694
+#, c-format
+msgid "Are you sure you want to remove the %s source?"
+msgstr "Da li sigurno želite da uklonite izvor „%s“?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:698
+#, c-format
+msgid ""
+"All applications from %s will be removed, and you will have to re-install "
+"the source to use them again."
+msgstr ""
+"Sve programi sa „%s“ biće uklonjeni, a moraćete ponovo da instalirate izvor "
+"da biste ih ponovo koristili."
+
+#. TRANSLATORS: this is a prompt message, and '%s' is an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:706
+#, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr "Da li sigurno želite da uklonite „%s“?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:709
+#, c-format
+msgid "%s will be removed, and you will have to install it to use it again."
+msgstr ""
+"Biće uklonjen „%s“, i moraćete da ga instalirate da biste ga ponovo koristili."
+
+#: lib/gs-plugin-loader.c:1477
+#, 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 ""
+"Podatke o „%s“, kao i podatke o nabavljanju kodeka koji može puštati ovu vrstu "
+"datoteke možete pronaći na veb stranici."
+
+#. TRANSLATORS: this refers to an app (by name) that is installed
+#: src/gs-popular-tile.c:70 src/gs-summary-tile.c:75
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Instaliran)"
+
+#. TRANSLATORS: this refers to where the app came from
+#: src/gs-popular-tile.c:205
+#, c-format
+msgid "Source: %s"
+msgstr "Izvor: %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 ""
+"Neki od trenutno instaliranih programa nisu saglasni sa „%s“. Ako nastavite, "
+"sledeći će biti sami uklonjeni za vreme nadogradnje:"
+
+#: src/gs-removal-dialog.ui:27
+msgid "Incompatible Software"
+msgstr "Nesaglasan softver"
+
+#: src/gs-removal-dialog.ui:40
+msgid "_Continue"
+msgstr "_Nastavi"
+
+#. 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 instalirani program"
+msgstr[1] "%u instalirana programa"
+msgstr[2] "%u instaliranih programa"
+msgstr[3] "Jedan instalirani program"
+
+#. 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 instalirani 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 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 program"
+msgstr[1] "%u programa"
+msgstr[2] "%u programa"
+msgstr[3] "Jedan program"
+
+#. 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 dodatak"
+msgstr[1] "%u dodatka"
+msgstr[2] "%u dodataka"
+msgstr[3] "Jedan dodatak"
+
+#. 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 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"
+
+#. TRANSLATORS: this is a prompt message, and '%s' is a
+#. * repository name, e.g. 'GNOME Nightly'
+#: src/gs-repos-dialog.c:248
+#, c-format
+msgid "Remove “%s”?"
+msgstr "Ukloniti riznicu „%s“?"
+
+#. TRANSLATORS: this is a prompt message, and '%s' is a
+#. * repository name, e.g. 'GNOME Nightly'
+#: src/gs-repos-dialog.c:253
+#, c-format
+msgid "Disable “%s”?"
+msgstr "Onemogućiti riznicu „%s“?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-repos-dialog.c:257
+msgid ""
+"Software that has been installed from this repository will no longer receive "
+"updates, including security fixes."
+msgstr ""
+"Programi instalirani iz ove riznice više neće dobijati ažuriranja, uključujući "
+"i bezbednosne ispravke."
+
+#. TRANSLATORS: this is button text to remove the repo
+#: src/gs-repos-dialog.c:275
+msgid "Disable"
+msgstr "Onemogući"
+
+#. 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:686
+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:756 src/gs-repos-dialog.c:795
+#, c-format
+msgid "These repositories supplement the default software provided by %s."
+msgstr ""
+"Ove riznice dopunjavaju podrazumevane programe koje pruža distribucija „%s“."
+
+#. TRANSLATORS: info bar title in the software repositories dialog
+#: src/gs-repos-dialog.c:774
+msgid "Third Party Repositories"
+msgstr "Riznice treće strane"
+
+#: src/gs-repos-dialog.ui:82
+msgid "No Additional Repositories"
+msgstr "Nema dodatnih riznica"
+
+#. TRANSLATORS: this is a button in the software repositories
+#. dialog for enabling a repo
+#: src/gs-repo-row.c:110
+msgid "_Enable"
+msgstr "_Omogući"
+
+#. 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 "_Ukloni…"
+
+#. 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 "O_nemogući…"
+
+#. 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 "Uključujem"
+
+#. 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 "Onemogućavam"
+
+#. 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 "Omogućeno"
+
+#. 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 "Onemogućeno"
+
+#: src/gs-repo-row.ui:89
+msgid "URL"
+msgstr "Adresa"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really bad application
+#: src/gs-review-dialog.c:95
+msgid "Hate it"
+msgstr "Nikakav"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:99
+msgid "Don’t like it"
+msgstr "Ne dopada mi se"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:103
+msgid "It’s OK"
+msgstr "U redu je"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:107
+msgid "Like it"
+msgstr "Dobar je"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:111
+msgid "Love it"
+msgstr "Odličan"
+
+#. 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 "Utrošite malo više vremena za pisanje pregleda"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:137
+msgid "Please choose a star rating"
+msgstr "Izaberite ocenu zvezdicom"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:141
+msgid "The summary is too short"
+msgstr "Sažetak je prekratak"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:145
+msgid "The summary is too long"
+msgstr "Sažetak je predug"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:149
+msgid "The description is too short"
+msgstr "Opis je prekratak"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:153
+msgid "The description is too long"
+msgstr "Opis je predug"
+
+# Mislim da se ova niska odnosi na deo Programa koji je posvećen recenzijama programa.
+#. 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 "Objavi pregled"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:35
+msgid "_Post"
+msgstr "_Objavi"
+
+#: src/gs-review-dialog.ui:85
+msgid "Rating"
+msgstr "Ocenjivanje"
+
+#: src/gs-review-dialog.ui:158
+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.
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:199
+msgctxt "app review"
+msgid "Review"
+msgstr "Pregled"
+
+#: src/gs-review-dialog.ui:215
+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."
+
+#. Translators: A label for the total number of reviews.
+#: src/gs-review-histogram.ui:413
+msgid "ratings in total"
+msgstr "ukupno ocena"
+
+#. 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 ""
+"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:239
+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:253
+msgid "Report Review?"
+msgstr "Da objavim pregled?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:257
+msgid "Report"
+msgstr "Objavi"
+
+#. 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 "Da li vam je ovaj pregled koristio?"
+
+#: src/gs-review-row.ui:134
+msgid "Yes"
+msgstr "Jeste"
+
+#: src/gs-review-row.ui:148
+msgid "No"
+msgstr "Nije"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:162
+msgid "Meh"
+msgstr "Onako"
+
+#: src/gs-review-row.ui:196
+msgid "Report…"
+msgstr "Objavi…"
+
+#: src/gs-review-row.ui:211
+msgid "Remove…"
+msgstr "Ukloni…"
+
+#. 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 "Nema snimaka ekrana"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:329
+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:462
+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:492
+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:553
+msgid "Screenshot not valid"
+msgstr "Neispravan snimak ekrana"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:568
+msgid "Screenshot not available"
+msgstr "Snimak ekrana nije dostupan"
+
+#: src/gs-screenshot-image.c:621
+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:158
+#, 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:54
+msgid "No Application Found"
+msgstr "Nisam pronašao programe"
+
+#. 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:898
+#, 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:904
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Ne mogu da preuzmem ažuriranja sa „%s“"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:911
+msgid "Unable to download updates"
+msgstr "Ne mogu da preuzmem ažuriranja"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:916
+msgid ""
+"Unable to download updates: internet access was required but wasn’t available"
+msgstr "Ne mogu da preuzmem ažuriranja: nema veze sa internetom"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:925
+#, c-format
+msgid "Unable to download updates from %s: not enough disk space"
+msgstr "Ne mogu da preuzmem ažuriranja sa „%s“: nema dovoljno prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:930
+msgid "Unable to download updates: not enough disk space"
+msgstr "Ne mogu da preuzmem ažuriranja: nema dovoljno prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:938
+msgid "Unable to download updates: authentication was required"
+msgstr "Ne mogu da preuzmem ažuriranja: potrebna je prijava"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:943
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Ne mogu da preuzmem ažuriranja: prijava nije ispravna"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:948
+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:955
+msgid "Unable to get list of updates"
+msgstr "Ne mogu da preuzmem spisak ažuriranja"
+
+#. 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:1004
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Ne mogu da instaliram program „%s“ jer preuzimanje sa „%s“ nije uspelo"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1010
+#, c-format
+msgid "Unable to install %s as download failed"
+msgstr "Ne mogu da instaliram program „%s“ jer preuzimanje nije uspelo"
+
+#. 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:1022
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr ""
+"Ne mogu da instaliram program „%s“ jer izvršno okruženje „%s“ nije dostupno"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1028
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Ne mogu da instaliram program „%s“ jer taj program nije podržan"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1035
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr "Ne mogu da instaliram: nema veze sa internetom"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1041
+msgid "Unable to install: the application has an invalid format"
+msgstr "Ne mogu da instaliram: Format programa nije ispravan"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1046
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Ne mogu da instaliram program „%s“: nema dovoljno prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1054
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Ne mogu da instaliram program „%s“: bila je potrebna prijava"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1061
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Ne mogu da instaliram program „%s“: prijava nije bila ispravna"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1068
+#, c-format
+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"
+
+#. 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:1081
+#, c-format
+msgid "Your %s account has been suspended."
+msgstr "Vaš nalog „%s“ je obustavljen."
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1085
+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."
+
+#. 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:1096
+#, c-format
+msgid "For more information, visit %s."
+msgstr "Za više podataka, pogledajte %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:1105
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Ne mogu da instaliram „%s“: strujno napajanje je potrebno"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1114
+#, c-format
+msgid "Unable to install %s"
+msgstr "Ne mogu da instaliram program „%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:1163
+#, c-format
+msgid "Unable to update %s from %s"
+msgstr "Ne mogu da ažuriram program „%s“ iz „%s“"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1169
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "Ne mogu da ažuriram program „%s“ jer preuzimanje nije uspelo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1175
+msgid "Unable to update: internet access was required but wasn’t available"
+msgstr "Ne mogu da ažuriram: nema veze sa internetom"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1183
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Ne mogu da ažuriram program „%s“: nema dovoljno prostora na disku"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1192
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Ne mogu da ažuriram program „%s“: bila je potrebna prijava"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1199
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Ne mogu da ažuriram program „%s“: prijava nije bila ispravna"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1206
+#, c-format
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1214
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Ne mogu da ažuriram program „%s“: strujno napajanje je potrebno"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1223
+#, c-format
+msgid "Unable to update %s"
+msgstr "Ne mogu da ažuriram program „%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:1271
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+msgstr "Ne mogu da se nadogradim sa distribucije „%s“ na „%s“"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1276
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Ne mogu da nadogradim na „%s“ zato što preuzimanje nije uspelo"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1283
+msgid "Unable to upgrade: internet access was required but wasn’t available"
+msgstr "Ne mogu da nadogradim: nema veze sa internetom"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1291
+#, c-format
+msgid "Unable to upgrade to %s: not enough disk space"
+msgstr "Ne mogu da se nadogradim na „%s“: 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:1300
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr ""
+"Ne mogu da se nadogradim na distribuciju „%s“: bila je potrebna prijava"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1307
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+msgstr ""
+"Ne mogu da se nadogradim na distribuciju „%s“: prijava nije bila ispravna"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1314
+#, c-format
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1321
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr ""
+"Ne mogu da se nadogradim na distribuciju „%s“: strujno napajanje je potrebno"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1330
+#, c-format
+msgid "Unable to upgrade to %s"
+msgstr "Ne mogu da se nadogradim na distribuciju „%s“"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1375
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Ne mogu da uklonim program „%s“: bila je potrebna prijava"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1381
+#, c-format
+msgid "Unable to remove %s: authentication was invalid"
+msgstr "Ne mogu da uklonim program „%s“: prijava nije bila ispravna"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1387
+#, c-format
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1394
+#, c-format
+msgid "Unable to remove %s: AC power is required"
+msgstr "Ne mogu da uklonim program „%s“: strujno napajanje je potrebno"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1403
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Ne mogu da uklonim program „%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:1452
+#, 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:1459 src/gs-shell.c:1510 src/gs-shell.c:1561
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Nema dovoljno slobodnog prostora na disku, oslobodite nešto prostora i "
+"probajte ponovo"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1467 src/gs-shell.c:1518 src/gs-shell.c:1588
+msgid "Sorry, something went wrong"
+msgstr "Nažalost, nešto je pošlo naopako"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1505
+msgid "Failed to install file: authentication failed"
+msgstr "Nisam uspeo da instaliram datoteku: prijava nije uspela"
+
+#. 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:1555
+#, c-format
+msgid "Unable to contact %s"
+msgstr "Ne mogu da kontaktiram „%s“"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1570
+#, c-format
+msgid "%s needs to be restarted to use new plugins."
+msgstr "Program „%s“ se mora ponovo pokrenuti da biste koristili nove dodatke."
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1575
+msgid "This application needs to be restarted to use new plugins."
+msgstr "Ovaj program se mora ponovo pokrenuti da biste koristili nove dodatke."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1582
+msgid "AC power is required"
+msgstr "Strujno napajanje je potrebno"
+
+#: src/gs-summary-tile.c:80
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Instaliram)"
+
+#: src/gs-summary-tile.c:85
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Uklanjam)"
+
+#. 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 "_Ukloni sve"
+
+#. 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 "Nema dostupnog opisa ažuriranja."
+
+#. 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 "Instaliran je %s"
+
+#. TRANSLATORS: this is the title of the installed updates dialog window
+#: src/gs-update-dialog.c:246
+msgid "Installed Updates"
+msgstr "Instalirana ažuriranja"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-update-dialog.c:446
+msgid "Additions"
+msgstr "Dodato"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-update-dialog.c:450
+msgid "Removals"
+msgstr "Uklonjeno"
+
+#. TRANSLATORS: This is the header for package updates during
+#. * a system update
+#: src/gs-update-dialog.c:454
+msgid "Updates"
+msgstr "Osveženja"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-update-dialog.c:458
+msgid "Downgrades"
+msgstr "Unazađivanja"
+
+#: src/gs-update-dialog.ui:111
+msgid "No updates have been installed on this system."
+msgstr "Nijedno ažuriranje nije instalirano na ovaj sistem."
+
+#: src/gs-update-monitor.c:93
+msgid "Security Updates Pending"
+msgstr "Ima bezbednosnih ažuriranja"
+
+#: src/gs-update-monitor.c:94
+msgid "It is recommended that you install important updates now"
+msgstr "Preporučeno je što ranije instaliranje ovih ažuriranja"
+
+#: src/gs-update-monitor.c:97
+msgid "Restart & Install"
+msgstr "Ponovo pokreni i instaliraj"
+
+#: src/gs-update-monitor.c:101
+msgid "Software Updates Available"
+msgstr "Dostupna su ažuriranja programa"
+
+#: src/gs-update-monitor.c:102
+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"
+
+#. TRANSLATORS: button text
+#: src/gs-update-monitor.c:105 src/gs-updates-page.c:750
+msgid "Not Now"
+msgstr "Ne sada"
+
+#: src/gs-update-monitor.c:106
+msgid "View"
+msgstr "Pogledaj"
+
+#. 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 "Ažuriranja operativnog sistema nisu dostupna"
+
+#. 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 "Nadogradite sistem da biste i dalje dobijali bezbednosna ažuriranja."
+
+#. 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 "Nova verzija distribucije %s je dostupna za instalaciju"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:320
+msgid "Software Upgrade Available"
+msgstr "Dostupna su ažuriranja programa"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:633
+msgid "Software Updates Failed"
+msgstr "Ažuriranje programa nije uspelo"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: src/gs-update-monitor.c:635
+msgid "An important OS update failed to be installed."
+msgstr "Nije uspelo instaliranje važnog ažuriranja sistema."
+
+#: src/gs-update-monitor.c:636
+msgid "Show Details"
+msgstr "Prikaži pojedinosti\t"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:659
+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:664
+#, 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:670
+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:674
+msgid "An important OS update has been installed."
+msgid_plural "Important OS 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 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 "Pregled"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:734
+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:740
+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:745
+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:751
+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:757
+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:763
+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: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 ""
+"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: 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 "Juče, u %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 "Juče, u %l:%M %p"
+
+#: src/gs-updates-page.c:314
+msgid "Two days ago"
+msgstr "Pre dva dana"
+
+#: src/gs-updates-page.c:316
+msgid "Three days ago"
+msgstr "Pre tri dana"
+
+#: src/gs-updates-page.c:318
+msgid "Four days ago"
+msgstr "Pre četiri dana"
+
+#: src/gs-updates-page.c:320
+msgid "Five days ago"
+msgstr "Pre pet dana"
+
+#: src/gs-updates-page.c:322
+msgid "Six days ago"
+msgstr "Pre šest dana"
+
+#: src/gs-updates-page.c:324
+msgid "One week ago"
+msgstr "Pre nedelju dana"
+
+#: src/gs-updates-page.c:326
+msgid "Two weeks ago"
+msgstr "Pre dve nedelje"
+
+#. 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 "Preuzimam nova ažuriranja…"
+
+#. TRANSLATORS: the update panel is doing *something* vague
+#: src/gs-updates-page.c:347
+msgid "Looking for new updates…"
+msgstr "Tražim nova ažuriranja…"
+
+#. TRANSLATORS: the updates panel is starting up
+#: src/gs-updates-page.c:414
+msgid "Setting up updates…"
+msgstr "Podešavam ažuriranja…"
+
+#. 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 "(Ovo može da potraje)"
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: src/gs-updates-page.c:527
+#, c-format
+msgid "Last checked: %s"
+msgstr "Poslednja provera: %s"
+
+#. TRANSLATORS: we've just live-updated some apps
+#: src/gs-updates-page.c:746
+msgid "Updates have been installed"
+msgstr "Ažuriranja su instalirana"
+
+#. 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 "Potrebno je ponovno pokretanje kako bi stupila u dejstvo."
+
+#. TRANSLATORS: button text
+#: src/gs-updates-page.c:752
+msgid "Restart"
+msgstr "Pokreni ponovo"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-page.c:822
+msgid "Integrated Firmware"
+msgstr "Ugrađeni firmver"
+
+#. 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 "Ponovo pokreni i instaliraj"
+
+#. 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 "Zahteva ponovno pokretanje"
+
+#. 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 "Ažuriranja programa"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-page.c:845
+msgid "Update All"
+msgstr "Ažuriraj sve"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-page.c:852
+msgid "Device Firmware"
+msgstr "Firmver uređaja"
+
+#. TRANSLATORS: this is an offline update
+#: src/gs-updates-page.c:1041
+msgid "_Restart & Update"
+msgstr "_Ponovo pokreni i instaliraj"
+
+#. TRANSLATORS: all updates will be installed
+#: src/gs-updates-page.c:1045
+msgid "U_pdate All"
+msgstr "Až_uriraj sve"
+
+#. 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 "Više nema podrške za distribuciju %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 "Vaš sistem više nije podržan."
+
+#. 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 "To znači da više ne dobija bezbedonosna ažuriranja."
+
+#. 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 "Preporučeno je da nadogradite sistem na novije izdanje."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:1403
+msgid "Charges may apply"
+msgstr "Ažuriranjem mogu nastati dodatni novčani troškovi"
+
+#. 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 ""
+"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:1411
+msgid "Check Anyway"
+msgstr "Ipak proveri"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:1427
+msgid "No Network"
+msgstr "Nema mreže"
+
+#. 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 "Potreban je pristup Internetu za proveru ažuriranja."
+
+#: src/gs-updates-page.c:1836
+msgid "Restart & _Install"
+msgstr "Ponovo pokreni i _instaliraj"
+
+#: src/gs-updates-page.c:1854
+msgid "Check for updates"
+msgstr "Proveri da li ima ažuriranja"
+
+#: src/gs-updates-page.ui:7
+msgid "Updates page"
+msgstr "Stranica ažuriranja"
+
+#: src/gs-updates-page.ui:194
+msgid "Software is up to date"
+msgstr "Programi su ažurirani"
+
+#: src/gs-updates-page.ui:245
+msgid ""
+"Checking for updates when 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 kartici"
+
+#: src/gs-updates-page.ui:257
+msgid "_Check Anyway"
+msgstr "_Ipak proveri"
+
+#: src/gs-updates-page.ui:300
+msgid "Go online to check for updates"
+msgstr "Poveži se i potraži ažuriranja"
+
+#: src/gs-updates-page.ui:311
+msgid "_Network Settings"
+msgstr "_Podešavanja mreže"
+
+#: src/gs-updates-page.ui:393
+msgid "Updates are automatically managed"
+msgstr "Samostalno upravljanje ažuriranjima je uključeno"
+
+#. 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 je sada dostupan"
+
+#. 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 "Preuzimam %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 je spreman za instaliranje"
+
+#: src/gs-upgrade-banner.ui:32
+msgid "A major upgrade, with new features and added polish."
+msgstr "Velika nadogradnja, sa novim funkcijama i dodatim ispravkama."
+
+#: src/gs-upgrade-banner.ui:52
+msgid "_Learn More"
+msgstr "_Saznaj više"
+
+#: src/gs-upgrade-banner.ui:98
+msgid ""
+"It is recommended that you back up your data and files before upgrading."
+msgstr ""
+"Preporučuje vam se da napravite rezervu vaših podataka i datoteka pre "
+"nadograđivanja."
+
+#: src/gs-upgrade-banner.ui:116
+msgid "_Download"
+msgstr "_Preuzmi"
+
+#: 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: 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 ""
+"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;"
+
+#: src/org.gnome.Software.Editor.desktop.in:4
+msgid "Design the featured banners for GNOME Software"
+msgstr "Dizajniraj banere za Gnomove progrme"
+
+#. 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;AppStrim;Softver;Aplikacija;Programi;App;Programi;"
+"Softver;Aplikacija;"
+
+#: plugins/core/gs-desktop-common.c:30
+msgctxt "Menu of Audio & Video"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:33
+msgctxt "Menu of Audio & Video"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:36
+msgctxt "Menu of Audio & Video"
+msgid "Audio Creation & Editing"
+msgstr "Stvaranje i uređivanje zvuka"
+
+#: plugins/core/gs-desktop-common.c:42
+msgctxt "Menu of Audio & Video"
+msgid "Music Players"
+msgstr "Programi za muziku"
+
+#: plugins/core/gs-desktop-common.c:51
+msgctxt "Menu of Developer Tools"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:54
+msgctxt "Menu of Developer Tools"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:57
+msgctxt "Menu of Developer Tools"
+msgid "Debuggers"
+msgstr "Pročišćavači"
+
+#: plugins/core/gs-desktop-common.c:60
+msgctxt "Menu of Developer Tools"
+msgid "IDEs"
+msgstr "IRO"
+
+#: plugins/core/gs-desktop-common.c:69
+msgctxt "Menu of Education & Science"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:73
+msgctxt "Menu of Education & Science"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:77
+msgctxt "Menu of Education & Science"
+msgid "Artificial Intelligence"
+msgstr "Veštačka inteligencija"
+
+#: plugins/core/gs-desktop-common.c:80
+msgctxt "Menu of Education & Science"
+msgid "Astronomy"
+msgstr "Astronomija"
+
+#: plugins/core/gs-desktop-common.c:84
+msgctxt "Menu of Education & Science"
+msgid "Chemistry"
+msgstr "Hemija"
+
+#: plugins/core/gs-desktop-common.c:88
+msgctxt "Menu of Education & Science"
+msgid "Languages"
+msgstr "Jezici"
+
+#: plugins/core/gs-desktop-common.c:92
+msgctxt "Menu of Education & Science"
+msgid "Math"
+msgstr "Matematika"
+
+#: 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 "Sve"
+
+#: plugins/core/gs-desktop-common.c:111
+msgctxt "Menu of Games"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:114
+msgctxt "Menu of Games"
+msgid "Action"
+msgstr "Akcija"
+
+#: plugins/core/gs-desktop-common.c:117
+msgctxt "Menu of Games"
+msgid "Adventure"
+msgstr "Avantura"
+
+#: plugins/core/gs-desktop-common.c:120
+msgctxt "Menu of Games"
+msgid "Arcade"
+msgstr "Arkadne"
+
+#: plugins/core/gs-desktop-common.c:123
+msgctxt "Menu of Games"
+msgid "Blocks"
+msgstr "Blokovi"
+
+#: plugins/core/gs-desktop-common.c:126
+msgctxt "Menu of Games"
+msgid "Board"
+msgstr "Tabla"
+
+#: plugins/core/gs-desktop-common.c:129
+msgctxt "Menu of Games"
+msgid "Card"
+msgstr "Karte"
+
+#: plugins/core/gs-desktop-common.c:132
+msgctxt "Menu of Games"
+msgid "Emulators"
+msgstr "Oponašavači"
+
+#: plugins/core/gs-desktop-common.c:135
+msgctxt "Menu of Games"
+msgid "Kids"
+msgstr "Dečje igre"
+
+#: 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 "Igranje uloge"
+
+#: plugins/core/gs-desktop-common.c:144
+msgctxt "Menu of Games"
+msgid "Sports"
+msgstr "Sportovi"
+
+#: plugins/core/gs-desktop-common.c:148
+msgctxt "Menu of Games"
+msgid "Strategy"
+msgstr "Strategije"
+
+#: plugins/core/gs-desktop-common.c:156
+msgctxt "Menu of Graphics & Photography"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:159
+msgctxt "Menu of Graphics & Photography"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: 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 "Fotografija"
+
+#: plugins/core/gs-desktop-common.c:168
+msgctxt "Menu of Graphics & Photography"
+msgid "Scanning"
+msgstr "Skeniranje"
+
+#: plugins/core/gs-desktop-common.c:171
+msgctxt "Menu of Graphics & Photography"
+msgid "Vector Graphics"
+msgstr "Vektorska grafika"
+
+#: plugins/core/gs-desktop-common.c:174
+msgctxt "Menu of Graphics & Photography"
+msgid "Viewers"
+msgstr "Pregledači"
+
+#: plugins/core/gs-desktop-common.c:182
+msgctxt "Menu of Productivity"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:185
+msgctxt "Menu of Productivity"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:188
+msgctxt "Menu of Productivity"
+msgid "Calendar"
+msgstr "Kalendar"
+
+#: plugins/core/gs-desktop-common.c:192
+msgctxt "Menu of Productivity"
+msgid "Database"
+msgstr "Baza podataka"
+
+#: plugins/core/gs-desktop-common.c:195
+msgctxt "Menu of Productivity"
+msgid "Finance"
+msgstr "Finansije"
+
+#: plugins/core/gs-desktop-common.c:199
+msgctxt "Menu of Productivity"
+msgid "Word Processor"
+msgstr "Obrađivanje teksta"
+
+#: plugins/core/gs-desktop-common.c:208
+msgctxt "Menu of Add-ons"
+msgid "Fonts"
+msgstr "Slova"
+
+#: plugins/core/gs-desktop-common.c:211
+msgctxt "Menu of Add-ons"
+msgid "Codecs"
+msgstr "Kodeci"
+
+#: plugins/core/gs-desktop-common.c:214
+msgctxt "Menu of Add-ons"
+msgid "Input Sources"
+msgstr "Izvori ulaza"
+
+#: plugins/core/gs-desktop-common.c:217
+msgctxt "Menu of Add-ons"
+msgid "Language Packs"
+msgstr "Jezički paketi"
+
+#: plugins/core/gs-desktop-common.c:220
+msgctxt "Menu of Add-ons"
+msgid "Shell Extensions"
+msgstr "Proširenja školjke"
+
+#: plugins/core/gs-desktop-common.c:223
+msgctxt "Menu of Add-ons"
+msgid "Localization"
+msgstr "Prevod"
+
+#: plugins/core/gs-desktop-common.c:226
+msgctxt "Menu of Add-ons"
+msgid "Hardware Drivers"
+msgstr "Hardverski upravljački programi"
+
+#: plugins/core/gs-desktop-common.c:234
+msgctxt "Menu of Communication & News"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:237
+msgctxt "Menu of Communication & News"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:240
+msgctxt "Menu of Communication & News"
+msgid "Chat"
+msgstr "Ćaskanje"
+
+#: plugins/core/gs-desktop-common.c:247
+msgctxt "Menu of Communication & News"
+msgid "News"
+msgstr "Vesti"
+
+#: plugins/core/gs-desktop-common.c:251
+msgctxt "Menu of Communication & News"
+msgid "Web Browsers"
+msgstr "Veb preglednici"
+
+#: plugins/core/gs-desktop-common.c:259
+msgctxt "Menu of Utilities"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:262
+msgctxt "Menu of Utilities"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:265
+msgctxt "Menu of Utilities"
+msgid "Text Editors"
+msgstr "Uređivači teksta"
+
+#: plugins/core/gs-desktop-common.c:273
+msgctxt "Menu of Reference"
+msgid "All"
+msgstr "Sve"
+
+#: plugins/core/gs-desktop-common.c:276
+msgctxt "Menu of Reference"
+msgid "Featured"
+msgstr "Izdvojeno"
+
+#: plugins/core/gs-desktop-common.c:279
+msgctxt "Menu of Art"
+msgid "Art"
+msgstr "Umetnost"
+
+#: plugins/core/gs-desktop-common.c:282
+msgctxt "Menu of Reference"
+msgid "Biography"
+msgstr "Biografija"
+
+#: plugins/core/gs-desktop-common.c:285
+msgctxt "Menu of Reference"
+msgid "Comics"
+msgstr "Stripovi"
+
+#: plugins/core/gs-desktop-common.c:288
+msgctxt "Menu of Reference"
+msgid "Fiction"
+msgstr "Fantastika"
+
+#: plugins/core/gs-desktop-common.c:291
+msgctxt "Menu of Reference"
+msgid "Health"
+msgstr "Zdravlje"
+
+#: plugins/core/gs-desktop-common.c:294
+msgctxt "Menu of Reference"
+msgid "History"
+msgstr "Istorija"
+
+#: plugins/core/gs-desktop-common.c:297
+msgctxt "Menu of Reference"
+msgid "Lifestyle"
+msgstr "Način življenja"
+
+#: plugins/core/gs-desktop-common.c:300
+msgctxt "Menu of Reference"
+msgid "Politics"
+msgstr "Politika"
+
+#: plugins/core/gs-desktop-common.c:303
+msgctxt "Menu of Reference"
+msgid "Sports"
+msgstr "Sportovi"
+
+#. TRANSLATORS: this is the menu spec main category for Audio & Video
+#: plugins/core/gs-desktop-common.c:313
+msgid "Audio & Video"
+msgstr "Zvuk i snimci"
+
+#. TRANSLATORS: this is the menu spec main category for Development
+#: plugins/core/gs-desktop-common.c:316
+msgid "Developer Tools"
+msgstr "Razvojni alati"
+
+#. TRANSLATORS: this is the menu spec main category for Education & Science
+#: plugins/core/gs-desktop-common.c:319
+msgid "Education & Science"
+msgstr "Obrazovanje i nauka"
+
+#. TRANSLATORS: this is the menu spec main category for Game
+#: plugins/core/gs-desktop-common.c:322
+msgid "Games"
+msgstr "Igre"
+
+#. TRANSLATORS: this is the menu spec main category for Graphics
+#: plugins/core/gs-desktop-common.c:325
+msgid "Graphics & Photography"
+msgstr "Grafika i fotografija"
+
+#. TRANSLATORS: this is the menu spec main category for Office
+#: plugins/core/gs-desktop-common.c:328
+msgid "Productivity"
+msgstr "Produktivnost"
+
+#. TRANSLATORS: this is the menu spec main category for Communication
+#: plugins/core/gs-desktop-common.c:334
+msgid "Communication & News"
+msgstr "Saopštenja i vesti"
+
+#. TRANSLATORS: this is the menu spec main category for Reference
+#: plugins/core/gs-desktop-common.c:337
+msgid "Reference"
+msgstr "Upute"
+
+#. TRANSLATORS: this is the menu spec main category for Utilities
+#: plugins/core/gs-desktop-common.c:340
+msgid "Utilities"
+msgstr "Alatke"
+
+#. 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 "Nadogradnje sistema"
+
+#. 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 ""
+"U nadogradnje su uključena poboljšanja stabilnosti, bezbednosti i rada sistema."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:55
+msgid "Downloading featured images…"
+msgstr "Preuzimam izdvojene slike…"
+
+#: 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: 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 "Sistemski instalater datoteka toka Gnomovih programa"
+
+#: plugins/external-appstream/gs-install-appstream.c:114
+msgid "Failed to parse command line arguments"
+msgstr "Nisam uspeo da obradim argumente linije naredbi"
+
+#. 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 "Morate navesti tačno jedno ime datoteke"
+
+#. 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 "Ovaj program može koristiti samo administrator"
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:136
+msgid "Failed to validate content type"
+msgstr "Nisam uspeo da potvrdim vrstu sadržaja"
+
+#. TRANSLATORS: error details
+#: plugins/external-appstream/gs-install-appstream.c:143
+msgid "Failed to copy"
+msgstr "Nisam uspeo da iskopiram"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/external-appstream/gs-plugin-external-appstream.c:243
+msgid "Downloading extra metadata files…"
+msgstr "Preuzimam dodatne datoteke sa metapodacima…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:217
+msgid "Downloading upgrade information…"
+msgstr "Preuzimam podatke o nadogradnji…"
+
+#. 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 "Nadogradite vaš Fedora sistem radi novih mogućnosti i poboljšanja."
+
+#: 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 applications on Linux"
+msgstr "Fletpek je radni okvir za stone Linuks programe"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:607
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Dobavljam fletpek metapodatke za %s…"
+
+#. TRANSLATORS: status text when downloading the RuntimeRepo
+#: plugins/flatpak/gs-flatpak.c:2795
+msgid "Getting runtime source…"
+msgstr "Dobavljam izvor izvršnog okruženja…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:695
+msgid "Downloading firmware update signature…"
+msgstr "Preuzimam potpis ažuriranja firmvera…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:736
+msgid "Downloading firmware update metadata…"
+msgstr "Preuzimam ažuriranja metapodataka firmvera…"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/fwupd/gs-plugin-fwupd.c:826
+msgid "Downloading firmware update…"
+msgstr "Preuzimam ažuriranja 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/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:6
+msgid "Limba Support"
+msgstr "Podrška za Limbu"
+
+#: plugins/limba/org.gnome.Software.Plugin.Limba.metainfo.xml.in:7
+msgid "Limba provides developers a way to easily create software bundles"
+msgstr ""
+"Limba pruža programerima jednostavan način za pravljenje programskih paketa"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/odrs/gs-plugin-odrs.c:205
+msgid "Downloading application ratings…"
+msgstr "Preuzimam ocene programa…"
+
+#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:6
+msgid "Open Desktop Ratings Support"
+msgstr "Podrška za ocene otvorene radne površi"
+
+#: plugins/odrs/org.gnome.Software.Plugin.Odrs.metainfo.xml.in:7
+msgid "ODRS is a service providing user reviews of applications"
+msgstr "ODRS je usluga koja pruža preglede programa od strane korisnika"
+
+#: plugins/shell-extensions/gs-plugin-shell-extensions.c:398
+msgid "GNOME Shell Extensions Repository"
+msgstr "Riznica sa proširenjima Gnomove školjke"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/shell-extensions/gs-plugin-shell-extensions.c:715
+msgid "Downloading shell extension metadata…"
+msgstr "Preuzimam metapodatke proširenja školjke…"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:211
+msgid "Snap Store"
+msgstr "Skladište snepova"
+
+#: plugins/snap/org.gnome.Software.Plugin.Snap.metainfo.xml.in:6
+msgid "Snappy Support"
+msgstr "Podrška za Snepi (Snappy)"
+
+#: 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"
+
+#. TRANSLATORS: status text when downloading
+#: plugins/steam/gs-plugin-steam.c:600
+msgid "Downloading application page…"
+msgstr "Preuzimam stranicu programa…"
+
+#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:6
+msgid "Steam Support"
+msgstr "Podrška za Stim (Steam)"
+
+#: plugins/steam/org.gnome.Software.Plugin.Steam.metainfo.xml.in:7
+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 ""
+#~ "Provides access to additional software, including web browsers and games."
+#~ msgstr ""
+#~ "Obezbeđuje pristup dodatnom softveru, uključujući veb preglednike i igre."
+
+#~ 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 "Source Details"
+#~ msgstr "Pojedinosti programa"
+
+#~ 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 "About Software"
+#~ msgstr "O Programima"
+
+#~ msgid "Total"
+#~ msgstr "Ukupno"
+
+#~ msgid "Could not find '%s'"
+#~ msgstr "Ne mogu da nađem „%s“"
+
+#~ msgid "_Install All"
+#~ msgstr "_Instaliraj sve"
+
+#~ 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-cartoon"
+#~ msgid "None"
+#~ msgstr "Ništa"
+
+#~ 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 "web app"
+#~ msgstr "programi veba"
+
+#~ 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 "Revision Control"
+#~ msgstr "Upravljanje revizijama"
+
+#~ msgctxt "Menu subcategory of Development Tools"
+#~ msgid "Translation"
+#~ msgstr "Prevođenje"
+
+#~ 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 "Construction"
+#~ msgstr "Građevinarstvo"
+
+#~ 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"
+
+# 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 Education"
+#~ msgid "Humanities"
+#~ msgstr "Humanizam"
+
+#~ 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 "Medical"
+#~ msgstr "Medicina"
+
+#~ 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 "Remote Access"
+#~ msgstr "Udaljeni pristup"
+
+#~ 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"
+
+#~ msgid "System"
+#~ msgstr "Sistem"
+
+#~ 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 System"
+#~ msgstr "Sistem 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 "Players"
+#~ msgstr "Puštači"
+
+#~ 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 "Checking for updates…"
+#~ msgstr "Proveravam ažuriranja…"
+
+#~ msgid "Enter GApplication service mode"
+#~ msgstr "Unesi režim usluge GPrograma"
+
+#~ msgid "An update was not signed in the correct way."
+#~ msgstr "Jedno ažuriranje nije označeno na pravi način."
+
+#~ msgid "The update could not be completed."
+#~ msgstr "Ažuriranje ne može biti dovršeno."
+
+#~ 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 "No sources found."
+#~ msgstr "Nisam pronašao izvore."
+
+#~ msgid "OK"
+#~ msgstr "U redu"
+
+#~ 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!"
+
+#~ msgid "Recent Software Updates"
+#~ msgstr "Skorašnja osveženja softvera"
+
+#~ 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 "Description"
+#~ msgstr "Opis"
+
+#~ 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..e6fbb59
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,7227 @@
+# Swedish translation for gnome-software.
+# Copyright © 2014-2022 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+#
+# Translators:
+# Mattias Eriksson <snaggen@gmail.com>, 2014.
+# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022.
+# Sebastian Rasmussen <sebras@gmail.com>, 2016.
+# Luna Jernberg <droidbittin@gmail.com>, 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: 2022-09-09 20:47+0000\n"
+"PO-Revision-Date: 2022-09-11 20:23+0200\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\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.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 "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 applications and system "
+"extensions and remove existing installed applications."
+msgstr ""
+"Programvara gör det möjligt att hitta och installera nya program och "
+"systemkomponenter, samt att ta bort befintligt installerade program."
+
+#: 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 ""
+"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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2018
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME-projektet"
+
+#: 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"Den sista tidsstämpeln då systemet var anslutet och erhöll uppdateringar"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Servern som används för programomdömen"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "Den minsta karmapoängen för omdömen"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Tillåt åtkomst till dialogen Programförråd"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Erbjud uppgraderingar för förhandsutgåvor"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://sv.wikipedia.org/wiki/Propriet%C3%A4r_programvara'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME Programvaras systemomfattande Appstream-installerare"
+
+#: gs-install-appstream/gs-install-appstream.c:145
+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:152
+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:159
+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:167
+#, 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:178
+#, 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: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 "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 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 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:1027
+#, 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:1031
+#, 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 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 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Åldersklassificering"
+
+#: 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 "Hur du bidrar med saknad information"
+
+#: lib/gs-app.c:6175
+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:6194 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6271
+msgid "Package"
+msgstr "Paket"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:457
+msgid "Pending"
+msgstr "Väntar"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Väntar på att installeras"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Väntar på att tas bort"
+
+#: 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 "Installerat"
+
+#. 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 "Installerar"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Tar bort"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Avinstallera"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Nätverk"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Kan kommunicera över nätverket"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Systemtjänster"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Sessionstjänster"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Enheter"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Kan komma åt systemets enhetsfiler"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Hemmapp"
+
+#: 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 "Kan visa, redigera och skapa filer"
+
+#: 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 "Kan visa filer"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Hämtningsmapp"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Inställningar"
+
+#: src/gs-app-details-page.c:79
+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:80
+msgid "Legacy display system"
+msgstr "Gammalt fönstersystem"
+
+#: src/gs-app-details-page.c:80
+msgid "Uses an old, insecure display system"
+msgstr "Använder ett gammalt, osäkert fönstersystem"
+
+#: src/gs-app-details-page.c:81
+msgid "Sandbox escape"
+msgstr "Flykt från sandlåda"
+
+#: src/gs-app-details-page.c:81
+msgid "Can escape the sandbox and circumvent any other restrictions"
+msgstr "Kan undkomma sandlådan och gå runt alla andra begränsningar"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Uppdateringsdetaljer"
+
+#. 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 "Ingen beskrivning för uppdatering tillgänglig."
+
+#: 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 "Gå bakåt"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Kräver ytterligare behörigheter"
+
+#. 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 "Omdömen"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Inga omdömen hittades för detta program."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "Inga omdömen"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Versionshistorik"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "Nytt i version %s"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Visa en lokal metainfo- eller appdata-fil"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Visa utökad felsökningsinformation"
+
+#: 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 update preferences"
+msgstr "Visa uppdateringsinstä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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Copyright © 2016–2022 Bidragsgivarna till GNOME Programvara"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Mattias Eriksson <snaggen@gmail.com>\n"
+"Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Luna Jernberg <droidbittin@gmail.com>\n"
+"\n"
+"Skicka synpunkter på översättningen till\n"
+"<tp-sv@listor.tp-sv.se>."
+
+#. 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 "Om Programvara"
+
+#. 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 "Ett trevligt sätt att hantera programvaran på ditt system."
+
+#. 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 "Det finns tyvärr inga detaljer för det programmet."
+
+#. 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Kan komma åt hårdvaruenheter"
+
+#. 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Kan komma åt godtyckliga 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Kan erhålla godtyckliga behörigheter"
+
+#. 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 "Granskat av din distribution"
+
+#. 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 "Tillhandahålls av en tredje part"
+
+#. 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 "Proprietär kod"
+
+#. 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 "Granskningsbar kod"
+
+#. 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 "Programvarans utvecklare har verifierats"
+
+#. 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 "Programvaran stöds inte längre"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Osäkert"
+
+#: 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 "Endast mobil"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Fungerar endast på en liten skärm"
+
+#: 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 "Endast skrivbord"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Fungerar endast på en stor skärm"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Skärmstorleken stämmer inte"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Stöder inte din aktuella skärmstorlek"
+
+#: 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 "Kräver en pekskärm"
+
+#: 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 "Kräver ett tangentbord"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Kräver en mus"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Handkontroll behövs"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Adaptivt"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Fungerar på telefoner, plattor och skrivbord"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Kräver troligen ett tangentbord eller en mus"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Innehåller inget som är olämpligt för vissa åldrar"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:153
+msgid "Visit Website"
+msgstr "Besök webbplats"
+
+#. 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 "Installera…"
+
+#. 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 "Avbryt"
+
+#. 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 "Installera"
+
+#. 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 "Uppdatera"
+
+#. 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 "Avinstallera"
+
+#. 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 "Avinstallerar"
+
+#. 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 "Enhet kan inte användas under uppdatering."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "Har bytt namn från %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Hjälp till att översätta %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 designas, utvecklas och översätts av en internationell gemenskap av "
+"frivilliga.\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:5
+msgid "Translations"
+msgstr "Översättningar"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "Ö_versättningswebbplats"
+
+#. 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 "Inloggning krävde fjärren %s (rike %s)"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Inloggning krävs"
+
+#: 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 "A_vbryt"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Logga in"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Användare"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Lösen_ord"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Nya & uppdaterade"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Annan programvara"
+
+#. 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 "Ange ett tal från 1 till %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Välj ett program:"
+
+#: 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 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 har installerats"
+
+#. 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 "En omstart krävs för att ändringarna ska börja gälla."
+
+#. 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 "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:84
+msgid "System updates are now installed"
+msgstr "Systemuppdateringar har nu installerats"
+
+#. 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 "Nyligen installerade uppdateringar finns tillgängliga för granskning"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Starta om"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Starta"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Installera tredjepartsprogramvara?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Aktivera programförråd från tredje part?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s är inte <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">programvara med fri och öppen källkod</a>, och "
+"tillhandahålls av ”%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 tillhandahålls av ”%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Varna inte igen"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Detaljerat felmeddelande från pakethanteraren lyder:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Detaljer"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Acceptera"
+
+#. 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] "En uppdatering har installerats"
+msgstr[1] "Uppdateringar har installerats"
+
+#. 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] "Ett program har tagits bort"
+msgstr[1] "Program har tagits bort"
+
+#. 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] "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:773
+msgid "Not Now"
+msgstr "Inte nu"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Just nu"
+
+#: src/gs-common.c:871
+#, 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:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d timme sedan"
+msgstr[1] "%d timmar sedan"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d år sedan"
+msgstr[1] "%d år 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: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 "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:332
+msgid "Find in Software"
+msgstr "Sök i Programvara"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Visa mer"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Visa mindre"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Ta bort…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Kräver omstart för att slutföra installation"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Väntar på att uppdateras…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Förbereder…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Avinstallerar…"
+
+#. 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Installera"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "_Starta om"
+
+#. 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:900
+msgid "_Install…"
+msgstr "_Installera…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Andra program av %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+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:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Kunde inte hitta ”%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Detaljsida"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Läser in programdetaljer…"
+
+#: src/gs-details-page.ui:77
+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."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Hjälp _till att översätta"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "Ö_ppna"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Uppdatera"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "Hämtar"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Tillägg"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Valda tillägg kommer att installeras med programmet."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application 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:587
+msgid "Software Repository Included"
+msgstr "Programförråd inkluderat"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application includes a software repository which provides updates, as "
+"well as access to other software."
+msgstr ""
+"Programmet inkluderar ett programförråd som tillhandahåller uppdateringar "
+"och tillgång till annan programvara."
+
+#: src/gs-details-page.ui:605
+msgid "No Software Repository Included"
+msgstr "Inget programförråd inkluderad"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Programmet inkluderar inget programförråd. Det kommer inte att uppdateras "
+"med nya versioner."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Programförråd identifierat"
+
+#: src/gs-details-page.ui:642
+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:643
+msgid "Only use software repositories that you trust."
+msgstr "Använd endast programförråd som du litar på."
+
+#: src/gs-details-page.ui:708
+msgid "No Metadata"
+msgstr "Inga metadata"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Projekt_webbplats"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Donera"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "_Bidra med översättningar"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "_Rapportera ett ärende"
+
+#: 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 "_Skriv ett omdöme"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:945
+msgid "All Reviews"
+msgstr "Alla omdömen"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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: 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] "Tillgängliga typsnitt för skriftspråket %s"
+msgstr[1] "Tillgängliga typsnitt för skriftspråken %s"
+
+#. 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] "Tillgänglig programvara för %s"
+msgstr[1] "Tillgängliga programvaror för %s"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "Begärd programvara kunde inte hittas"
+
+#: src/gs-extras-page.c:244
+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:343
+#, c-format
+msgid "%s not found"
+msgstr "%s kunde inte hittas"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "på webbplatsen"
+
+#. 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 "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: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 ""
+"Information om %s, samt alternativ för hur du införskaffar saknade program "
+"kan hittas %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 "Inga program finns tillgängliga för %s-stöd."
+
+#. 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 ä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: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 ""
+"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 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 "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:402
+#, 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 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 "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: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 ""
+"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 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 "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:424
+#, 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 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 "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: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 ""
+"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:481
+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 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] ""
+"Tyvärr kunde %s som begärdes av %s inte hittas. Se %s för mer information."
+msgstr[1] ""
+"Tyvärr kunde %s som begärdes av %s 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: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] ""
+"Tyvärr kunde %s som du sökte efter inte hittas. Se %s för mer information."
+msgstr[1] ""
+"Tyvärr kunde %s som du sökte efter inte hittas. Se %s för mer information."
+
+#: 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 "Kunde inte hitta några sökresultat: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s-filformat"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "Kan inte hitta begärd programvara"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kodeksida"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Skrivbordsstöd"
+
+#: 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 "Stöder att användas på en stor skärm"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Okänt skrivbordsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Kräver en stor skärm"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Skrivbord stöds inte"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobilstöd"
+
+#: 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 "Stöder att användas på en liten skärm"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Okänt mobilstöd"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Kräver en liten skärm"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobil stöds inte"
+
+#: src/gs-hardware-support-context-dialog.c:610
+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:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Tangentbordsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Okänt tangentbordsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Tangentbord krävs"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Stöder tangentbord"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Tangentbord stöds inte"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Kan inte användas med ett tangentbord"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Musstöd"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Kräver en mus eller ett pekdon"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Okänt musstöd"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Mus krävs"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Stöder möss och pekdon"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Mus stöds inte"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Pekskärmsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Okänt pekskärmsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Pekskärm krävs"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Stöder pekskärmar"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Pekskärm stöds inte"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Kan inte användas med en pekskärm"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Handkontroll krävs"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Kräver en handkontroll"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Handkontrollsstöd"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s fungerar 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hårdvarustöd"
+
+#. 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 "Installerade"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Installerat-sida"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Program"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Webbapplikationer"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Systemprogram"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Gemenskapsbyggd"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Denna programvara utvecklas öppet av en gemenskap av frivilliga, och är "
+"släppt under <a href=\"%s\">licensen %s</a>.\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: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 ""
+"Denna programvara utvecklas öppet av en gemenskap av frivilliga, och är "
+"släppt under licensen %s.\n"
+"\n"
+"Du kan bidra och hjälpa till att göra den ännu bättre."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Proprietär"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Läs mer"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Hämtar programvarukatalog"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Inläsningssida"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Startar…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Automatiska uppdateringar pausade"
+
+#: 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 ""
+"Aktuellt nätverk har datakvot. Anslutningar med datakvot har datagränser "
+"eller kostnader förknippade med sig. För att minska dataanvändningen så har "
+"automatiska uppdateringar därför pausats.\n"
+"\n"
+"Automatiska uppdateringar kommer att återupptas då ett nätverk utan "
+"datakvoter blir tillgängligt. Till dess är det fortfarande möjligt att "
+"manuellt installera uppdateringar.\n"
+"\n"
+"Alternativt kan denna inställning ändras om det aktuella nätverket felaktigt "
+"identifierats som att ha datakvoter."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Öppna nätverks_inställningar"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Modereringssida"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Det finns inga omdömen att moderera"
+
+#: 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: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 "Användare"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Tillägg"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Borttagningar"
+
+#. 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 "Uppdateringar"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Nedgraderingar"
+
+#. 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 "utvalda externa källor"
+
+#. 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 ""
+"Tillhandahåller åtkomst till ytterligare programvara från %s. Viss "
+"proprietär programvara har inkluderats."
+
+#. 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 "Aktivera"
+
+#. 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 "Utforska"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Översiktssida"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Aktivera programförråd från tredje part?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Andra kategorier"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Inga programdata hittades"
+
+#: lib/gs-plugin-loader.c:2825
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Okänt"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Användaren nekade installation"
+
+#. 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 "Förbered %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 "Är du säker att du vill ta bort förrådet %s?"
+
+#. 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 ""
+"Alla paket 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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:530
+#, c-format
+msgid "Are you sure you want to uninstall %s?"
+msgstr "Är du säker på att du vill avinstallera %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 kommer att avinstalleras, och du måste installera det för att använda det "
+"igen."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Uppdateringsinställningar"
+
+#: 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 ""
+"För att undvika kostnader och nätverksbegränsningar hämtas "
+"programvaruuppdateringar inte automatiskt vid mobilanslutning eller "
+"anslutningar med datakvoter."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Automatiska uppdateringar"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr ""
+"Hämtar och installerar programvaruuppdateringar i bakgrunden när möjligt."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Aviseringar för automatiska uppdateringar"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Visa aviseringar då uppdateringar har installerats automatiskt."
+
+#. 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 ""
+"Viss nu installerad programvara är inte kompatibel med %s. Om du fortsätter "
+"kommer följande att tas bort automatiskt under uppgraderingen:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Inkompatibel programvara"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Fortsätt"
+
+#. 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 ""
+"Programvara som har installerats från ”%s” kommer inte längre att erhålla "
+"uppdateringar."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Inaktivera förråd?"
+
+#: src/gs-repos-dialog.c:248
+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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Ta bort"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Aktivera nya förråd"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, 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:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Programförråd"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Inga förråd"
+
+#. 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 program installerat"
+msgstr[1] "%u program installerade"
+
+#. 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 tillägg installerat"
+msgstr[1] "%u tillägg installerade"
+
+#. 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 program"
+msgstr[1] "%u program"
+
+#. 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 tillägg"
+msgstr[1] "%u tillägg"
+
+#. 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 och %s installerade"
+msgstr[1] "%s och %s installerade"
+
+#. 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 "Hatar det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Tycker inte om det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Det är OK"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Tycker om det"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Älskar det"
+
+#. 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 "Ta mer tid på dig att skriva omdömet"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+msgid "Please choose a star rating"
+msgstr "Välj ett stjärnbetyg"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:126
+msgid "The summary is too short"
+msgstr "Sammanfattningen är för kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Sammanfattningen är för lång"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Beskrivningen är för kort"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Skicka omdöme"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Skicka"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Betyg"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Sammanfattning"
+
+#: src/gs-review-dialog.ui:97
+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”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Omdöme"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"Se vilka data som skickas i vår <a href=\"https://odrs.gnome.org/"
+"privacy\">sekretesspolicy</a>. 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "Rapportera omdöme?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Rapportera"
+
+#. 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 detta omdöme användbart för dig?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Ja"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Nej"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Bah"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Rapportera…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Ta bort…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Kontrollera att du litar på leverantören, eftersom programmet inte körs i "
+"sandlåda"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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"
+
+#. 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 "Ingen behörighet"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Nätverksåtkomst"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ingen nätverksåtkomst"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Använder systemtjänster"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Använder sessionstjänster"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Enhetsåtkomst"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Ingen enhetsåtkomst"
+
+#: src/gs-safety-context-dialog.c:204
+msgid "Cannot access devices such as webcams or gaming controllers"
+msgstr "Kan inte komma åt enheter som webbkameror eller spelkontroller"
+
+# 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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Läs/skrivåtkomst för hela filsystemet"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Läs/skrivåtkomst för hemmapp"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Läsåtkomst för hela filsystemet"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Läsåtkomst för hemmapp"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "Läs/skrivåtkomst för hämtningsmapp"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "Läsåtkomst för hämtningsmapp"
+
+#: src/gs-safety-context-dialog.c:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Ingen filsystemsåtkomst"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Kan inte komma åt filsystemet alls"
+
+#. 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 "Proprietär kod"
+
+#: 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 ""
+"Källkoden är inte offentlig, så oberoende granskning kan inte utföras och "
+"koden kan vara osäker"
+
+#. 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 "Granskningsbar kod"
+
+#: 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 ""
+"Källkoden är offentlig, så oberoende granskning kan utföras, vilket gör "
+"programmet mer troligt att vara säkert"
+
+#. 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 "Programmets utvecklare har verifierats"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Osäkra beroenden"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 är 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:383
+#, 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s är osäkert"
+
+#. 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 "Säkerhet"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Källa"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Föråldrad SDK-version"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ingen skärmbild tillhandahållen"
+
+#. 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:622
+msgid "Screenshot not found"
+msgstr "Skärmbild kunde inte hittas"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Skärmbilden är ogiltig"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:180
+#, 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:6
+msgid "Search page"
+msgstr "Söksida"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Sök efter program"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "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:1281
+#, 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:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Kunde inte hämta uppdateringar"
+
+#. 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 ""
+"Kunde inte hämta uppdateringar: internetanslutning krävdes men var inte "
+"tillgänglig"
+
+#. 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 "Kunde inte hämta uppdateringar %s: otillräckligt diskutrymme"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Kunde inte hämta uppdateringar: otillräckligt diskutrymme"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Kunde inte hämta uppdateringar: autentisering krävdes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Kunde inte hämta uppdateringar: autentiseringen var ogiltig"
+
+#. 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 ""
+"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:1331
+msgid "Unable to get list of updates"
+msgstr "Kunde inte hämta lista över uppdateringar"
+
+#. 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 "Kunde inte installera %s eftersom hämtning misslyckades från %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 "Kunde inte installera %s eftersom hämtning misslyckades"
+
+#. 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 ""
+"Kunde inte installera %s eftersom exekveringsmiljön %s ej är tillgänglig"
+
+# TODO: as *it's* not supported?
+#. 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 "Kunde inte installera %s eftersom det inte stöds"
+
+#. 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 ""
+"Kunde inte installera: internetanslutning krävdes men var inte tillgänglig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Kunde inte installera: programmets format är ogiltigt"
+
+#. 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 "Kunde inte installera %s: otillräckligt diskutrymme"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Kunde inte installera %s: autentisering krävdes"
+
+#. 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 "Kunde inte installera %s: autentiseringen var ogiltig"
+
+#. 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 ""
+"Kunde inte installera %s: du har inte behörighet att installera programvara"
+
+#. 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 "Kunde inte installera %s: nätspänning krävs"
+
+#. 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 "Kunde inte installera %s: Batterinivån är för låg"
+
+#. 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 "Kunde inte installera %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 "Kunde inte uppdatera %s från %s eftersom hämtning misslyckades"
+
+#. 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 "Kunde inte uppdatera %s eftersom 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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Kunde inte installera uppdateringar från %s eftersom hämtning misslyckades"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Kunde inte installera uppdateringar eftersom hämtning misslyckades"
+
+#. 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 ""
+"Kunde inte uppdatera: internetanslutning krävdes men var inte tillgänglig"
+
+#. 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 "Kunde inte uppdatera %s: otillräckligt diskutrymme"
+
+#. 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 "Kunde inte installera uppdateringar: otillräckligt diskutrymme"
+
+#. 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 "Kunde inte uppdatera %s: autentisering krävdes"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Kunde inte installera uppdateringar: autentisering krävdes"
+
+#. 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 "Kunde inte uppdatera %s: autentiseringen var ogiltig"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Kunde inte installera uppdateringar: autentiseringen var ogiltig"
+
+#. 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 ""
+"Kunde inte uppdatera %s: du har inte behörighet att uppdatera programvara"
+
+#. 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 ""
+"Kunde inte installera uppdateringar: du har inte behörighet att uppdatera "
+"programvara"
+
+#. 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 "Kunde inte uppdatera %s: nätspänning krävs"
+
+#. 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 "Kunde inte installera uppdateringar: nätspänning krävs"
+
+#. 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 "Kunde inte uppdatera %s: Batterinivån är för låg"
+
+#. 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 "Kunde inte installera uppdateringar: Batterinivån är för låg"
+
+#. 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 "Kunde inte uppdatera %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Kunde inte installera uppdateringar"
+
+#. 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 "Kunde inte uppgradera till %s 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:1665
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Kunde inte uppgradera till %s eftersom hämtning misslyckades"
+
+#. 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 ""
+"Kunde inte uppgradera till %s: internetanslutning krävdes men var inte "
+"tillgänglig"
+
+#. 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 "Kunde inte uppgradera till %s: otillräckligt diskutrymme"
+
+#. 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 "Kunde inte uppgradera till %s: autentisering krävdes"
+
+#. 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 "Kunde inte uppgradera till %s: autentiseringen var ogiltig"
+
+#. 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 "Kunde inte uppgradera till %s: du har inte behörighet att uppgradera"
+
+#. 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 "Kunde inte uppgradera till %s: nätspänning 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:1712
+#, 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"
+
+#. 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 "Kunde inte uppgradera till %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 "Kunde inte ta bort %s: autentisering krävdes"
+
+#. 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 "Kunde inte ta bort %s: autentiseringen var ogiltig"
+
+#. 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 "Kunde inte ta bort %s: du har inte behörighet att ta bort programvara"
+
+#. 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 "Kunde inte ta bort %s: nätspänning krävs"
+
+#. 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 "Kunde inte ta bort %s: Batterinivån är för låg"
+
+#. 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 "Kunde inte ta bort %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 "Kunde inte köra %s: %s har inte installerats"
+
+#. 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 "Otillräckligt diskutrymme — frigör utrymme och försök igen"
+
+#. 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 "Något gick tyvärr fel"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1881
+msgid "Failed to install file: not supported"
+msgstr "Misslyckades med att installera fil: stöds inte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1884
+msgid "Failed to install file: authentication failed"
+msgstr "Misslyckades med att installera fil: autentisering misslyckades"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1919
+msgid "Failed to install: not supported"
+msgstr "Misslyckades med att installera: stöds inte"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1922
+msgid "Failed to install: authentication failed"
+msgstr "Misslyckades med att installera: autentisering misslyckades"
+
+#. 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 "Kunde inte kontakta %s"
+
+#. 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 "Programvara behöver startas om för att använda nya insticksmoduler."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1977
+msgid "AC power is required"
+msgstr "Nätspänning krävs"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1980
+msgid "The battery level is too low"
+msgstr "Batterinivån är för låg"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Programförråd"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Uppdateringsinställningar"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Undersök 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 "Nätverksinställningar"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Starta om nu"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Mer information"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Sök"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Primär meny"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Lär dig _mer"
+
+#. 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 "Uppdateringar"
+
+#. 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 "Application Data"
+msgstr "Programdata"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Lagring"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Cachade data kan rensas från <a href=\"dummy\">_programinställningarna</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Installerad)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Installerar)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Tar bort)"
+
+#. 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 "Installerade uppdateringar"
+
+#. 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 "Installerade på %s"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Inga uppdateringar installerade"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Programvaruuppdateringar är inaktuella"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Sök efter programvaruuppdateringar."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritisk programvaruuppdatering är redo att installeras"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "En viktig programvaruuppdatering är redo att installeras."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "Kritiska programvaruuppdateringar tillgängliga för hämtning"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Viktigt: kritiska programvaruuppdateringar väntar."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Programvaruuppdateringar är redo att installeras"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Programvaruuppdateringar väntar och är redo att installeras."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "Programvaruuppdateringar tillgängliga för hämtning"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Hämta väntande programvaruuppdateringar."
+
+#. 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 program uppdaterades — Omstart krävs"
+msgstr[1] "%u program uppdaterades — Omstart krävs"
+
+#. 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 program uppdaterades"
+msgstr[1] "%u program uppdaterades"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s har uppdaterats."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Starta om programmet."
+
+#. 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 och %s har uppdaterats."
+
+#. 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 program kräver en omstart."
+msgstr[1] "%u program kräver en omstart."
+
+#. 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 "Inkluderande %s, %s och %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 "Operativsystemsuppdateringar ej tillgängliga"
+
+#. 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 "Uppgradera för att fortsätta erhålla säkerhetsuppdateringar."
+
+#. 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 "En ny version av %s finns tillgänglig att installera"
+
+#. TRANSLATORS: this is a distro upgrade
+#: src/gs-update-monitor.c:732
+msgid "Software Upgrade Available"
+msgstr "Programvaruuppgradering tillgänglig"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+msgid "Software Updates Failed"
+msgstr "Programvaruuppdatering misslyckades"
+
+#. 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 ""
+"Misslyckades med att installera en viktig uppdatering av operativsystemet."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Visa detaljer"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Granska"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+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:1242
+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:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Senaste sökning: %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 stöds inte längre."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Ditt operativsystem stöds inte längre."
+
+#. 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 "Detta betyder att det inte erhåller säkerhetsuppdateringar."
+
+#. 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 "Du rekommenderas att nu uppgradera till en senare version."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Kostnader kan tillkomma"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "_Sök ändå"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Inget nätverk"
+
+#. 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 "Internetförbindelse krävs för att söka efter uppdateringar."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Sök efter tillgängliga uppdateringar"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Uppdateringar"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Uppdateringssida"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Läser in uppdateringar…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Uppdaterat"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Använd mobildata?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "_Kontrollera ändå"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Ingen anslutning"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Anslut till nätverk för att söka efter uppdateringar."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Nätverksinställningar"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Fel"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Uppdateringar hanteras automatiskt."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Starta om & uppdatera"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Uppdatera alla"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Programuppdateringar"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Fast programvara för enheter"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s tillgängligt"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Lär dig mer om den nya versionen"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Hämtar…"
+
+#. 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 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "%u%% hämtat"
+
+#: src/gs-upgrade-banner.ui:42
+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:187
+msgid "_Restart & Upgrade"
+msgstr "Starta _om & uppgradera"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Kom ihåg att säkerhetskopiera data och filer innan uppgradering."
+
+#: 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 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 ""
+"Uppdateringar;Uppgradera;Källor;Programvarukällor;Inställningar;Installera;"
+"Avinstallera;Program;Programvara;Mjukvara;Butik;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:67
+msgid "System Updates"
+msgstr "Systemuppdateringar"
+
+#. 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 ""
+"Allmänna systemuppdateringar, såsom säkerhets- eller felfixar, samt "
+"prestandaförbättringar."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Hämtar bilder i blickfånget…"
+
+#. 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-uppdatering med nya funktioner och fixar."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+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:498
+msgid "GNOME Web"
+msgstr "GNOME Webb"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Hämtar uppgraderingsinformation…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Systemmapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Hemundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Värdsystemmappar"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Värdsystemkonfiguration från /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Skrivbordsmapp"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Skrivbordsundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Dokumentmapp"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Dokumentundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Musikmapp"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Musikundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Bildmapp"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Bildundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Delningsmapp"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Delningsundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videomapp"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videoundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Mallmapp"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Mallundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Användarcachemapp"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Användarcacheundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Användarkonfigurationsmapp"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Användarkonfigurationsundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Användardatamapp"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Användardataundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Användarkörningsmapp"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Användarkörningsundermapp %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Filsystemsåtkomst till %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Hämtar flatpak-metadata för %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, 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:1051
+#, 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: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 ""
+"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: 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-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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s-konfigurationsuppdatering"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s-kamerauppdatering"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s TPM-uppdatering"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s-pekplatteuppdatering"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s-musuppdatering"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB-mottagaruppdatering"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Fast programvara"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Installera osignerad programvara?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Hämta osignerad programvara?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Uppdatera osignerad programvara?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Paket"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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"
+
+#~ 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 "system"
+#~ msgstr "system"
+
+#~ 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"
+
+#, c-format
+#~ msgid "%s %s"
+#~ msgstr "%s %s"
+
+#~ 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 "Reference"
+#~ msgstr "Referens"
+
+#~ 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 "https://en.wikipedia.org/wiki/Public_domain"
+#~ msgstr "https://sv.wikipedia.org/wiki/Public_domain"
+
+#~ msgid "https://www.gnu.org/philosophy/free-sw"
+#~ msgstr "https://www.gnu.org/philosophy/free-sw.sv"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Okänd programvarulicens"
+
+#~ 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 "Remove"
+#~ msgstr "Ta bort"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Inga ytterligare förråd"
+
+#~ msgid "_Enable"
+#~ msgstr "_Aktivera"
+
+#~ 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 "Navigation sidebar"
+#~ msgstr "Navigationssidfält"
+
+#~ 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 "%s %s Ready to be Installed"
+#~ msgstr "%s %s redo att bli installerat"
+
+#~ 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 "_Explore"
+#~ msgstr "_Utforska"
+
+#~ msgid "_Installed"
+#~ msgstr "_Installerat"
+
+#~ msgid "_Updates"
+#~ msgstr "_Uppdateringar"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Misslyckades med att spara fil"
+
+#~ 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 "App ID"
+#~ msgstr "Program-ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "Ta bort design"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Systemuppgradering"
+
+#~ 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 "Unable to purchase %s"
+#~ msgstr "Kunde inte köpa %s"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Jag har glömt mitt lösenord"
+
+#~ 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 "U_pdate All"
+#~ msgstr "U_ppdatera alla"
+
+#~ 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 "_Install All"
+#~ msgstr "_Installera alla"
+
+#~ 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 "web app"
+#~ msgstr "webbapplikation"
+
+#~ 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 "The update could not be completed."
+#~ msgstr "Uppdateringen kunde inte slutföras."
+
+#~ 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 "No sources found."
+#~ msgstr "Inga källor hittades."
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ 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 <mail2ipn@gmail.com>, 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 <mail2ipn@gmail.com>\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 <mail2ipn@gmail.com>, 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..5bb1938
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,2974 @@
+# 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 <knight2000@gmail.com>, 2013-2016.
+#
+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: 2016-04-25 14:21+0000\n"
+"PO-Revision-Date: 2016-05-23 15:38+0700\n"
+"Last-Translator: Akom Chotiphantawanon <knight2000@gmail.com>\n"
+"Language-Team: Thai <thai-l10n@googlegroups.com>\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: Gtranslator 2.91.6\n"
+
+#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:1
+msgid "GNOME Software"
+msgstr "\"ซอฟต์แวร์\" ของ GNOME"
+
+#: ../data/appdata/org.gnome.Software.appdata.xml.in.h:2
+msgid "Application manager for GNOME"
+msgstr "เครื่องมือจัดการโปรแกรมสำหรับ 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 ""
+"โปรแกรม \"ซอฟต์แวร์\" ของ GNOME จัดแสดงโปรแกรมที่เด่นและยอดนิยม "
+"พร้อมคำบรรยายที่เป็นประโยชน์และภาพหน้าจอหลายภาพต่อโปรแกรม "
+"คุณสามารถหาโปรแกรมผ่านการท่องดูตามหมวดหมู่หรือด้วยการค้นหาก็ได้ นอกจากนี้ "
+"ยังให้คุณปรับรุ่นระบบของคุณโดยใช้การปรับรุ่นแบบออฟไลน์ได้"
+
+#: ../data/org.gnome.software.gschema.xml.h:1
+msgid "A list of compatible projects"
+msgstr "รายชื่อของโครงการที่เข้ากันได้"
+
+#: ../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 "นี่คือรายชื่อของโครงการที่เข้ากันได้ที่เราควรแสดง เช่น GNOME, KDE และ XFCE"
+
+#: ../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 ""
+"ถ้าเปิดใช้ \"ซอฟต์แวร์\" ของ GNOME จะดาวน์โหลดรายการปรับรุ่นโดยอัตโนมัติในเบื้องหลัง "
+"และถามผู้ใช้เพื่อติดตั้งเมื่อพร้อมแล้ว"
+
+#: ../data/org.gnome.software.gschema.xml.h:5
+msgid "Whether it's the very first run of GNOME Software"
+msgstr "เป็นการเรียกทำงาน \"ซอฟต์แวร์\" ของ GNOME เป็นครั้งแรกหรือไม่"
+
+#: ../data/org.gnome.software.gschema.xml.h:6
+msgid "Show star ratings next to applications"
+msgstr "แสดงคะแนนดาวถัดจากโปรแกรม"
+
+#: ../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
+msgid "A list of popular applications"
+msgstr "รายชื่อโปรแกรมยอดนิยม"
+
+#: ../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
+msgid "The last update check timestamp"
+msgstr "เวลาที่ตรวจสอบการปรับรุ่นล่าสุด"
+
+#: ../data/org.gnome.software.gschema.xml.h:14
+msgid "The timestamp of the first security update, cleared after update"
+msgstr "เวลาของรายการปรับรุ่นความปลอดภัยรายการแรก ซึ่งจะล้างหลังจากที่ได้ปรับรุ่นแล้ว"
+
+#: ../data/org.gnome.software.gschema.xml.h:15
+msgid "The last update timestamp"
+msgstr "เวลาที่ปรับรุ่นครั้งล่าสุด"
+
+#: ../data/org.gnome.software.gschema.xml.h:16
+msgid "The server to use for application reviews"
+msgstr "เซิร์ฟเวอร์ที่จะใช้สำหรับอ่านบทวิจารณ์โปรแกรม"
+
+#: ../data/org.gnome.software.gschema.xml.h:17
+msgid "The minimum karma score for reviews"
+msgstr "คะแนนกิจกรรมต่ำสุดสำหรับบทวิจารณ์"
+
+#: ../data/org.gnome.software.gschema.xml.h:18
+msgid "Reviews with karma less than this number will not be shown."
+msgstr "บทวิจารณ์ที่มีกิจกรรมต่ำกว่าค่านี้จะไม่แสดง"
+
+#: ../data/org.gnome.software.gschema.xml.h:19
+msgid "A list of official sources that should not be considered 3rd party"
+msgstr "รายชื่อแหล่งที่เป็นทางการที่จะไม่ถือเป็นบุคคลที่สาม"
+
+#: ../src/gs-app-folder-dialog.ui.h:1
+msgid "Add to Application Folder"
+msgstr "เพิ่มเข้าโฟลเดอร์โปรแกรม"
+
+#: ../src/gs-app-folder-dialog.ui.h:2 ../src/gs-app-folder-dialog.c:316
+#: ../src/gs-review-dialog.ui.h:3 ../src/gs-shell-details.c:305
+#: ../src/gs-shell-installed.c:515 ../src/gs-upgrade-banner.ui.h:5
+msgid "_Cancel"
+msgstr "_ยกเลิก"
+
+#: ../src/gs-app-folder-dialog.ui.h:3 ../src/gs-app-folder-dialog.c:321
+msgid "_Add"
+msgstr "เ_พิ่ม"
+
+#. TRANSLATORS: this is the small blue label on the tile
+#. * that tells the user the application is installed
+#: ../src/gs-app-tile.ui.h:1 ../src/gs-app-addon-row.c:97
+#: ../src/gs-app-tile.c:78 ../src/gs-app-tile.c:81 ../src/gs-feature-tile.c:68
+#: ../src/gs-popular-tile.c:74 ../src/gs-popular-tile.c:77
+#: ../src/gs-popular-tile.ui.h:1
+msgid "Installed"
+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 "ไม่เลือก"
+
+#. 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:374
+#: ../src/gs-shell.c:253 ../src/org.gnome.Software.desktop.in.h:1
+msgid "Software"
+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 "_มีรุ่นใหม่"
+
+#. 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:266
+#: ../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:101 ../src/gs-app-row.c:304
+#: ../src/gs-app-tile.c:87 ../src/gs-app-tile.c:90
+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:105 ../src/gs-app-row.c:313
+#: ../src/gs-app-tile.c:96 ../src/gs-app-tile.c:99
+msgid "Removing"
+msgstr "กำลังถอดถอน"
+
+#. TRANSLATORS: This is how we join the licenses 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:1391 ../src/gs-shell-extras.c:145
+msgid " and "
+msgstr " และ "
+
+#. TRANSLATORS: This is how we join the licenses and can
+#. * be considered a "Disjunctive OR Operator" according
+#. * to the SPDX specification. For example:
+#. * "LGPL-2.1 or MIT"
+#: ../src/gs-app.c:1399
+msgid " or "
+msgstr " หรือ "
+
+#. TRANSLATORS: non-free app
+#: ../src/gs-app.c:1422
+msgid "Proprietary"
+msgstr "กรรมสิทธิ์"
+
+#. TRANSLATORS: see the wikipedia page
+#: ../src/gs-app.c:1432
+msgid "Public domain"
+msgstr "สาธารณสมบัติ"
+
+#: ../src/gs-app-folder-dialog.c:305
+msgid "Folder Name"
+msgstr "ชื่อโฟลเดอร์"
+
+#. TRANSLATORS: this is a command line option
+#: ../src/gs-application.c:97
+msgid "Start up mode: either ‘updates’, ‘updated’, ‘installed’ or ‘overview’"
+msgstr ""
+"โหมดเริ่มทำงาน: เป็นค่า ‘updates’ (รายการปรับรุ่น), ‘updated’ (รายการปรับรุ่นแล้ว), "
+"‘installed’ (รายการติดตั้งแล้ว) หรือ ‘overview’ (ภาพรวม) อย่างใดอย่างหนึ่ง"
+
+#: ../src/gs-application.c:97
+msgid "MODE"
+msgstr "โหมด"
+
+#: ../src/gs-application.c:99
+msgid "Search for applications"
+msgstr "ค้นหาโปรแกรม"
+
+#: ../src/gs-application.c:99
+msgid "SEARCH"
+msgstr "คำค้น"
+
+#: ../src/gs-application.c:101
+msgid "Show application details"
+msgstr "แสดงรายละเอียดของโปรแกรม"
+
+#: ../src/gs-application.c:101
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gs-application.c:103
+msgid "Open a local package file"
+msgstr "เปิดแฟ้มแพกเกจในเครื่อง"
+
+#: ../src/gs-application.c:103
+msgid "FILENAME"
+msgstr "ชื่อแฟ้ม"
+
+#: ../src/gs-application.c:105
+msgid "Show verbose debugging information"
+msgstr "แสดงข้อมูลดีบั๊กโดยละเอียด"
+
+#: ../src/gs-application.c:107
+msgid "Show profiling information for the service"
+msgstr "แสดงข้อมูลการวัดประสิทธิภาพของบริการ"
+
+#: ../src/gs-application.c:109
+msgid "Prefer local file sources to AppStream"
+msgstr "พยายามใช้แหล่งแฟ้มในเครื่องก่อนใช้ AppStream"
+
+#: ../src/gs-application.c:111
+msgid "Show version number"
+msgstr "แสดงเลขรุ่น"
+
+#: ../src/gs-application.c:367
+msgid "translator-credits"
+msgstr "Akom Chotiphantawanon"
+
+#. TRANSLATORS: this is the title of the about window
+#: ../src/gs-application.c:371
+msgid "About Software"
+msgstr "เกี่ยวกับ \"ซอฟต์แวร์\""
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: ../src/gs-application.c:377
+msgid "A nice way to manage the software on your system."
+msgstr "วิธีที่ดีในการจัดการซอฟต์แวร์ในระบบของคุณ"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: ../src/gs-app-row.c:152
+msgid "Device cannot be used during update."
+msgstr "อุปกรณ์ไม่สามารถใช้งานได้ในระหว่างปรับรุ่น"
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * allows the application to be easily installed
+#: ../src/gs-app-row.c:250
+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:255
+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:263
+msgid "Cancel"
+msgstr "ยกเลิก"
+
+#. 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: this is button text to update the firware
+#. TRANSLATORS: button text
+#: ../src/gs-app-row.c:273 ../src/gs-app-row.c:280 ../src/gs-page.c:282
+#: ../src/gs-utils.c:348
+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:284 ../src/gs-app-row.c:295 ../src/gs-page.c:350
+msgid "Remove"
+msgstr "ถอดถอน"
+
+#. vim: set noexpandtab:
+#. This is shown in the search result row as a tag
+#: ../src/gs-app-row.ui.h:2 ../src/gs-shell-details.ui.h:31
+msgid "3rd party"
+msgstr "บุคคลที่ 3"
+
+#. This is shown in the search result row as a tag
+#: ../src/gs-app-row.ui.h:4 ../src/gs-shell-details.ui.h:32
+msgid "web app"
+msgstr "โปรแกรมบนเว็บ"
+
+#. This is shown in the search result row as a tag
+#: ../src/gs-app-row.ui.h:6
+msgid "nonfree"
+msgstr "ไม่เสรี"
+
+#. TRANSLATORS: this is where all applications that don't
+#. * fit in other groups are put
+#: ../src/gs-category.c:235
+msgid "Other"
+msgstr "อื่นๆ"
+
+#. TRANSLATORS: this is a subcategory matching all the
+#. * different apps in the parent category, e.g. "Games"
+#: ../src/gs-category.c:239
+msgid "All"
+msgstr "ทั้งหมด"
+
+#. TRANSLATORS: this is a subcategory of featured apps
+#: ../src/gs-category.c:242
+msgid "Featured"
+msgstr "เด่น"
+
+#. 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 "มีโปรแกรมหนึ่ง"
+
+#. 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 "%s ร้องขอการรองรับฟอร์แมตแฟ้มเพิ่มเติม"
+
+#. TRANSLATORS: notification title
+#: ../src/gs-dbus-helper.c:315
+msgid "Additional MIME Types Required"
+msgstr "ต้องการชนิด MIME เพิ่มเติม"
+
+#. 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 "%s ร้องขอแบบอักษรเพิ่มเติม"
+
+#. 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 "%s ร้องขอตัวอ่าน-ลงรหัสสื่อผสมเพิ่มเติม"
+
+#. 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 "%s ร้องขอไดรเวอร์เครื่องพิมพ์เพิ่มเติม"
+
+#. 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 "%s ร้องขอแพกเกจเพิ่มเติม"
+
+#. 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 "ยินดีต้อนรับ"
+
+#: ../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 "ไ_ปช็อปกันเลย"
+
+#. 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: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 "ไม่ทราบ"
+
+#. vim: set noexpandtab:
+#: ../src/gs-history-dialog.ui.h:1
+msgid "History"
+msgstr "ประวัติ"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: ../src/gs-page.c:276
+#, c-format
+msgid "Prepare %s"
+msgstr "เตรียม %s"
+
+#. TRANSLATORS: this is a prompt message, and
+#. * '%s' is an application summary, e.g. 'GNOME Clocks'
+#: ../src/gs-page.c:341
+#, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr "คุณแน่ใจหรือไม่ว่าต้องการถอดถอน %s?"
+
+#. TRANSLATORS: longer dialog text
+#: ../src/gs-page.c:346
+#, c-format
+msgid "%s will be removed, and you will have to install it to use it again."
+msgstr "%s จะถูกถอดถอน และคุณจะต้องติดตั้งโปรแกรมดังกล่าวใหม่หากต้องการใช้งานอีกครั้ง"
+
+#. TRANSLATORS: this is a group of updates that are not
+#. * packages and are not shown in the main list
+#: ../src/gs-plugin-loader.c:675
+msgid "OS Updates"
+msgstr "ปรับรุ่น OS"
+
+#. TRANSLATORS: this is a longer description of the
+#. * "OS Updates" string
+#: ../src/gs-plugin-loader.c:680
+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:1387 ../src/gs-shell-extras.c:386
+#, c-format
+msgid "No addon codecs are available for the %s format."
+msgstr "ไม่มีส่วนเสริมของตัวอ่าน-ลงรหัสสำหรับรูปแบบ %s"
+
+#: ../src/gs-plugin-loader.c:1390
+#, 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: lighthearted star rating description;
+#. * A really bad application
+#: ../src/gs-review-dialog.c:93
+msgid "Hate it"
+msgstr "เกลียด"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: ../src/gs-review-dialog.c:97
+msgid "Don't like it"
+msgstr "ไม่ชอบ"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: ../src/gs-review-dialog.c:101
+msgid "It's OK"
+msgstr "ใช้ได้"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: ../src/gs-review-dialog.c:105
+msgid "Like it"
+msgstr "ชอบ"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: ../src/gs-review-dialog.c:109
+msgid "Love it"
+msgstr "โปรดปราน"
+
+#. TRANSLATORS: the review can't just be copied and pasted
+#: ../src/gs-review-dialog.c:131
+msgid "Please take more time writing the review"
+msgstr "กรุณาใช้เวลาเขียนบทวิจารณ์มากกว่านี้"
+
+#. TRANSLATORS: the review is not acceptable
+#: ../src/gs-review-dialog.c:135
+msgid "Please choose a star rating"
+msgstr "กรุณาเลือกคะแนนดาว"
+
+#. TRANSLATORS: the review is not acceptable
+#: ../src/gs-review-dialog.c:139
+msgid "The summary is too short"
+msgstr "สรุปสั้นเกินไป"
+
+#. TRANSLATORS: the review is not acceptable
+#: ../src/gs-review-dialog.c:143
+msgid "The summary is too long"
+msgstr "สรุปยาวเกินไป"
+
+#. TRANSLATORS: the review is not acceptable
+#: ../src/gs-review-dialog.c:147
+msgid "The description is too short"
+msgstr "คำบรรยายสั้นเกินไป"
+
+#. TRANSLATORS: the review is not acceptable
+#: ../src/gs-review-dialog.c:151
+msgid "The description is too long"
+msgstr "คำบรรยายยาวเกินไป"
+
+#. 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 "แปะประกาศบทวิจารณ์"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: ../src/gs-review-dialog.ui.h:5
+msgid "_Post"
+msgstr "แ_ปะประกาศ"
+
+#: ../src/gs-review-dialog.ui.h:6
+msgid "Rating"
+msgstr "ให้คะแนน"
+
+#: ../src/gs-review-dialog.ui.h:7
+msgid "Summary"
+msgstr "สรุป"
+
+#: ../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 "บทวิจารณ์"
+
+#: ../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 "ทั้งหมด"
+
+#. TRANSLATORS: we explain what the action is going to do
+#: ../src/gs-review-row.c:207
+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:212
+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:226
+msgid "Report Review?"
+msgstr "รายงานบทวิจารณ์หรือไม่?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: ../src/gs-review-row.c:230
+msgid "Report"
+msgstr "รายงาน"
+
+#. 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 "บทวิจารณ์นี้เป็นประโยชน์กับคุณหรือไม่?"
+
+#: ../src/gs-review-row.ui.h:3
+msgid "Yes"
+msgstr "มี"
+
+#: ../src/gs-review-row.ui.h:4
+msgid "No"
+msgstr "ไม่มี"
+
+#. 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 "รายงาน…"
+
+#: ../src/gs-review-row.ui.h:8
+msgid "Remove…"
+msgstr "ลบออก…"
+
+#. TRANSLATORS: this is when we try to download a screenshot and
+#. * we get back 404
+#: ../src/gs-screenshot-image.c:232
+msgid "Screenshot not found"
+msgstr "ไม่พบภาพหน้าจอ"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: ../src/gs-screenshot-image.c:248
+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:379
+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:405
+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:433
+msgid "Screenshot not valid"
+msgstr "ภาพหน้าจอไม่ถูกต้อง"
+
+#. TRANSLATORS: this is when networking is not available
+#: ../src/gs-screenshot-image.c:449
+msgid "Screenshot not available"
+msgstr "ไม่มีภาพหน้าจอ"
+
+#: ../src/gs-screenshot-image.c:500
+msgid "Screenshot"
+msgstr "ภาพหน้าจอ"
+
+#. vim: set noexpandtab:
+#: ../src/gs-shell-category.ui.h:1
+msgid ""
+"Extensions are used at your own risk. If you have any system problems, it is "
+"recommended to disable them."
+msgstr ""
+"คุณต้องรับความเสียงเองเมื่อใช้ส่วนขยายต่างๆ ถ้าคุณมีปัญหาใดๆ กับระบบ ขอแนะนำให้ปิดส่วนขยายต่างๆ"
+
+#: ../src/gs-shell-category.ui.h:2
+msgid "Extension Settings"
+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: button text in the header when an application
+#. * can be live-updated
+#: ../src/gs-shell-details.c:201 ../src/gs-shell-details.c:227
+#: ../src/gs-shell-details.c:232 ../src/gs-shell-details.ui.h:2
+#: ../src/gs-upgrade-banner.ui.h:6
+msgid "_Install"
+msgstr "_ติดตั้ง"
+
+#. TRANSLATORS: button text in the header when an application
+#. * is in the process of being installed
+#: ../src/gs-shell-details.c:212
+msgid "_Installing"
+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-shell-details.c:245
+msgid "_Install…"
+msgstr "_ติดตั้ง…"
+
+#. TRANSLATORS: button text in the header when an application can be erased
+#: ../src/gs-shell-details.c:292 ../src/gs-shell-details.ui.h:3
+msgid "_Remove"
+msgstr "_ถอดถอน"
+
+#. TRANSLATORS: button text in the header when an application can be installed
+#: ../src/gs-shell-details.c:299
+msgid "_Removing"
+msgstr "กำลัง_ถอดถอน"
+
+#. TRANSLATORS: this is where the license is not known
+#: ../src/gs-shell-details.c:669
+msgctxt "license"
+msgid "Unknown"
+msgstr "ไม่ทราบ"
+
+#. TRANSLATORS: this is where the version is not known
+#: ../src/gs-shell-details.c:682
+msgctxt "version"
+msgid "Unknown"
+msgstr "ไม่ทราบ"
+
+#. TRANSLATORS: this is where the size is being worked out
+#: ../src/gs-shell-details.c:688
+msgctxt "size"
+msgid "Calculating…"
+msgstr "กำลังคำนวณ…"
+
+#. TRANSLATORS: this is where the size is not known
+#: ../src/gs-shell-details.c:691
+msgctxt "size"
+msgid "Unknown"
+msgstr "ไม่ทราบ"
+
+#. TRANSLATORS: this is where the updated date is not known
+#: ../src/gs-shell-details.c:703
+msgctxt "updated"
+msgid "Never"
+msgstr "ไม่เคย"
+
+#. TRANSLATORS: this is the application isn't in any
+#. * defined menu category
+#: ../src/gs-shell-details.c:717
+msgctxt "menu category"
+msgid "None"
+msgstr "ไม่มี"
+
+#. TRANSLATORS: this is where we don't know the origin of the
+#. * application
+#: ../src/gs-shell-details.c:734
+msgctxt "origin"
+msgid "Unknown"
+msgstr "ไม่ทราบ"
+
+#. TRANSLATORS: this is the warning box
+#: ../src/gs-shell-details.c:780
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr "โปรแกรมนี้สามารถใช้งานได้เมื่อมีการเชื่อมต่ออินเทอร์เน็ตเท่านั้น"
+
+#. TRANSLATORS: this is the warning box
+#: ../src/gs-shell-details.c:791
+msgid "This software comes from a 3rd party."
+msgstr "ซอฟต์แวร์นี้มาจากบุคคลที่ 3"
+
+#. TRANSLATORS: this is the warning box
+#: ../src/gs-shell-details.c:800
+msgid ""
+"This software comes from a 3rd party and may contain non-free components."
+msgstr "ซอฟต์แวร์นี้มาจากบุคคลที่ 3 และอาจมีองค์ประกอบที่ไม่เสรี"
+
+#. TRANSLATORS: this is the warning box
+#: ../src/gs-shell-details.c:809
+msgid "This software may contain non-free components."
+msgstr "ซอฟต์แวร์นี้อาจมีองค์ประกอบที่ไม่เสรี"
+
+#: ../src/gs-shell-details.c:1135
+#, c-format
+msgid "Could not find '%s'"
+msgstr "หา '%s' ไม่พบ"
+
+#. TRANSLATORS: install or removed failed
+#: ../src/gs-shell-details.c:1195 ../src/gs-utils.c:168
+msgid "Sorry, this did not work"
+msgstr "ขออภัย ทำงานล้มเหลว"
+
+#. vim: set noexpandtab:
+#: ../src/gs-shell-details.ui.h:1
+msgid "Details page"
+msgstr "หน้ารายละเอียด"
+
+#. Translators: A label for a button to execute the selected application.
+#: ../src/gs-shell-details.ui.h:6
+msgid "_Launch"
+msgstr "เ_รียกทำงาน"
+
+#: ../src/gs-shell-details.ui.h:7
+msgid "Software Source Included"
+msgstr "มีแหล่งซอฟต์แวร์"
+
+#: ../src/gs-shell-details.ui.h:8
+msgid ""
+"This application includes a software source which provides updates, as well "
+"as access to other software."
+msgstr ""
+"โปรแกรมนี้มีแหล่งซอฟต์แวร์ ซึ่งมีการจัดเตรียมรายการปรับรุ่น และสามารถเข้าถึงซอฟต์แวร์อื่นๆ ได้"
+
+#: ../src/gs-shell-details.ui.h:9
+msgid "No Software Source Included"
+msgstr "ไม่มีแหล่งซอฟต์แวร์"
+
+#: ../src/gs-shell-details.ui.h:10
+msgid ""
+"This application does not include a software source. It will not be updated "
+"with new versions."
+msgstr "โปรแกรมนี้ไม่มีแหล่งซอฟต์แวร์ จะไม่มีการปรับรุ่นเป็นรุ่นใหม่"
+
+#: ../src/gs-shell-details.ui.h:11
+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:13
+msgid "Software Source Identified"
+msgstr "แหล่งซอฟต์แวร์ที่ระบุที่มา"
+
+#: ../src/gs-shell-details.ui.h:14
+msgid ""
+"Adding this software source will give you access to additional software and "
+"upgrades."
+msgstr "การเพิ่มแหล่งซอฟต์แวร์นี้จะให้คุณเข้าถึงซอฟต์แวร์และการปรับรุ่นเพิ่มเติมได้"
+
+#: ../src/gs-shell-details.ui.h:15
+msgid "Only use software sources that you trust."
+msgstr "ใช้แหล่งซอฟต์แวร์ที่คุณเชื่อถือเท่านั้น"
+
+#: ../src/gs-shell-details.ui.h:16
+msgid "_Website"
+msgstr "เ_ว็บไซต์"
+
+#: ../src/gs-shell-details.ui.h:17
+msgid "_History"
+msgstr "_ประวัติ"
+
+#: ../src/gs-shell-details.ui.h:18 ../src/gs-update-monitor.c:561
+msgid "Details"
+msgstr "รายละเอียด"
+
+#: ../src/gs-shell-details.ui.h:19
+msgid "Localized in your Language"
+msgstr "มีการแปลเป็นภาษาของคุณ"
+
+#: ../src/gs-shell-details.ui.h:20
+msgid "Documentation"
+msgstr "เอกสาร"
+
+#: ../src/gs-shell-details.ui.h:21
+msgid "Release Activity"
+msgstr "รุ่นที่เคลื่อนไหว"
+
+#: ../src/gs-shell-details.ui.h:22
+msgid "System Integration"
+msgstr "การเชื่อมรวมระบบ"
+
+#: ../src/gs-shell-details.ui.h:23 ../src/gs-sources-dialog.ui.h:8
+msgid "Version"
+msgstr "รุ่น"
+
+#: ../src/gs-shell-details.ui.h:24
+msgid "Updated"
+msgstr "ปรับรุ่นแล้ว"
+
+#: ../src/gs-shell-details.ui.h:25
+msgid "Category"
+msgstr "หมวด"
+
+#: ../src/gs-shell-details.ui.h:26
+msgid "Size"
+msgstr "ขนาด"
+
+#: ../src/gs-shell-details.ui.h:27
+msgid "Source"
+msgstr "แหล่ง"
+
+#: ../src/gs-shell-details.ui.h:28
+msgid "Developer"
+msgstr "ผู้พัฒนา"
+
+#: ../src/gs-shell-details.ui.h:29
+msgid "License"
+msgstr "สัญญาอนุญาต"
+
+#: ../src/gs-shell-details.ui.h:30
+msgid "non-free"
+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:33 ../src/gs-shell-installed.c:433
+#: ../src/gs-update-list.c:129 ../src/plugins/menu-spec-common.c:210
+msgid "Add-ons"
+msgstr "ส่วนเสริม"
+
+#: ../src/gs-shell-details.ui.h:34
+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:36
+msgid "Reviews"
+msgstr "บทวิจารณ์"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: ../src/gs-shell-details.ui.h:38
+msgid "_Write a Review"
+msgstr "เ_ขียนบทวิจารณ์"
+
+#. Translators: Button to return more application-submitted reviews.
+#: ../src/gs-shell-details.ui.h:40
+msgid "_Show More"
+msgstr "แ_สดงเพิ่มเติม"
+
+#. 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] "แบบอักษรที่มีสำหรับอักษร %s"
+
+#. 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] "ซอฟต์แวร์ที่มีสำหรับ %s"
+
+#: ../src/gs-shell-extras.c:224
+msgid "Unable to Find Requested Software"
+msgstr "ไม่สามารถหาซอฟต์แวร์ที่ร้องขอ"
+
+#. 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"
+
+#. 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 "ไม่มีโปรแกรมที่จัดเตรียมแฟ้ม %s"
+
+#. 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 "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับโปรแกรมที่ขาดได้ %s"
+
+#. 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
+#, 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-shell-extras.c:353
+#, 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-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 ""
+"อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับโปรแกรมที่สามารถรองรับฟอร์แมตนี้ได้ %s"
+
+#. 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 "ไม่มีแบบอักษรสำหรับรองรับอักษร %s"
+
+#. 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 "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับแบบอักษรเพิ่มเติมได้ %s"
+
+#. 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 ""
+"อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับตัวอ่าน-ลงรหัสที่สามารถเล่นฟอร์แมตนี้ได้ %s"
+
+#. 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 "ไม่มีทรัพยากรพลาสมาสำหรับรองรับ %s"
+
+#. 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 "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับทรัพยากรพลาสมาเพิ่มเติมได้ %s"
+
+#. 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
+#, 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-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 "อ่านข้อมูลเกี่ยวกับ %s รวมทั้งตัวเลือกต่างๆ สำหรับการรับไดรเวอร์ที่รองรับเครื่องพิมพ์นี้ได้ %s"
+
+#: ../src/gs-shell-extras.c:458
+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:462
+#, 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"
+
+#: ../src/gs-shell-extras.c:542 ../src/gs-shell-extras.c:590
+#: ../src/gs-shell-extras.c:640
+msgid "Failed to find any search results"
+msgstr "ไม่พบผลการค้นหาใดๆ"
+
+#: ../src/gs-shell-extras.c:809
+#, c-format
+msgid "%s file format"
+msgstr "ฟอร์แมตแฟ้ม %s"
+
+#. vim: set noexpandtab:
+#: ../src/gs-shell-extras.ui.h:1
+msgid "Codecs page"
+msgstr "หน้าของตัวอ่าน-ลงรหัส"
+
+#. TRANSLATORS: This is the header dividing the normal
+#. * applications and the system ones
+#: ../src/gs-shell-installed.c:423
+msgid "System Applications"
+msgstr "โปรแกรมระบบ"
+
+#: ../src/gs-shell-installed.c:523
+msgid "Click on items to select them"
+msgstr "คลิกที่รายการที่จะเลือก"
+
+#: ../src/gs-shell-installed.c:714
+msgid "Select"
+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 "_ลบออกจากโฟลเดอร์"
+
+#: ../src/gs-shell-moderate.ui.h:1
+msgid "Moderate page"
+msgstr "กลั่นกรองเนื้อหา"
+
+#: ../src/gs-shell-moderate.ui.h:2
+msgid "There are no reviews to moderate"
+msgstr "ไม่มีบทวิจารณ์ที่จะกลั่นกรอง"
+
+#. TRANSLATORS: this is a heading for audio applications which have been featured ('recommended') by the distribution
+#: ../src/gs-shell-overview.c:367
+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:372
+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:377
+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:382
+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:201
+msgid "%R"
+msgstr "%R"
+
+#. TRANSLATORS: Time in 12h format
+#: ../src/gs-shell-updates.c:204
+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:210
+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:214
+msgid "Yesterday, %l:%M %p"
+msgstr "เมื่อวาน %l:%M %p"
+
+#: ../src/gs-shell-updates.c:217
+msgid "Two days ago"
+msgstr "สองวันก่อน"
+
+#: ../src/gs-shell-updates.c:219
+msgid "Three days ago"
+msgstr "สามวันก่อน"
+
+#: ../src/gs-shell-updates.c:221
+msgid "Four days ago"
+msgstr "สี่วันก่อน"
+
+#: ../src/gs-shell-updates.c:223
+msgid "Five days ago"
+msgstr "ห้าวันก่อน"
+
+#: ../src/gs-shell-updates.c:225
+msgid "Six days ago"
+msgstr "หกวันก่อน"
+
+#: ../src/gs-shell-updates.c:227
+msgid "One week ago"
+msgstr "หนึ่งสัปดาห์ที่แล้ว"
+
+#: ../src/gs-shell-updates.c:229
+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:233
+msgid "%e %B %Y"
+msgstr "%e %B %Ey"
+
+#. TRANSLATORS: the updates are being downloaded
+#: ../src/gs-shell-updates.c:249
+msgid "Downloading new updates…"
+msgstr "กำลังดาวน์โหลดการปรับรุ่นรายการใหม่…"
+
+#. TRANSLATORS: the update panel is doing *something* vague
+#: ../src/gs-shell-updates.c:253
+msgid "Looking for new updates…"
+msgstr "กำลังค้นหารายการปรับรุ่นใหม่…"
+
+#. TRANSLATORS: the updates panel is starting up
+#: ../src/gs-shell-updates.c:296
+msgid "Setting up updates…"
+msgstr "กำลังตั้งค่ารายการปรับรุ่น…"
+
+#. TRANSLATORS: the updates panel is starting up
+#: ../src/gs-shell-updates.c:297 ../src/gs-shell-updates.c:304
+msgid "(This could take a while)"
+msgstr "(อาจใช้เวลาสักครู่)"
+
+#. TRANSLATORS: This is the time when we last checked for updates
+#: ../src/gs-shell-updates.c:434
+#, c-format
+msgid "Last checked: %s"
+msgstr "ตรวจสอบล่าสุด: %s"
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: ../src/gs-shell-updates.c:849
+msgid "Charges may apply"
+msgstr "อาจมีค่าใช้จ่าย"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: ../src/gs-shell-updates.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-shell-updates.c:857
+msgid "Check Anyway"
+msgstr "ตรวจสอบต่อไป"
+
+#. TRANSLATORS: can't do updates check
+#: ../src/gs-shell-updates.c:873
+msgid "No Network"
+msgstr "ไม่มีเครือข่าย"
+
+#. TRANSLATORS: we need network
+#. * to do the updates check
+#: ../src/gs-shell-updates.c:877
+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:881
+msgid "Network Settings"
+msgstr "ตั้งค่าเครือข่าย"
+
+#: ../src/gs-shell-updates.c:1256
+msgid "Restart & _Install"
+msgstr "เริ่มใหม่และ_ติดตั้ง"
+
+#: ../src/gs-shell-updates.c:1274
+msgid "Check for updates"
+msgstr "ตรวจสอบการปรับรุ่น"
+
+#. vim: set noexpandtab:
+#: ../src/gs-shell-updates.ui.h:1
+msgid "Updates page"
+msgstr "หน้ารายการปรับรุ่น"
+
+#: ../src/gs-shell-updates.ui.h:2
+msgid "Other Updates"
+msgstr "รายการปรับรุ่นอื่นๆ"
+
+#: ../src/gs-shell-updates.ui.h:3
+msgid "Software is up to date"
+msgstr "ซอฟต์แวร์เป็นรุ่นล่าสุดแล้ว"
+
+#: ../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
+msgid "_Check Anyway"
+msgstr "_ตรวจสอบต่อไป"
+
+#: ../src/gs-shell-updates.ui.h:6
+msgid "Go online to check for updates"
+msgstr "ออนไลน์เพื่อตรวจสอบการปรับรุ่น"
+
+#: ../src/gs-shell-updates.ui.h:7
+msgid "_Network Settings"
+msgstr "ตั้งค่าเ_ครือข่าย"
+
+#: ../src/gs-shell-updates.ui.h:8
+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:94
+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:98
+#, c-format
+msgid "%i application installed"
+msgid_plural "%i applications installed"
+msgstr[0] "มีโปรแกรมติดตั้งไว้ %i รายการ"
+
+#. TRANSLATORS: This string is used to construct the 'X add-ons
+#. installed' sentence, describing a software source.
+#: ../src/gs-sources-dialog.c:104
+#, c-format
+msgid "%i add-on installed"
+msgid_plural "%i add-ons installed"
+msgstr[0] "มีส่วนเสริมติดตั้งไว้ %i รายการ"
+
+#. 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:111
+#, c-format
+msgid "%i application"
+msgid_plural "%i applications"
+msgstr[0] "โปรแกรม %i รายการ"
+
+#. 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:117
+#, c-format
+msgid "%i add-on"
+msgid_plural "%i add-ons"
+msgstr[0] "ส่วนเสริม %i รายการ"
+
+#. 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:124
+#, c-format
+msgid "%s and %s installed"
+msgid_plural "%s and %s installed"
+msgstr[0] "ติดตั้ง %s และ %s เสร็จแล้ว"
+
+#: ../src/gs-sources-dialog.c:322 ../src/gs-sources-dialog.ui.h:12
+msgid "Remove Source"
+msgstr "ลบแหล่ง"
+
+#: ../src/gs-sources-dialog.c:336
+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:402
+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:473
+#, 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"
+
+#. 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 "เว็บไซต์"
+
+#: ../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 where the packager did not write
+#. * a description for the update
+#: ../src/gs-update-dialog.c:121
+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:215
+#, c-format
+msgid "Installed on %s"
+msgstr "ติดตั้งเมื่อ %s"
+
+#. TRANSLATORS: this is the title of the installed updates dialog window
+#: ../src/gs-update-dialog.c:235
+msgid "Installed Updates"
+msgstr "รายการปรับรุ่นที่ติดตั้งแล้ว"
+
+#: ../src/gs-update-dialog.ui.h:2
+msgid "No updates have been installed on this system."
+msgstr "ไม่มีการติดตั้งรายการปรับรุ่นในระบบนี้"
+
+#: ../src/gs-update-monitor.c:89
+msgid "Security Updates Pending"
+msgstr "มีรายการปรับรุ่นด้านความปลอดภัยรออยู่"
+
+#: ../src/gs-update-monitor.c:90
+msgid "It is recommended that you install important updates now"
+msgstr "ขอแนะนำให้คุณติดตั้งรายการปรับรุ่นที่สำคัญเดี๋ยวนี้"
+
+#: ../src/gs-update-monitor.c:93
+msgid "Restart & Install"
+msgstr "เริ่มใหม่และติดตั้ง"
+
+#: ../src/gs-update-monitor.c:97
+msgid "Software Updates Available"
+msgstr "มีรายการปรับรุ่นซอฟต์แวร์"
+
+#: ../src/gs-update-monitor.c:98
+msgid "Important OS and application updates are ready to be installed"
+msgstr "การปรับรุ่นที่สำคัญของ OS และโปรแกรมต่างๆ พร้อมที่จะติดตั้งแล้ว"
+
+#: ../src/gs-update-monitor.c:101
+msgid "Not Now"
+msgstr "ไม่ตอนนี้"
+
+#: ../src/gs-update-monitor.c:102
+msgid "View"
+msgstr "ดู"
+
+#. TRANSLATORS: this is a distro upgrade, the replacement would be the
+#. * distro name, e.g. 'Fedora'
+#: ../src/gs-update-monitor.c:234
+#, 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:238
+msgid "Software Upgrade Available"
+msgstr "มีรายการปรับรุ่นซอฟต์แวร์"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: ../src/gs-update-monitor.c:433
+msgid "Software Updates Failed"
+msgstr "ปรับรุ่นซอฟต์แวร์ไม่สำเร็จ"
+
+#. TRANSLATORS: message when we offline updates have failed
+#: ../src/gs-update-monitor.c:435
+msgid "An important OS update failed to be installed."
+msgstr "ติดตั้งรายการปรับรุ่นที่สำคัญของ OS ไม่สำเร็จ"
+
+#. TRANSLATORS: this is an expander title
+#: ../src/gs-update-monitor.c:437 ../src/gs-utils.c:209
+msgid "Show Details"
+msgstr "แสดงรายละเอียด"
+
+#. TRANSLATORS: title when we've done offline updates
+#: ../src/gs-update-monitor.c:452
+msgid "Software Update Installed"
+msgid_plural "Software Updates Installed"
+msgstr[0] "ติดตั้งรายการปรับรุ่นซอฟต์แวร์แล้ว"
+
+#. TRANSLATORS: message when we've done offline updates
+#: ../src/gs-update-monitor.c:456
+msgid "An important OS update has been installed."
+msgid_plural "Important OS updates have been installed."
+msgstr[0] "ติดตั้งรายการปรับรุ่นที่สำคัญของ 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:467
+msgctxt "updates"
+msgid "Review"
+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-update-monitor.c:542
+msgid "Detailed errors from the package manager follow:"
+msgstr "รายละเอียดข้อผิดพลาดจากโปรแกรมจัดการแพกเกจคือ:"
+
+#. TRANSLATORS: this is when the offline update failed
+#: ../src/gs-update-monitor.c:603
+msgid "Failed To Update"
+msgstr "ปรับรุ่นไม่สำเร็จ"
+
+#. TRANSLATORS: the user must have updated manually after
+#. * the updates were prepared
+#: ../src/gs-update-monitor.c:609
+msgid "The system was already up to date."
+msgstr "ระบบเป็นรุ่นใหม่ล่าสุดแล้ว"
+
+#. TRANSLATORS: the user aborted the update manually
+#: ../src/gs-update-monitor.c:614
+msgid "The update was cancelled."
+msgstr "การปรับรุ่นถูกยกเลิก"
+
+#. TRANSLATORS: the package manager needed to download
+#. * something with no network available
+#: ../src/gs-update-monitor.c:620
+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:626
+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:632
+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:637
+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 มีให้ติดตั้งแล้ว"
+
+#. 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 "กำลังดาวน์โหลด %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
+#, c-format
+msgid "%s %s Ready to be Installed"
+msgstr "%s %s พร้อมสำหรับติดตั้งแล้ว"
+
+#. vim: set noexpandtab:
+#: ../src/gs-upgrade-banner.ui.h:1
+msgid "A major upgrade, with new features and added polish."
+msgstr "การปรับรุ่นใหญ่ พร้อมความสามารถใหม่และรายการปรับปรุงเพิ่มเติม"
+
+#: ../src/gs-upgrade-banner.ui.h:2
+msgid "_Learn More"
+msgstr "เ_รียนรู้เพิ่มเติม"
+
+#: ../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 "_ดาวน์โหลด"
+
+#. TRANSLATORS: this is the summary of a notification that an application
+#. * has been successfully installed
+#: ../src/gs-utils.c:140
+#, c-format
+msgid "%s is now installed"
+msgstr "%s ติดตั้งเสร็จแล้ว"
+
+#. TRANSLATORS: this is button that opens the newly installed application
+#: ../src/gs-utils.c:144
+msgid "Launch"
+msgstr "เรียกทำงาน"
+
+#. TRANSLATORS: this is when the install fails
+#: ../src/gs-utils.c:176
+#, c-format
+msgid "Installation of %s failed."
+msgstr "ติดตั้ง %s ไม่สำเร็จ"
+
+#. TRANSLATORS: this is when the remove fails
+#: ../src/gs-utils.c:181
+#, c-format
+msgid "Removal of %s failed."
+msgstr "ถอดถอน %s ไม่สำเร็จ"
+
+#. TRANSLATORS: window title
+#: ../src/gs-utils.c:279
+msgid "Install Third-Party Software?"
+msgstr "ติดตั้งซอฟต์แวร์ของบุคคลที่สามหรือไม่?"
+
+#. TRANSLATORS: window title
+#: ../src/gs-utils.c:283
+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:301
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s ไม่ใช่ <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">ซอฟต์แวร์เสรีและโอเพนซอร์ส</a> และจัดเตรียมโดย “%s”"
+
+#. TRANSLATORS: the replacements are as follows:
+#. * 1. Application name, e.g. "Firefox"
+#. * 2. Software source name, e.g. fedora-optional
+#: ../src/gs-utils.c:311
+#, c-format
+msgid "%s is provided by “%s”."
+msgstr "%s จัดเตรียมโดย “%s”"
+
+#. TRANSLATORS: a software source is a repo
+#: ../src/gs-utils.c:321
+msgid "This software source must be enabled to continue installation."
+msgstr "แหล่งซอฟต์แวร์นี้ต้องเปิดใช้ก่อนที่จะติดตั้งต่อไป"
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: ../src/gs-utils.c:331
+#, c-format
+msgid "It may be illegal to install or use %s in some countries."
+msgstr "อาจจะผิดกฎหมายที่จะติดตั้งหรือใช้ %s ในบางประเทศ"
+
+#. TRANSLATORS: Laws are geographical, urgh...
+#: ../src/gs-utils.c:337
+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:344
+msgid "Don't Warn Again"
+msgstr "ไม่ต้องเตือนอีก"
+
+#. TRANSLATORS: button text
+#: ../src/gs-utils.c:353
+msgid "Enable and Install"
+msgstr "เปิดใช้และติดตั้ง"
+
+#. vim: set noexpandtab:
+#: ../src/gs-menus.ui.h:1
+msgid "_Software Sources"
+msgstr "แ_หล่งซอฟต์แวร์"
+
+#: ../src/gs-menus.ui.h:2
+msgid "_About"
+msgstr "เ_กี่ยวกับ"
+
+#: ../src/gs-menus.ui.h:3
+msgid "_Quit"
+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 ""
+"ปรับรุ่น;แหล่งซอฟต์แวร์;คลังแพกเกจ;ปรับแต่ง;ติดตั้ง;ถอดถอน;โปรแกรม;ซอฟต์แวร์;แอ็ป;ร้าน;"
+
+#. 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 "ชุดเครื่องมือพัฒนาเบ็ดเสร็จ"
+
+#: ../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 "กราฟิกส์ 2 มิติ"
+
+#: ../src/plugins/menu-spec-common.c:105
+msgctxt "Menu subcategory of Graphics"
+msgid "3D Graphics"
+msgstr "กราฟิกส์ 3 มิติ"
+
+#: ../src/plugins/menu-spec-common.c:106
+msgctxt "Menu subcategory of Graphics"
+msgid "OCR"
+msgstr "เครื่องอ่านอักขระด้วยแสง"
+
+#: ../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/plugins/menu-spec-common.c:215
+msgctxt "Menu subcategory of Add-ons"
+msgid "Shell Extensions"
+msgstr "ส่วนขยายของเชลล์"
+
+#: ../src/plugins/menu-spec-common.c:216
+msgctxt "Menu subcategory of Add-ons"
+msgid "Localization"
+msgstr "การปรับให้เข้ากับท้องถิ่น"
+
+#~ msgid "No AppStream data found"
+#~ msgstr "ไม่พบข้อมูล AppStream"
+
+#~ msgid "Update"
+#~ 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 "Checking for updates…"
+#~ msgstr "กำลังตรวจสอบการปรับรุ่น…"
+
+#~ msgid "Enter GApplication service mode"
+#~ msgstr "เข้าโหมดบริการ GApplication"
+
+#~ msgid "No software installed"
+#~ msgstr "ไม่มีซอฟต์แวร์ที่ติดตั้งไว้"
+
+#~ msgid "Updates"
+#~ msgstr "มีรุ่นใหม่"
+
+#~ msgid "Network access was required but not available."
+#~ msgstr "ต้องใช้การเชื่อมต่อเครือข่ายแต่ไม่สามารถเชื่อมต่อได้"
+
+#~ 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 "OK"
+#~ 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 รายการติดตั้งไว้"
+
+#~ 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 "Enable"
+#~ msgstr "เปิดใช้"
+
+#~ msgid "Set the specified debugging level"
+#~ msgstr "ตั้งระดับการดีบั๊กตามที่ระบุ"
+
+#~ msgid "Picks"
+#~ msgstr "คัดสรร"
+
+#~ msgctxt "license"
+#~ msgid "Complicated!"
+#~ msgstr "ซับซ้อน!"
+
+#~ msgid "Recent Software Updates"
+#~ 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 ""
+#~ "<li>View installed applications</li> <li>Remove installed applications</"
+#~ "li> <li>View available application updates</li> <li>Install available "
+#~ "updates</li> <li>Find new applications</li> <li>Install new applications</"
+#~ "li> <li>Find an application to handle a specific type of file</li> "
+#~ "<li>Installed apps and updates should be available when offline</li>"
+#~ msgstr ""
+#~ "<li>ดูโปรแกรมที่ติดตั้งแล้ว</li> <li>ถอดถอนโปรแกรมที่ติดตั้งแล้ว</li> "
+#~ "<li>ดูโปรแกรมที่สามารถปรับรุ่นได้</li> <li>ติดตั้งการปรับรุ่นที่มีให้</li> "
+#~ "<li>หาโปรแกรมใหม่</li> <li>ติดตั้งโปรแกรมใหม่</li> "
+#~ "<li>หาโปรแกรมที่จะจัดการชนิดเฉพาะของแฟ้ม</li> "
+#~ "<li>ติดตั้งโปรแกรมและปรับรุ่นที่มีให้เมื่อออฟไลน์</li>"
+
+#~ msgid "New"
+#~ msgstr "ใหม่"
+
+#~ msgid "Related"
+#~ msgstr "ที่เกี่ยวข้อง"
+
+#~ msgid "Update All"
+#~ msgstr "ปรับรุ่นทั้งหมด"
+
+#~ msgid "Popular"
+#~ msgstr "นิยม"
+
+#~ msgid "Description"
+#~ 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 "Loading list of packages..."
+#~ msgstr "กำลังโหลดรายชื่อแพกเกจ..."
+
+#~ msgid "Querying..."
+#~ msgstr "กำลังสอบถาม..."
+
+#~ msgid "Setting up..."
+#~ msgstr "กำลังตั้งค่า..."
+
+#~ msgid "Requires restart"
+#~ 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..cfe375b
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,5258 @@
+# Turkish translation for gnome-software.
+# Copyright (C) 2014-2022 gnome-software's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-software package.
+#
+# Gökhan Gurbetoğlu <ggurbet@gmail.com>, 2014.
+# Necdet Yücel <necdetyucel@gmail.com>, 2015.
+# İbrahim Aydın <brhm.1995@hotmail.com>, 2017.
+# Yunus Can Kapucu <yunus_can.kapucu@hotmail.com>, 2017.
+# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2018.
+# Ahmet Elgun <ahmetelgn@gmail.com>, 2020.
+# Muhammet Kara <muhammetk@gmail.com>, 2014-2021.
+# Sabri Ünal <libreajans@gmail.com>, 2014, 2019, 2022.
+# Emin Tufan Çetin <etcetin@gmail.com>, 2017-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: 2022-10-21 17:04+0000\n"
+"PO-Revision-Date: 2022-11-12 16:54+0300\n"
+"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
+"Language-Team: Turkish <gnometurk@gnome.org>\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.1.1\n"
+"X-POOTLE-MTIME: 1433975102.000000\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 "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 applications and system "
+"extensions and remove existing installed applications."
+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 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 ""
+"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ı"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:2076
+#: src/gs-application.c:256
+msgid "The GNOME Project"
+msgstr "GNOME Projesi"
+
+#: 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çülü 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çülü 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 last timestamp when the system was online and got any updates"
+msgstr ""
+"Sistemin çevrim içi olduğu ve herhangi bir güncelleme aldığı son zaman "
+"damgası"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+msgid "The server to use for application reviews"
+msgstr "Uygulama incelemeleri için kullanılacak sunucu"
+
+#: data/org.gnome.software.gschema.xml:85
+msgid "The minimum karma score for reviews"
+msgstr "İncelemeler için gereken en düşük karma puanı"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+msgid "Allow access to the Software Repositories dialog"
+msgstr "Yazılım Depoları penceresine erişme izni ver"
+
+#: data/org.gnome.software.gschema.xml:114
+msgid "Offer upgrades for pre-releases"
+msgstr "Dağıtım öncesi güncellemeleri sağla"
+
+#: data/org.gnome.software.gschema.xml:118
+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:122
+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:126
+msgid "'https://en.wikipedia.org/wiki/Proprietary_software'"
+msgstr "'https://tr.wikipedia.org/wiki/Sahipli_yazılım'"
+
+#: data/org.gnome.software.gschema.xml:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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ğrulanamıyor: %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: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 "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 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, 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:1027
+#, 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:1031
+#, 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 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, 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Yaş Derecelendirmesi"
+
+#: 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 "Eksik bilgilere nasıl katkıda bulunulur"
+
+#: lib/gs-app.c:6178
+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: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:457
+msgid "Pending"
+msgstr "Beklemede"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:461 src/gs-details-page.c:369
+msgid "Pending install"
+msgstr "Kurulum bekleniyor"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:465 src/gs-details-page.c:376
+msgid "Pending remove"
+msgstr "Kaldırma bekleniyor"
+
+#: 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 "Kuruldu"
+
+#. 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 "Kuruluyor"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Kaldırılıyor"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Kaldır"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Ağ"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Ağ üzerinden iletişim kurabilir"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Sistem Hizmetleri"
+
+#: src/gs-app-details-page.c:69
+msgid "Can access D-Bus services on the system bus"
+msgstr "Sistem veriyolundaki D-Bus hizmetlerine erişebilir"
+
+#: src/gs-app-details-page.c:70
+msgid "Session Services"
+msgstr "Oturum Hizmetleri"
+
+#: src/gs-app-details-page.c:70
+msgid "Can access D-Bus services on the session bus"
+msgstr "Oturum veriyolundaki D-Bus hizmetlerine erişebilir"
+
+#: src/gs-app-details-page.c:71
+msgid "Devices"
+msgstr "Aygıtlar"
+
+#: src/gs-app-details-page.c:71
+msgid "Can access system device files"
+msgstr "Sistem aygıt dosyalarına erişebilir"
+
+#: src/gs-app-details-page.c:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Ev klasörü"
+
+#: 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 "Dosyaları görüntüleyebilir, düzenleyebilir ve oluşturabilir"
+
+#: 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 "Dosyaları görüntüleyebilir"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "İndirilenler klasörü"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: src/gs-app-details-page.c:79
+msgid "Can view and change any settings"
+msgstr "Ayarları görüntüleyebilir ve değiştirebilir"
+
+#: src/gs-app-details-page.c:80
+msgid "Legacy display system"
+msgstr "Eski görüntü sistemi"
+
+#: src/gs-app-details-page.c:80
+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:81
+msgid "Sandbox escape"
+msgstr "Yalıtılmış alandan kaçış"
+
+#: src/gs-app-details-page.c:81
+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"
+
+#. FIXME support app == NULL
+#. set window title
+#: src/gs-app-details-page.c:166
+msgid "Update Details"
+msgstr "Güncelleme Ayrıntıları"
+
+#. 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 "Güncelleme tanımı yok."
+
+#: 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 "Geri git"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:516
+msgid "Requires additional permissions"
+msgstr "Ek izinler gerektirir"
+
+#. 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 "İncelemeler"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+msgstr "Bu uygulama için inceleme bulunamadı."
+
+#: src/gs-app-reviews-dialog.ui:27
+msgid "No Reviews"
+msgstr "İnceleme Yok"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:533
+msgid "Version History"
+msgstr "Sürüm Geçmişi"
+
+#: src/gs-app-version-history-row.c:71
+#, c-format
+msgid "New in Version %s"
+msgstr "%s Sürümü Yenilikleri"
+
+#: src/gs-app-version-history-row.c:78
+#, c-format
+msgid "Version %s"
+msgstr "Sürüm %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Yerel metainfo veya appdata dosyası göster"
+
+#: src/gs-application.c:143
+msgid "Show verbose debugging information"
+msgstr "Ayrıntılı hata ayıklama bilgilerini göster"
+
+#: 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 update preferences"
+msgstr "Güncelleme seçeneklerini 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:261 src/gs-application.c:269
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Telif Hakkı © 2016–2022 GNOME Yazılımlar katkıcıları"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Muhammet Kara <muhammetk@gmail.com>\n"
+"Emin Tufan Çetin <etcetin@gmail.com>"
+
+#. 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 "Yazılımlar Hakkında"
+
+#. 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 "Sisteminizdeki yazılımları yönetmenin güzel bir yolu."
+
+#. 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 "Üzgünüz! Bu uygulama için ayrıntı yok."
+
+#. 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 "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 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 "İ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:282
+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:293
+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:300
+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:307
+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:314
+msgid "Can access hardware devices"
+msgstr "Donanım 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:326
+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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Gelişigüzel 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:366 src/gs-safety-context-dialog.c:227
+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:373 src/gs-safety-context-dialog.c:211
+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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "İsteğe bağlı izinler edinir"
+
+#. 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 "Dağıtımınızca incelenmiş"
+
+#. 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 "Üçüncü tarafça sağlanmış"
+
+#. 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 "Sahipli kod"
+
+#. 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 "Denetlenebilir kod"
+
+#. 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 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 "Yazılım artık desteklenmiyor"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Güvenli Değil"
+
+#: 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 "Yalnızca Mobil"
+
+#: src/gs-app-context-bar.c:561
+msgid "Only works on a small screen"
+msgstr "Yalnızca küçük ekranda çalışır"
+
+#: 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 "Yalnızca Masaüstü"
+
+#: src/gs-app-context-bar.c:567
+msgid "Only works on a large screen"
+msgstr "Yalnızca büyük ekranda çalışır"
+
+#: src/gs-app-context-bar.c:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Ekran Boyutu Uygunsuzluğu"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+msgid "Doesn’t support your current screen size"
+msgstr "Geçerli ekran boyutunuzu desteklemiyor"
+
+#: 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 "Dokunmatik ekran gerektirir"
+
+#: 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 "Klavye gerektirir"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Fare gerektirir"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Oyun Kolu Gereklidir"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Uyarlanır"
+
+#: src/gs-app-context-bar.c:644
+msgid "Works on phones, tablets and desktops"
+msgstr "Telefonlarda, tabletlerde ve masaüstülerde çalışır"
+
+#: src/gs-app-context-bar.c:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Klavye veya fare gerektirebilir"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Yaş uygunsuz içerik barındırmaz"
+
+#: src/gs-app-context-bar.c:753
+msgid "No age rating information available"
+msgstr "Yaş derecelendirme bilgisi yok"
+
+#. 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 "Web Sitesini Gör"
+
+#. 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 "Kur…"
+
+#. 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 "İptal"
+
+#. 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 "Kur"
+
+#. 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 "Güncelle"
+
+#. 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 "Kaldır"
+
+#. 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 "Kaldırılıyor"
+
+#. 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 "Aygıt güncelleme sırasında kullanılamaz."
+
+#. 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 "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:523
+#, c-format
+msgid "Renamed from %s"
+msgstr "%s yeniden adlandırıldı"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "%s Çevirisine Yardım Et"
+
+#. 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 uluslararası gönüllü 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:5
+msgid "Translations"
+msgstr "Çeviriler"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "_Çeviri Web Sitesi"
+
+#. 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 etki alanı) giriş gerektiriyor"
+
+#: src/gs-basic-auth-dialog.ui:13
+msgid "Login Required"
+msgstr "Giriş Gerekiyor"
+
+#: 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 "_İptal"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "_Giriş"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "_Kullanıcı"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "_Parola"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:106
+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:129
+msgid "New & Updated"
+msgstr "Yeni ve Güncellenen"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Diğer Yazılım"
+
+#. 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 "1 ile %u arası sayı gir: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:266
+msgid "Choose an application:"
+msgstr "Uygulama seç:"
+
+#: 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 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 şimdi kuruldu"
+
+#. 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 "Değişikliklerin etkili olması için yeniden başlatmanız gerekiyor."
+
+#. 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 "Uygulama kullanıma hazır."
+
+#. 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 "Sistem güncellemeleri kuruldu"
+
+#. 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 "Son olarak kurulan güncellemeler gözden geçirme için uygun"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Yeniden Başlat"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Başlat"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Üçüncü Taraf Yazılım Kurulsun Mu?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+msgid "Enable Third-Party Software Repository?"
+msgstr "Üçüncü Taraf Yazılım Deposu Etkinleştirilsin Mi?"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s, <a href=\"https://tr.wikipedia.org/wiki/"
+"Özgür_ve_açık_kaynak_kodlu_yazılım\">özgür ve açık kaynak kodlu yazılım</a> "
+"değildir, “%s” tarafından sağlanır."
+
+#. 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, “%s” tarafından sağlanıyor."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Bir Daha Uyarma"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+msgid "Detailed errors from the package manager follow:"
+msgstr "Paket yöneticisinden gelen hata ayrıntıları:"
+
+#: src/gs-common.c:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Ayrıntılar"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Onayla"
+
+#. 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] "Güncellemeler kuruldu"
+
+#. 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] "Uygulama(lar) kaldırıldı"
+
+#. 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] "Bunların etkili olması için yeniden başlatma gerekiyor."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Şimdi Değil"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Şimdi"
+
+#: src/gs-common.c:871
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] "%d dakika önce"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d saat önce"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d gün önce"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d hafta önce"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d ay önce"
+
+#: src/gs-common.c:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years ago"
+msgstr[0] "%d yıl ö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: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 "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:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "Daha Çoğunu Gö_ster"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "Daha Az _Göster"
+
+#: src/gs-details-page.c:357
+msgid "Removing…"
+msgstr "Kaldırılıyor…"
+
+#: src/gs-details-page.c:367
+msgid "Requires restart to finish install"
+msgstr "Kurulumu bitirmek için yeniden başlatma gerekir"
+
+#: src/gs-details-page.c:374
+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:391
+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:398
+msgid "Pending update…"
+msgstr "Güncellemeler bekleniyor…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:414
+msgid "Preparing…"
+msgstr "Hazırlanıyor…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:417
+msgid "Uninstalling…"
+msgstr "Kaldırılıyor…"
+
+#. 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 "_Kur"
+
+#: src/gs-details-page.c:886
+msgid "_Restart"
+msgstr "_Yeniden Başlat"
+
+#. 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 "_Kur…"
+
+#. 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 "Diğer %s Uygulamaları"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1570
+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:1734 src/gs-details-page.c:1750
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "“%s” bulunamıyor"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Ayrıntılar sayfası"
+
+#: src/gs-details-page.ui:39
+msgid "Loading application details…"
+msgstr "Uygulama ayrıntıları yükleniyor…"
+
+#: src/gs-details-page.ui:77
+msgid ""
+"This software is not available in your language and will appear in US "
+"English."
+msgstr "Bu yazılım dilinizde kullanılamıyor ve ABD İngilizcesinde görünecek."
+
+#: src/gs-details-page.ui:83
+msgid "Help _Translate"
+msgstr "Çeviriye _Yardım Et"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "_Aç"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Güncelle"
+
+#: src/gs-details-page.ui:319
+msgid "Downloading"
+msgstr "İndiriliyor"
+
+#: src/gs-details-page.ui:456 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Eklentiler"
+
+#: src/gs-details-page.ui:467
+msgid "Selected add-ons will be installed with the application."
+msgstr "Seçilen eklentiler uygulama ile birlikte kurulacak."
+
+#: src/gs-details-page.ui:567
+msgid ""
+"This application can only be used when there is an active internet "
+"connection."
+msgstr ""
+"Bu uygulama yalnızca etkin İnternet bağlantınız olduğunda kullanılabilir."
+
+#: src/gs-details-page.ui:587
+msgid "Software Repository Included"
+msgstr "Yazılımı Deposu İçindedir"
+
+#: src/gs-details-page.ui:588
+msgid ""
+"This application 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:605
+msgid "No Software Repository Included"
+msgstr "Yazılım Deposu İçinde Değildir"
+
+#: src/gs-details-page.ui:606
+msgid ""
+"This application does not include a software repository. It will not be "
+"updated with new versions."
+msgstr ""
+"Bu uygulamada yazılım deposu bulunmuyor. Yeni sürümleri çıktığında "
+"güncellenmeyecek."
+
+#: src/gs-details-page.ui:624
+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."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:641
+msgid "Software Repository Identified"
+msgstr "Yazılım Deposu Belirlendi"
+
+#: src/gs-details-page.ui:642
+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:643
+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:708
+msgid "No Metadata"
+msgstr "Üst Veri Yok"
+
+#: src/gs-details-page.ui:717
+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.ui:745
+msgid "Project _Website"
+msgstr "Proje _Web Sitesi"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "_Bağış Yap"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "Çevirilere _Katkı Yap"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "Sorun _Bildir"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "_Yardım"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:907
+msgid "_Write Review"
+msgstr "_İnceleme Yaz"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:944
+msgid "All Reviews"
+msgstr "Tüm İncelemeler"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:272
+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: 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] "%s betiği/betikleri için kullanılabilir yazı tipleri"
+
+#. 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] "%s için kullanılabilir yazılım"
+
+#: src/gs-extras-page.c:242
+msgid "Requested software not found"
+msgstr "İstenen yazılım bulunamadı"
+
+#: src/gs-extras-page.c:244
+msgid "Failed to find requested software"
+msgstr "İstenen yazılımı bulma başarısız"
+
+#. 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 bulunamadı"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:347
+msgid "on the website"
+msgstr "web sitesinde"
+
+#. 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 "%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: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 ""
+"%s ve eksik uygulamaları nasıl edinebileceğinizle ilgili seçenekleri %s "
+"bulabilirsiniz."
+
+#. 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 "%s desteği için kullanılabilir uygulama yok."
+
+#. 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 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: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 ""
+"%s ve bu biçimi oynatabilen uygulamayı nasıl edinebileceğinizle ilgili "
+"seçenekleri %s bulabilirsiniz."
+
+#. 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 "%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:402
+#, 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 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 "%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: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 ""
+"%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 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 "%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:424
+#, 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 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 "%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: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 ""
+"%s ve bu sürücüyü nasıl edinebileceğinizle ilgili seçenekleri %s "
+"bulabilirsiniz."
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:481
+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 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] ""
+"%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: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] "Aradığınız %s bulunamadı. Daha çok bilgi için lütfen %s bakın."
+
+#: 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 "Herhangi bir arama sonucu bulunamadı: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s dosya biçimi"
+
+#: src/gs-extras-page.c:1254
+msgid "Unable to Find Requested Software"
+msgstr "İstenen Yazılım Bulunamadı"
+
+#: src/gs-extras-page.ui:6
+msgid "Codecs page"
+msgstr "Kod çözücüler sayfası"
+
+#: 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Masaüstü Desteği"
+
+#: 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 "Büyük ekranda kullanımı destekler"
+
+#: src/gs-hardware-support-context-dialog.c:580
+msgid "Desktop Support Unknown"
+msgstr "Masaüstü Desteği Bilinmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:581
+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:584
+msgid "Requires a large screen"
+msgstr "Büyük ekran gerektirir"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Masaüstü Desteklenmez"
+
+#: src/gs-hardware-support-context-dialog.c:590
+msgid "Cannot be used on a large screen"
+msgstr "Büyük ekranda kullanılamaz"
+
+#: src/gs-hardware-support-context-dialog.c:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Mobil Desteği"
+
+#: 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 "Küçük ekranda kullanımı destekler"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Mobil Desteği Bilinmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+msgid "Requires a small screen"
+msgstr "Küçük ekran gerektirir"
+
+#: src/gs-hardware-support-context-dialog.c:609
+msgid "Mobile Not Supported"
+msgstr "Mobil Desteklenmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:610
+msgid "Cannot be used on a small screen"
+msgstr "Küçük ekranda kullanılamaz"
+
+#: src/gs-hardware-support-context-dialog.c:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Klavye Desteği"
+
+#: src/gs-hardware-support-context-dialog.c:636
+msgid "Keyboard Support Unknown"
+msgstr "Klavye Desteği Bilinmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:637
+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:639
+msgid "Keyboard Required"
+msgstr "Klavye Gereklidir"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Klavyeleri destekler"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Klavye Desteklemez"
+
+#: src/gs-hardware-support-context-dialog.c:646
+msgid "Cannot be used with a keyboard"
+msgstr "Klavyeyle kullanılamaz"
+
+#: src/gs-hardware-support-context-dialog.c:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Fare Desteği"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+msgid "Requires a mouse or pointing device"
+msgstr "Fare veya imleyici aygıt gerektirir"
+
+#: src/gs-hardware-support-context-dialog.c:656
+msgid "Mouse Support Unknown"
+msgstr "Fare Desteği Bilinmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Fare Gereklidir"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Fare ve imleyici aygıtları destekler"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Fare Desteklenmez"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Dokunmatik Ekran Desteği"
+
+#: src/gs-hardware-support-context-dialog.c:676
+msgid "Touchscreen Support Unknown"
+msgstr "Dokunmatik Ekran Desteği Bilinmiyor"
+
+#: src/gs-hardware-support-context-dialog.c:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Dokunmatik Ekran Gereklidir"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Dokunmatik ekranları destekler"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Dokunmatik Ekran Desteklenmez"
+
+#: src/gs-hardware-support-context-dialog.c:686
+msgid "Cannot be used with a touchscreen"
+msgstr "Dokunmatik ekranlarla kullanılamaz"
+
+#: src/gs-hardware-support-context-dialog.c:699
+msgid "Gamepad Required"
+msgstr "Oyun Kolu Gereklidir"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Oyun kolu gerektirir"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Oyun Kolu Desteği"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s, bu aygıtta çalışı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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Donanım Desteği"
+
+#. 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 "Kurulu"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Kurulan sayfa"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Uygulamalar"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Web Uygulamaları"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Sistem Uygulamaları"
+
+#: src/gs-license-tile.c:96
+msgid "Community Built"
+msgstr "Topluluk İnşası"
+
+#: src/gs-license-tile.c:107 src/gs-license-tile.ui:98
+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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Bu yazılım, gönüllü topluluğunca açık olarak geliştirilmiş ve <a href=\"%s\">"
+"%s lisansıyla</a> dağıtılmıştır.\n"
+"\n"
+"Katkıda bulunarak daha iyi olmasını sağlayabilirsiniz."
+
+#. 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 ""
+"Bu yazılım, gönüllü topluluğunca açık olarak geliştirilmiş ve %s lisansıyla "
+"dağıtılmıştır.\n"
+"\n"
+"Katkıda bulunarak daha iyi olmasını sağlayabilirsiniz."
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "Sahipli"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "_Daha Çoğunu Öğren"
+
+#: 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 ""
+"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: initial start
+#: src/gs-loading-page.c:56
+msgid "Downloading software catalog"
+msgstr "Yazılım kataloğu indiriliyor"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Sayfa yükleniyor"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Başlatılıyor…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Kendiliğinden Güncellemeler Duraklatıldı"
+
+#: 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 ""
+"Şu anki ağ ölçülüdür. Ölçülü bağlantıların veri sınırları veya ilişkili "
+"ücretleri vardır. Veriyi azaltmak için kendiliğinden güncellemeler "
+"duraklatılacak.\n"
+"\n"
+"Ölçülmeyen bağlantı kullanılabildiğinde kendiliğinden güncellemeler sürecek. "
+"O zamana dek güncellemeler elle kurulabilir.\n"
+"\n"
+"Başka seçenek olarak, eğer şu anki ağ yanlışlıkla ölçülü tanımlandıysa bu "
+"ayar değiştirilebilir."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "_Ağ Ayarlarını Aç"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Yönetim sayfası"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Yönetilecek inceleme yok"
+
+#: 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: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 "Kullanıcı"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+msgid "Additions"
+msgstr "Eklentiler"
+
+#. TRANSLATORS: This is the header for package removals during
+#. * a system update
+#: src/gs-os-update-page.c:254
+msgid "Removals"
+msgstr "Kaldırılanlar"
+
+#. 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 "Güncellemeler"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Sürüm Düşürmeler"
+
+#. 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 "Seçili dış kaynaklardan"
+
+#. 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 "%s ek yazılıma erişim sağlar. Bazı sahipli yazılımları içerir."
+
+#. 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 "Etkinleştir"
+
+#. 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 "Keşfet"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Genel bakış sayfası"
+
+#: src/gs-overview-page.ui:35
+msgid "Enable Third Party Software Repositories?"
+msgstr "Üçüncü Taraf Yazılım Depoları Etkinleştirilsin Mi?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:180
+msgid "Other Categories"
+msgstr "Diğer Kategoriler"
+
+#: src/gs-overview-page.ui:221
+msgid "No Application Data Found"
+msgstr "Uygulama Verisi Bulunamadı"
+
+#: lib/gs-plugin-loader.c:2829
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: src/gs-page.c:274
+msgid "User declined installation"
+msgstr "Kullanıcı kurulumu reddetti"
+
+#. 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 Uygulamasını Hazırla"
+
+#. 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 "%s deposunu kaldırmak istediğinizden emin misiniz?"
+
+#. 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 ""
+"%s kaynağından olan tüm uygulamalar kaldırılacak ve yeniden kullanmak için "
+"depoyu yeniden kurmanız gerekecek."
+
+#. 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 "%s uygulamasını kaldırmak istediğinize emin misiniz?"
+
+#. 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 kaldırılacak ve yeniden kullanmanız için kurmanız gerekecek."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Güncelleme Seçenekleri"
+
+#: 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 ""
+"Mobil veya ölçülen bağlantılarda masraf ve ağ aşımını önlemek için yazılım "
+"güncellemeleri kendiliğinden indirilmeyecektir."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Kendiliğinden Güncellemeler"
+
+#: src/gs-prefs-dialog.ui:20
+msgid ""
+"Downloads and installs software updates in the background, when possible."
+msgstr "Olabildiğinde yazılım güncellemelerini arka planda indirir ve kurar."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Kendiliğinden Güncelleme Bildirimleri"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications when updates have been automatically installed."
+msgstr "Güncellemeler kendiliğinden kurulduğunda bildirim 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: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 ""
+"Kurulu bazı yazılımlar %s ile uyumlu değil. Eğer sürdürürseniz, şunlar "
+"yükseltme sırasında kendiliğinden kaldırılacak:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Uyumsuz Yazılım"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Sürdür"
+
+#. 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 "“%s” kaynağından kurulan yazılımlar güncelleme almayacak."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Depoyu Devre Dışı Bırak?"
+
+#: src/gs-repos-dialog.c:248
+msgid "Remove Repository?"
+msgstr "Depoyu Kaldır?"
+
+#. 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
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "_Kaldır"
+
+#: src/gs-repos-dialog.c:508
+msgid "Enable New Repositories"
+msgstr "Yeni Depoları Etkinleştir"
+
+#: src/gs-repos-dialog.c:509
+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:518
+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:523
+#, c-format
+msgid "Additional repositories from selected third parties — %s."
+msgstr "Seçilen üçüncü taraflardan ek depolar — %s."
+
+#: src/gs-repos-dialog.c:528
+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:670
+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:728
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Yazılım Depoları"
+
+#: src/gs-repos-dialog.ui:53
+msgid "No Repositories"
+msgstr "Depo Yok"
+
+#. 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 uygulama kuruldu"
+
+#. 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 eklenti kuruldu"
+
+#. 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 uygulama"
+
+#. 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 eklenti"
+
+#. 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 ve %s kuruldu"
+
+#. 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 "Berbat"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Pek iyi değil"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "İdare eder"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Güzel"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Harika"
+
+#. 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 "Lütfen inceleme yazmaya biraz daha zaman ayırın"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:122
+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:126
+msgid "The summary is too short"
+msgstr "Özet çok kısa"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:130
+msgid "The summary is too long"
+msgstr "Özet çok uzun"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:134
+msgid "The description is too short"
+msgstr "Açıklama çok kısa"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "İnceleme Gönder"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "_Gönder"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Puanlama"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Özet"
+
+#: src/gs-review-dialog.ui:97
+msgid ""
+"Give a short summary of your review, for example: “Great app, would "
+"recommend”."
+msgstr ""
+"İncelemenizin kısa özetini girin, örneğin: “Harika bir uygulama, öneriyorum”."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "İnceleme"
+
+#: src/gs-review-dialog.ui:128
+msgid "What do you think of the app? Try to give reasons for your views."
+msgstr ""
+"Uygulamayla ilgili ne düşünüyorsunuz? Görüşleriniz için neden belirtmeye "
+"çalışın."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Ne verisinin gönderildiğini <a href=\"https://odrs.gnome.org/privacy"
+"\">gizlilik ilkemizde</a> 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:93
+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:220
+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:225
+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:239
+msgid "Report Review?"
+msgstr "İnceleme Bildirilsin Mi?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Rapor Et"
+
+#. 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 "Bu inceleme işinize yaradı mı?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Evet"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Hayır"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Eh İşte"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Rapor Et…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Kaldır…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application isn’t sandboxed"
+msgstr ""
+"Sağlayıcıya güveninizi gözden geçirin çünkü uygulama yalıtılmış alanda değil"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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ı"
+
+#. 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 "İzin Yok"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Ağ Erişimi"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Ağ Erişimi Yok"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Sistem Hizmetlerini Kullanır"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Oturum Hizmetlerini Kullanır"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Aygıt Erişimi"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Aygıt Erişimi Yok"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+msgid "Full File System Read/Write Access"
+msgstr "Tüm Dosya Sistemini Okuma/Yazma Erişimi"
+
+#: src/gs-safety-context-dialog.c:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Ev Klasörü Okuma/Yazma Erişimi"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Tüm Dosya Sistemini Okuma Erişimi"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Ev Klasörü Okuma Erişimi"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+msgid "Download Folder Read/Write Access"
+msgstr "İndirilenler Klasörü Okuma/Yazma Erişimi"
+
+#: src/gs-safety-context-dialog.c:277
+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:288
+msgid "Download Folder Read Access"
+msgstr "İndirilenler Klasörü Okuma Erişimi"
+
+#: src/gs-safety-context-dialog.c:289
+msgid "Can read all data in your downloads directory"
+msgstr "İndirilenler dizininizdeki tüm veriyi okuyabilir"
+
+#: src/gs-safety-context-dialog.c:299
+msgid "Can read and write all data in the directory"
+msgstr "Dizindeki tüm veriyi okuyabilir ve yazabilir"
+
+#: src/gs-safety-context-dialog.c:310
+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:326
+msgid "No File System Access"
+msgstr "Dosya Sistemi Erişimi Yok"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Dosya sistemine tümüyle erişemez"
+
+#. 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 "Sahipli Kod"
+
+#: 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 ""
+"Kaynak kod halka açık değildir, bu nedenle bağımsızca denetlenemez ve "
+"güvenilir olmayabilir"
+
+#. 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 "Denetlenebilir Kod"
+
+#: 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 ""
+"Kaynak kod halka açıktır ve bağımsızca denetlenebilir, bu uygulamayı daha "
+"güvenilir kılar"
+
+#. 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 "Uygulama geliştirici doğrulandı"
+
+#: src/gs-safety-context-dialog.c:355
+msgid "The developer of this app has been verified to be who they say they are"
+msgstr ""
+"Bu uygulamanın geliştiricisinin kim olduğunu söyleyenler 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:366
+msgid "Insecure Dependencies"
+msgstr "Güvensiz Bağımlılıklar"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 güvenilir"
+
+#. 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 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s güvenilir değil"
+
+#. 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 "Güvenlik"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Kaynak"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Tarihi geçmiş SDK sürümü"
+
+#. 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ü"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Ekran görüntüsü sağlanmadı"
+
+#. 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 "Ekran görüntüsü bulunamadı"
+
+#. TRANSLATORS: possibly image file corrupt or not an image
+#: src/gs-screenshot-image.c:438
+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:651
+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:733
+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:747
+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:797
+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:180
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "%u eşleşme daha"
+
+#: src/gs-search-page.ui:6
+msgid "Search page"
+msgstr "Arama sayfası"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Uygulamalarda Ara"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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: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 "%s’den 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:1281
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "%s’den güncellemeler indirilemiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1288 src/gs-shell.c:1328
+msgid "Unable to download updates"
+msgstr "Güncellemeler indirilemiyor"
+
+#. 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 ""
+"Güncellemeler indirilemiyor: İnternet bağlantısı gerekiyordu ancak "
+"kullanılamazdı"
+
+#. 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 "%s’den güncellemeler indirilemiyor: yetersiz disk alanı"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1306
+msgid "Unable to download updates: not enough disk space"
+msgstr "Güncellemeler indirilemiyor: yetersiz disk alanı"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1312
+msgid "Unable to download updates: authentication was required"
+msgstr "Güncellemeler indirilemiyor: yetkilendirme gerekiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1316
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Güncellemeler indirilemiyor: yetkilendirme geçersiz"
+
+#. 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 "Güncellemeler indirilemiyor: yazılım kurma izniniz yok"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1331
+msgid "Unable to get list of updates"
+msgstr "Güncellemelerin listesi alınamıyor"
+
+#. 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 "%2$s’den indirme başarısız olduğundan %1$s kurulamıyor"
+
+#. 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 "İndirme başarısız olduğundan %s kurulamıyor"
+
+#. 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 "%2$s çalışma zamanı olmadığından %1$s kurulamıyor"
+
+#. 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 "Desteklenmediğinden %s kurulamıyor"
+
+#. 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 "Kurulamıyor: İnternet bağlantısı gerekiyordu ancak kullanılamazdı"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1408
+msgid "Unable to install: the application has an invalid format"
+msgstr "Kurulamıyor: uygulamanın geçersiz biçimi var"
+
+#. 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 "%s kurulamıyor: yetersiz disk alanı"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "%s kurulamıyor: yetkilendirme gerekiyor"
+
+#. 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 "%s kurulamıyor: yetkilendirme geçersiz"
+
+#. 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 "%s kurulamıyor: yazılım kurma izniniz yok"
+
+#. 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 "%s kurulamıyor: AC güç gerekiyor"
+
+#. 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 "%s kurulamıyor: Pil düzeyi çok düşük"
+
+#. 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 "%s kurulamıyor"
+
+#. 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 "%s, %s üstünden indirme başarısız olduğundan güncellenemedi"
+
+#. 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 "İndirme başarısız olduğundan %s güncellenemedi"
+
+#. 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 "İndirme başarısız olduğundan %s üstünden güncellemeler kurulamadı"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1515
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "İndirme başarısız olduğundan güncellemeler kurulamadı"
+
+#. 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 "Güncellenemiyor: İnternet bağlantısı gerekiyordu ancak kullanılamazdı"
+
+#. 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 "%s güncellenemiyor: yetersiz disk alanı"
+
+#. 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 "Güncellemeler kurulamıyor: yeterli disk alanı yok"
+
+#. 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 "%s güncellenemiyor: yetkilendirme gerekiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1548
+#, c-format
+msgid "Unable to install updates: authentication was required"
+msgstr "Güncellemeler kurulamıyor: kimlik doğrulama gerekli"
+
+#. 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 "%s güncellenemiyor: yetkilendirme geçersiz"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to install updates: authentication was invalid"
+msgstr "Güncellemeler kurulamıyor: kimlik doğrulama geçersiz"
+
+#. 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 "%s güncellenemiyor: yazılım güncellemeye yetkiniz yok"
+
+#. 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 "Güncellemeler kurulamıyor: yazılımı güncelleme izniniz yok"
+
+#. 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 "%s güncellenemiyor: AC güç gerekiyor"
+
+#. 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 "Güncellemeler kurulamıyor: AC güç gerekiyor"
+
+#. 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 "%s güncellenemiyor: Pil düzeyi çok düşük"
+
+#. 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 "Güncellemeler kurulamıyor: Pil düzeyi çok düşük"
+
+#. 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 "%s yükseltilemiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1618
+#, c-format
+msgid "Unable to install updates"
+msgstr "Güncellemeler kurulamıyor"
+
+#. 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 "%2$s’den %1$s’e yükseltilemiyor"
+
+#. 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 "İndirme başarısız olduğundan %s yükseltilemiyor"
+
+#. 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 "%sʼe yükseltilemiyor: İnternet erişimi gerekli ancak yok"
+
+#. 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 "%s’e 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:1688
+#, c-format
+msgid "Unable to upgrade to %s: authentication was required"
+msgstr "%s’e yükseltilemiyor: yetkilendirme gerekiyor"
+
+#. 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 "%s’e yükseltilemiyor: yetkilendirme 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:1700
+#, c-format
+msgid "Unable to upgrade to %s: you do not have permission to upgrade"
+msgstr "%sʼe yükseltilemiyor: yükseltme için izniniz yok"
+
+#. 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 "%s’e yükseltilemiyor: AC güç gerekiyor"
+
+#. 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 "%s’e yükseltilemiyor: Pil düzeyi çok düşük"
+
+#. 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 "%s’e yükseltilemiyor"
+
+#. 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 "%s kaldırılamıyor: yetkilendirme gerekiyor"
+
+#. 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 "%s kaldırılamıyor: yetkilendirme geçersiz"
+
+#. 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 "%s kaldırılamıyor: yazılım kaldırma izniniz yok"
+
+#. 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 "%s kaldırılamıyor: AC güç gerekiyor"
+
+#. 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 "%s kaldırılamıyor: Pil düzeyi çok düşük"
+
+#. 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 "%s kaldırılamıyor"
+
+#. 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 "%s başlatılamıyor: %s kurulmamış"
+
+#. 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 "Üzgünüz, bir şeyler yanlış gitti"
+
+#. 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 "Yetersiz disk alanı — biraz yer aç ve yeniden dene"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1888
+msgid "Failed to install file: not supported"
+msgstr "Dosya kurulamadı: desteklenmiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1891
+msgid "Failed to install file: authentication failed"
+msgstr "Dosya kurulamıyor: yetkilendirme başarısız"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1926
+msgid "Failed to install: not supported"
+msgstr "Kurulamadı: desteklenmiyor"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1929
+msgid "Failed to install: authentication failed"
+msgstr "Kurulamadı: yetkilendirme başarısız"
+
+#. 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 "%s ile iletişim kurulamıyor"
+
+#. 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 "Yazılımlar, yeni eklentileri kullanmak için yeniden başlatılmalıdır."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1984
+msgid "AC power is required"
+msgstr "AC güç gerekiyor"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1987
+msgid "The battery level is too low"
+msgstr "Pil düzeyi çok düşük"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Yazılım Depoları"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Güncelleme Seçenekleri"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Diski İncele"
+
+#. 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 "Ağ Ayarları"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Yeniden Başlat"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Daha Çok Bilgi"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Ara"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Birincil Menü"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "_Daha Çoğunu Öğren"
+
+#. 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 "Güncellemeler"
+
+#. 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 "Application Data"
+msgstr "Uygulama Verisi"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+msgstr "Bu uygulamaca gereksinilen paylaşımlı sistem bileşenleri"
+
+#: src/gs-storage-context-dialog.c:188
+msgctxt "Download size"
+msgid "Unknown"
+msgstr "Bilinmiyor"
+
+#. 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 "Biriktirme"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Önbellekli veri <a href=\"dummy\">_uygulama ayarları</a>ndan temizlenebilir."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Kuruldu)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Kuruluyor)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Kaldırılıyor)"
+
+#. 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 "Kurulan Güncellemeler"
+
+#. 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 "%s’de kuruldu"
+
+#: src/gs-update-dialog.ui:77
+msgid "No Updates Installed"
+msgstr "Güncelleme Kurulmadı"
+
+#: src/gs-update-monitor.c:213
+msgid "Software Updates Are Out of Date"
+msgstr "Yazılım Güncellemelerinin Tarihi Geçmiş"
+
+#: src/gs-update-monitor.c:214
+msgid "Please check for software updates."
+msgstr "Lütfen yazılım güncellemelerini denetleyin."
+
+#: src/gs-update-monitor.c:220
+msgid "Critical Software Update Ready to Install"
+msgstr "Kritik Yazılım Güncellemesi Kuruluma Hazır"
+
+#: src/gs-update-monitor.c:221
+msgid "An important software update is ready to be installed."
+msgstr "Önemli yazılım güncellemesi kuruluma hazır."
+
+#: src/gs-update-monitor.c:224
+msgid "Critical Software Updates Available to Download"
+msgstr "İndirilebilecek Kritik Yazılım Güncellemeleri Var"
+
+#: src/gs-update-monitor.c:225
+msgid "Important: critical software updates are waiting."
+msgstr "Önemli: kritik yazılım güncellemeleri bekliyor."
+
+#: src/gs-update-monitor.c:231
+msgid "Software Updates Ready to Install"
+msgstr "Yazılım Güncellemeleri Kuruluma Hazır"
+
+#: src/gs-update-monitor.c:232
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Yazılım güncellemeleri kuruluma hazır bekliyor."
+
+#: src/gs-update-monitor.c:238
+msgid "Software Updates Available to Download"
+msgstr "İndirilebilecek Yazılım Güncellemeleri Var"
+
+#: src/gs-update-monitor.c:239
+msgid "Please download waiting software updates."
+msgstr "Lütfen bekleyen yazılım güncellemelerini indirin."
+
+#. 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 Uygulama Güncellendi — Yeniden Başlatma Gerekiyor"
+
+#. 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 Uygulama Güncellendi"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:372
+#, c-format
+msgid "%s has been updated."
+msgstr "%s güncellendi."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:375
+msgid "Please restart the application."
+msgstr "Lütfen uygulamayı yeniden başlatın."
+
+#. 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 ve %s güncellendi."
+
+#. 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 uygulama yeniden başlatma gerektiriyor."
+
+#. 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 ve %s içerir."
+
+#. 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 "İşletim Sistemi Güncellemeleri Kullanılamaz"
+
+#. 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 "Güvenlik güncellemelerini 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:728
+#, 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:732
+msgid "Software Upgrade Available"
+msgstr "Yazılım Yükseltmesi Var"
+
+#. TRANSLATORS: title when we offline updates have failed
+#: src/gs-update-monitor.c:1137
+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:1139
+msgid "An important operating system update failed to be installed."
+msgstr "Önemli işletim sistemi güncellemesi kurulumu başarısız oldu."
+
+#: src/gs-update-monitor.c:1140
+msgid "Show Details"
+msgstr "Ayrıntıları Göster"
+
+#. TRANSLATORS: Notification title when we've done a distro upgrade
+#: src/gs-update-monitor.c:1162
+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:1167
+#, 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:1173
+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:1177
+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 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 "Gözden Geçir"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1237
+msgid "Failed To Update"
+msgstr "Güncelleme Başarısız Oldu"
+
+#. 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 "Sistem zaten güncel."
+
+#. TRANSLATORS: the user aborted the update manually
+#: src/gs-update-monitor.c:1247
+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:1252
+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:1257
+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:1262
+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: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 ""
+"Ö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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Son denetim: %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 artık desteklenmiyor."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "İşletim sisteminiz artık desteklenmiyor."
+
+#. 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 "Bu, güvenlik güncelleştirmeleri almayacağı anlamına gelir."
+
+#. 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 "Daha yeni sürüme yükseltmeniz önerilmektedir."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+msgid "Charges May Apply"
+msgstr "Ücret Uygulanabilir"
+
+#. 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 ""
+"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:857
+msgid "Check _Anyway"
+msgstr "Yine de _Denetle"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Ağ Yok"
+
+#. 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 "Güncellemeleri denetlemek için İnternet erişimi gerekir."
+
+#: src/gs-updates-page.c:1250
+msgid "Check for updates"
+msgstr "Güncellemeleri denetle"
+
+#: src/gs-updates-page.c:1286
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Güncellemeler"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Güncellemeler sayfası"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:82
+msgid "Loading Updates…"
+msgstr "Güncellemeler Yükleniyor…"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:95
+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:203
+msgid "Up to Date"
+msgstr "Güncel"
+
+#: src/gs-updates-page.ui:242
+msgid "Use Mobile Data?"
+msgstr "Mobil Veri Kullan?"
+
+#: src/gs-updates-page.ui:243
+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:246
+msgid "_Check Anyway"
+msgstr "Yine de _Denetle"
+
+#: src/gs-updates-page.ui:262
+msgid "No Connection"
+msgstr "Bağlantı Yok"
+
+#: src/gs-updates-page.ui:263
+msgid "Go online to check for updates."
+msgstr "Güncellemeleri denetlemek için çevrim içi ol."
+
+#: src/gs-updates-page.ui:266
+msgid "_Network Settings"
+msgstr "_Ağ Ayarları"
+
+#: src/gs-updates-page.ui:295
+msgid "Error"
+msgstr "Hata"
+
+#: src/gs-updates-page.ui:296
+msgid "Updates are automatically managed."
+msgstr "Güncellemeler kendiliğinden yönetilir."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:312
+msgid "Restart & Update"
+msgstr "Yeniden Başlat ve Güncelle"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:318
+msgid "Update All"
+msgstr "Tümünü Güncelle"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:450
+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:455
+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:460
+msgid "Application Updates"
+msgstr "Uygulama Güncellemeleri"
+
+#. TRANSLATORS: This is the header for device firmware that can
+#. * be installed online
+#: src/gs-updates-section.c:465
+msgid "Device Firmware"
+msgstr "Aygıt Donanım Yazılımı"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s Kullanılabilir"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Yeni sürümü öğren"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "İndiriliyor…"
+
+#. 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 / %s indirildi"
+
+#. 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 indirildi"
+
+#: src/gs-upgrade-banner.ui:42
+msgid "A major upgrade, with new features and added polish."
+msgstr "Yeni özellikler eklenmiş ve makyajlanmış büyük yükseltme."
+
+#: src/gs-upgrade-banner.ui:187
+msgid "_Restart & Upgrade"
+msgstr "_Yeniden Başlat ve Yükselt"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr "Yükseltmeden önce verinizi ve dosyalarınızı yedeklemeyi unutmayın."
+
+#: 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"
+
+#. 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 ""
+"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: 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 "Sistem Güncellemeleri"
+
+#. 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 ""
+"Güvenlik veya hata giderimleri gibi genel sistem güncellemeleri ve başarım "
+"geliştirmeleri."
+
+#. TRANSLATORS: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Vitrin resimleri indiriliyor…"
+
+#. 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 "Yeni özellikler ve düzeltmeler içeren %s güncellemesi."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS güncelleme servisi güncelleme alamadı ve uygulayamadı."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "GNOME Web"
+
+#: 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Yükseltme bilgisi indiriliyor…"
+
+#. 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 ""
+"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 applications 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:313
+#, c-format
+msgid "System folder %s"
+msgstr "Sistem klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Ev alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Ana makine sistem klasörleri"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "/etc dizininden ana makine sistem yapılandırması"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Masaüstü klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Masaüstü alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Belgeler klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Belgeler alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Müzik klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Müzik alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Resimler klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Resimler alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:322
+msgid "Public Share folder"
+msgstr "Paylaşılanlar klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Paylaşılanlar alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Videolar klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Videolar alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Şablonlar klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Şablonlar alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:325
+msgid "User cache folder"
+msgstr "Kullanıcı ön bellek klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:325
+#, c-format
+msgid "User cache subfolder %s"
+msgstr "Kullanıcı ön bellek alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:326
+msgid "User configuration folder"
+msgstr "Kullanıcı yapılandırma klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:326
+#, c-format
+msgid "User configuration subfolder %s"
+msgstr "Kullanıcı yapılandırma alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:327
+msgid "User data folder"
+msgstr "Kullanıcı veri klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:327
+#, c-format
+msgid "User data subfolder %s"
+msgstr "Kullanıcı verisi alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:328
+msgid "User runtime folder"
+msgstr "Kullanıcı çalışma zamanı klasörü"
+
+#: plugins/flatpak/gs-flatpak.c:328
+#, c-format
+msgid "User runtime subfolder %s"
+msgstr "Kullanıcı çalışma zamanı alt klasörü %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, 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:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "%s için flatpak üst verisi alınıyor…"
+
+#: plugins/flatpak/gs-flatpak.c:3580
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"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: 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, c-format
+msgid "%s Storage Controller Update"
+msgstr "%s Biriktirme Denetleyici Güncellemesi"
+
+#. 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 Ağ Arayüzü Güncellemesi"
+
+#. 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 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s USB Alıcı Güncellemesi"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1240
+msgid "Firmware"
+msgstr "Donanım Yazılımı"
+
+#: 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ı güncellemeleri için destek sağlar"
+
+#: plugins/packagekit/gs-packagekit-task.c:148
+msgid "Install Unsigned Software?"
+msgstr "İmzasız Yazılım Kurulsun Mu?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "İmzasız Yazılım İndirilsin Mi?"
+
+#: 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 ""
+"İ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:158
+msgid "Update Unsigned Software?"
+msgstr "İmzasız Yazılım Güncellensin Mi?"
+
+#: 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 ""
+"İ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:367
+msgid "Packages"
+msgstr "Paketler"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2690
+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, evrensel Linux paketidir"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..03893c5
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,6142 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Daniel Korostil <ted.korostiled@gmail.com>, 2013, 2014, 2015, 2016, 2017.
+# Yuri Chornoivan <yurchor@ukr.net>, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2022-08-26 11:43+0000\n"
+"PO-Revision-Date: 2022-08-26 21:49+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\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 20.12.0\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 "Програми"
+
+#: 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:1980
+#: src/gs-application.c:256
+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 ""
+"Якщо вимкнено, «Програми» не будуть показувати панель оновлень, не "
+"виконуватиме ніяких дій щодо оновлення і не надсилатимуть запитів щодо "
+"встановлення нових версій системи."
+
+#: 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 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 ""
+"Більше значення — більше запитів до віддаленого сервера і тривалість "
+"оновлення зображення може забрати більше часу. 0 — ніколи не надсилати запит "
+"до сервера, якщо зображення вже збережено."
+
+#: 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://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: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 ""
+"Список адрес, які вказують на файли appstream, які буде отримано до теки "
+"каталогу програмного забезпечення"
+
+#: 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 ""
+"Встановлювати файли AppStream до загальносистемної теки для усіх "
+"користувачів. Якщо матиме значення «false», файли буде встановлено до "
+"нестандартного каталогу $XDG_DATA_HOME//swcatalog/xml"
+
+#: 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 ""
+"Порядок пріоритетності форматів пакунків. Важливіші формати передують у "
+"списку. Порожній масив означає типове упорядкування. Пропущені формати буде "
+"пересунуто у кінець списку. Приклади форматів пакунків: deb, flatpak, rpm, "
+"snap."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "Керування програмами у GNOME по всій системі"
+
+#: 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 "Не вдалося перевірити тип вмісту: %s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 можуть користуватися підлітки"
+
+#. 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 створено для дорослих"
+
+#. 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 можуть користуватися особи віком %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 "Віковий рейтинг"
+
+#: 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:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6263
+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 "Може отримувати доступ до служб D-Bus на каналі системи"
+
+#: 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 "Може отримувати доступ до служб D-Bus на каналі сеансу"
+
+#: 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 "Нове у версії %s"
+
+#: 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 ""
+"Стартовий режим, один із: «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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "Показати локальну метаінформацію або файл appdata"
+
+#: 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 "Віддавати перевагу локальним джерелам файлів для AppStream"
+
+#: 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 "© Учасники розробки «Програм GNOME», 2016–2022"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr "Daniel Korostil <ted.korostiled@gmail.com>"
+
+#. 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:2147
+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 "Потребує додаткового отримання %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: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 "Джерело: %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 "Перейменовано з %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Допомогти у перекладі %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 спроєктовано, розроблено і перекладено міжнародною спільнотою охочих "
+"людей.\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: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 "Будь ласка, введіть число від 1 до %u: "
+
+#. 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 "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 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 вже встановлено"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s — не <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">вільний та відкритий програмний засіб</a>, і його постачає «%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 постачається через «%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 ""
+"В деяких країнах встановлення або використання %s може бути незаконне."
+
+#. 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] "Було встановлено оновлення"
+msgstr[2] "Було встановлено оновлення"
+msgstr[3] "Було встановлено оновлення"
+
+#. 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] "Було вилучено програми"
+msgstr[2] "Було вилучено програми"
+msgstr[3] "Було вилучено програму"
+
+#. 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] "Для набуття ними чинності слід перезавантажити систему."
+msgstr[2] "Для набуття ними чинності слід перезавантажити систему."
+msgstr[3] "Для набуття ним чинності слід перезавантажити систему."
+
+#. 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] "%d хвилину тому"
+msgstr[1] "%d хвилини тому"
+msgstr[2] "%d хвилин тому"
+msgstr[3] "%d хвилину тому"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d годину тому"
+msgstr[1] "%d години тому"
+msgstr[2] "%d годин тому"
+msgstr[3] "%d годину тому"
+
+#: src/gs-common.c:879
+#, 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:883
+#, 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:887
+#, 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:891
+#, c-format
+msgid "%d year ago"
+msgid_plural "%d years 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:1246
+#, 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 "Програма"
+
+#. 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:332
+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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Встановити"
+
+#: src/gs-details-page.c:873
+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:897
+msgid "_Install…"
+msgstr "_Встановити…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Інші програми %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "Щоб написати відгук, потрібен інтернет"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Неможливо знайти «%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 "Допомогти у п_ерекладі"
+
+#. 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:216
+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] "Доступні шрифти для писемностей %s"
+msgstr[1] "Доступні шрифти для писемностей %s"
+msgstr[2] "Доступні шрифти для писемностей %s"
+msgstr[3] "Доступний шрифт для писемності %s"
+
+#. 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] "Доступні програми для %s"
+msgstr[1] "Доступні програми для %s"
+msgstr[2] "Доступні програми для %s"
+msgstr[3] "Доступна програма для %s"
+
+#: 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 "%s не знайдено"
+
+#. 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 "Немає жодної програми, яка б забезпечувала файл %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 "Відомості про %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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"Відомості про %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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"Відомості про %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:420
+#, 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:424
+#, 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:431
+#, 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: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 ""
+"Відомості про %s, як і варіанти одержання драйвера, що підтримують цей "
+"принтер, можна знайти %s."
+
+#. 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] ""
+"Не вдалося знайти %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: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] ""
+"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб "
+"дізнатися більше."
+msgstr[1] ""
+"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб "
+"дізнатися більше."
+msgstr[2] ""
+"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб "
+"дізнатися більше."
+msgstr[3] ""
+"Не вдалося знайти потрібного вам %s. Будь ласка, ознайомтеся із %s, щоб "
+"дізнатися більше."
+
+#: 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 "Нічого не знайдено: %s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "Формат файла %s"
+
+#: 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 "%s ймовірно працюватиме на цьому пристрої"
+
+#. 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 працюватиме на цьому пристрої"
+
+#. 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 не працюватиме належним чином на цьому пристрої"
+
+#. 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 на працюватиме на цьому пристрої"
+
+#. 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 <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"Розробка цієї програми ведеться відкрито спільнотою охочих розробників. "
+"Випуск здійснюється за <a href=\"%s\">умов ліцензування %s</a>.\n"
+"\n"
+"Ви можете взяти участь у розробці і покращити програму."
+
+#. 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 ""
+"Розробка цієї програми ведеться відкрито спільнотою охочих розробників. "
+"Випуск здійснюється за умов ліцензування %s.\n"
+"\n"
+"Ви можете взяти участь у розробці і покращити програму."
+
+#: 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 ""
+"Розробка цієї програми виконується у закритому режимі, отже лише розробникам "
+"відомі принципи її роботи. У неї можуть бути проблеми із захистом, які важко "
+"виявити і які можуть з'явитися без належного нагляду.\n"
+"\n"
+"Ви не зможете робити внески у розвиток цієї програми."
+
+#. 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 ""
+"У поточній мережі ведеться облік обміну даними. Для з'єднань із обліком "
+"даних передбачено обмеження на обсяг даних або стягування сплати за обмін "
+"даними. Щоб заощадити ваші ресурси, автоматичне оновлення було призупинено.\n"
+"\n"
+"Автоматичне оновлення буде відновлено, коли стане доступною мережа без "
+"обліку обміну даними. Якщо така ситуація вас не влаштовує, до цього моменту "
+"ви можете встановлювати оновлення вручну.\n"
+"\n"
+"Крім того, якщо програма неправильно визначила характеристики поточної "
+"мережі як мережі із обліком, ви можете змінити значення параметра заборони "
+"оновлень у мережі з обліком."
+
+#: 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:104
+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 ""
+"Надає доступ до додаткового програмного забезпечення з %s. Включено частину "
+"програмного забезпечення із закритим кодом."
+
+#. 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:2824
+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 "Вилучити запис сховища %s?"
+
+#. 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 ""
+"Всі програми з %s буде вилучено, потрібно перевстановити сховище, щоб "
+"використовувати його знову."
+
+#. 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 "Ви справді хочете вилучити %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 буде вилучено. Щоб її використовувати знову, потрібно встановити її."
+
+#: 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 ""
+"Деякі з уже встановлених програм не сумісні з %s. Якщо продовжувати, таке "
+"буде вилучено протягом оновлення:"
+
+#: 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 ""
+"Програмне забезпечення, яке було встановлено з «%s», не отримуватиме "
+"оновлень."
+
+#: 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 "Додаткові сховища з вибраних сторонніх — %s."
+
+#: src/gs-repos-dialog.c:528
+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: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 ""
+"Ці сховища доповнюють типове програмне забезпечення, яке надається %s."
+
+#. 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] "Встановлено %u програму"
+msgstr[1] "Встановлено %u програми"
+msgstr[2] "Встановлено %u програм"
+msgstr[3] "Встановлено одну програму"
+
+#. 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 додаток"
+msgstr[1] "Встановлено %u додатки"
+msgstr[2] "Встановлено %u додатків"
+msgstr[3] "Встановлено один додаток"
+
+#. 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 програму"
+msgstr[1] "%u програми"
+msgstr[2] "%u програм"
+msgstr[3] "%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-repo-row.c:181
+#, 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 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 і %s"
+msgstr[1] "Встановлено %s і %s"
+msgstr[2] "Встановлено %s і %s"
+msgstr[3] "Встановлено %s і %s"
+
+#. 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 "Ненавиджу"
+
+#. 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Ознайомтеся із переліком даних, які буде надіслано, на нашій <a href="
+"\"https://odrs.gnome.org/privacy\">сторінці правил конфіденційності</a>. "
+"Кожен зможе бачити ім'я повністю, яке пов'язане з вашим обліковим записом."
+
+#: 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:93
+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: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 "%s є потенційно небезпечною"
+
+#. 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 не є безпечною"
+
+#. 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 "Застаріла версія 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 "Наступний знімок вікна"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "Знімок — неправильний"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, 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: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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "Неможливо звантажити оновлення з %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "Неможливо звантажити оновлення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "Неможливо звантажити оновлення: бракує місця на диску"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "Неможливо звантажити оновлення: потрібне засвідчення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "Неможливо звантажити оновлення: неправильне засвідчення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+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:1371
+#, c-format
+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:1377
+#, c-format
+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:1389
+#, c-format
+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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Неможливо встановити %s, бо не підтримується"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+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:1406
+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:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "Неможливо встановити %s: бракує місця на диску"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+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:1422
+#, c-format
+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:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1435
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "Не вдалося встановити %s: рівень заряду акумулятора є надто низьким"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+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:1502
+#, c-format
+msgid "Unable to update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr ""
+"Не вдалося встановити оновлення з %s, оскільки не вдалося отримати дані"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Не вдалося встановити оновлення, оскільки не вдалося отримати дані"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "Неможливо оновити %s: бракує місця на диску"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, 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:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "Неможливо оновити %s: потрібне засвідчення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, 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:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "Неможливо оновити %s: хибне засвідчення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, 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:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr "Неможливо оновити %s: бракує прав для оновлення програм"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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:1582
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1602
+#, 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:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "Неможливо оновити %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, 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:1658
+#, c-format
+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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1679
+#, c-format
+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:1686
+#, c-format
+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:1692
+#, c-format
+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:1698
+#, c-format
+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:1704
+#, c-format
+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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1719
+#, c-format
+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:1756
+#, c-format
+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:1761
+#, c-format
+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:1766
+#, c-format
+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:1772
+#, c-format
+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:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Не вдалося вилучити %s: рівень заряду акумулятора є надто низьким"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "Вибачте, щось не спрацювало"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "Не вдалося встановити файл: підтримки таких файлів не передбачено"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "Не вдалося встановити файл: помилка засвідчення"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "Не вдалося встановити: не передбачено підтримки"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+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:1961
+#, c-format
+msgid "Unable to contact %s"
+msgstr "Неможливо під'єднатись до %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr ""
+"Щоб скористатися новими додатками, програмне забезпечення доведеться "
+"перезапустити."
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "Потрібне живлення"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Дані з кешу можна витерти за допомогою <a href=\"dummy\">_параметрів "
+"програми</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (встановлено)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (встановлення)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (вилучення)"
+
+#. 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 "Встановлено на %s"
+
+#: src/gs-update-dialog.ui:77
+#| msgid "Software Update Installed"
+#| msgid_plural "Software Updates Installed"
+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] "Оновлено %u програму — слід перезавантажити систему"
+msgstr[1] "Оновлено %u програми — слід перезавантажити систему"
+msgstr[2] "Оновлено %u програм — слід перезавантажити систему"
+msgstr[3] "Оновлено %u програму — слід перезавантажити систему"
+
+#. 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 програму"
+msgstr[1] "Оновлено %u програми"
+msgstr[2] "Оновлено %u програм"
+msgstr[3] "Оновлено %u програму"
+
+#. 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 "Було оновлено %s і %s."
+
+#. 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 програма потребує перезапуску."
+msgstr[1] "%u програми потребують перезапуску."
+msgstr[2] "%u програм потребують перезапуску."
+msgstr[3] "%u програма потребує перезапуску."
+
+#. 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 "Нова версія %s доступна для встановлення"
+
+#. 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 "Вітаємо у %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] "Оновлення встановлено"
+msgstr[2] "Оновлення встановлено"
+msgstr[3] "Оновлення встановлено"
+
+#. 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] "Важливі оновлення системи встановлено."
+msgstr[2] "Важливі оновлення системи встановлено."
+msgstr[3] "Важливе оновлення системи встановлено."
+
+#. 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 "Востаннє перевірено: %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 припинено."
+
+#: 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 "Доступна %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:95
+#, c-format
+msgid "%s Available"
+msgstr "Доступна %s"
+
+#: 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 "Отримано %s з %s"
+
+#. 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%%"
+
+#: 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 "Оновлення %s із новими можливостями і виправленнями."
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "Службі оновлень EOS не вдалося отримати і застосувати оновлення."
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "Тенета GNOME"
+
+#: 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:404
+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 ""
+"Flatpak — система програм і бібліотек для роботи із програмами для робочих "
+"станцій на Linux"
+
+#. 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 "Тека системи %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Підтека домашньої теки %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "Теки основної системи"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "Налаштування основної системи з /etc"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "Тека стільниці"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "Підтека стільниці %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "Тека документів"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "Підтека документів %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "Тека музики"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Підтека музики %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "Тека зображень"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Підтека зображень %s"
+
+#: 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 "Підтека спільного ресурсу %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "Тека відео"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Підтека відео %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "Тека шаблонів"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Підтека шаблонів %s"
+
+#: 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 "Підтека кешу користувача %s"
+
+#: 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 "Підтека налаштувань користувача %s"
+
+#: 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 "Підтека даних користувача %s"
+
+#: 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 "Підтека середовища виконання користувача %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "Доступ до файлової системи %s"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "Отримуємо метадані flatpak для %s…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "Не вдалося додати для встановлення додатка «%s»: %s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "Не вдалося додати для вилучення додатка «%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 ""
+"Віддалене сховище «%s» забороняє встановлення «%s», ймовірно, через його "
+"фільтр. Вилучіть фільтр і повторіть встановлення. Докладне повідомлення про "
+"помилку: %s"
+
+#. 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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Оновлення 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "Оновлення налаштувань %s"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "Оновлення для камери %s"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "Оновлення для TPM %s"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "Оновлення для сенсорної панелі %s"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "Оновлення для миші %s"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "Оновлення для клавіатури %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"
+
+#. 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"
+
+#. 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"
+
+#. 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 "Оновлення 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "Оновлення для USB-приймача %s"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+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:2687
+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 "No updates have been installed on this system."
+#~ msgstr "Не встановлено жодного оновлення на цій системі."
+
+#~ msgid "Application manager for GNOME"
+#~ msgstr "Керування програмами в середовищі GNOME"
+
+#~ msgid "Name"
+#~ msgstr "Назва"
+
+#~ msgid "system"
+#~ 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 "_Restart Now"
+#~ 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 "Recently Updated"
+#~ msgstr "Нещодавно оновлені"
+
+#~ msgid "Recent Releases"
+#~ msgstr "Нещодавні випуски"
+
+#~ msgid "Remove “%s”?"
+#~ msgstr "Вилучити «%s»?"
+
+#~ msgid "Disable “%s”?"
+#~ msgstr "Вимкнути «%s»?"
+
+#~ msgid "Remove"
+#~ msgstr "Вилучити"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Немає додаткових джерел"
+
+#~ msgid "_Enable"
+#~ 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 "Navigation sidebar"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "_Explore"
+#~ msgstr "_Дослідити"
+
+#~ msgid "_Installed"
+#~ msgstr "_Встановлено"
+
+#~ msgid "_Updates"
+#~ 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, %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 "Два тижні тому"
+
+#~ 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/vi.po b/po/vi.po
new file mode 100644
index 0000000..877c0f1
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,6374 @@
+# 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 <roddy@endlessm.com>, 2016-2017
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2020-2022.
+#
+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: 2022-07-04 07:51+0000\n"
+"PO-Revision-Date: 2022-07-07 07:40+0700\n"
+"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <gnome-vi-list@gnome.org>\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 42.0\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 "Phần mềm"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:8
+msgid "Application manager for GNOME"
+msgstr "Quản lý ứng dụng dành cho GNOME"
+
+#: 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 ""
+"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 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 ""
+"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 điều khiển 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"
+
+#: data/metainfo/org.gnome.Software.metainfo.xml.in:1949
+msgid "The GNOME Project"
+msgstr "Dự án GNOME"
+
+#: 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 "Cảnh 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 cảnh 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 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"
+
+#: data/org.gnome.software.gschema.xml:71
+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: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 ""
+"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:81
+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:85
+msgid "The minimum karma score for reviews"
+msgstr "Điểm nghiệp tối thiểu để đánh giá"
+
+#: data/org.gnome.software.gschema.xml:86
+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:90
+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:94
+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:98
+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:102
+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:106
+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:110
+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:114
+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:118
+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:122
+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:126
+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:127
+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:131
+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: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 ""
+"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: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 ""
+"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."
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+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:145
+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:152
+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:159
+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:167
+#, 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:178
+#, c-format
+msgid "Failed to move: %s"
+msgstr "Gặp lỗi khi di chuyển: %s"
+
+#: src/gnome-software-local-file.desktop.in:3
+msgid "Software Install"
+msgstr "Cài đặt Phần mềm"
+
+#: src/gnome-software-local-file.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: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 "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 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 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:1027
+#, 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:1031
+#, c-format
+msgid "%s is suitable for young 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:1039
+#, 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:1043
+#, 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:1048
+#, 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:5 src/gs-app-context-bar.ui:211
+msgid "Age Rating"
+msgstr "Quy định tuổi"
+
+#: 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"
+msgstr "Làm thế nào để thêm thông tin còn thiếu"
+
+#: lib/gs-app.c:6158
+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:6174 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: lib/gs-app.c:6250
+msgid "Package"
+msgstr "Gói"
+
+#: src/gs-app-addon-row.c:97 src/gs-app-row.c:447
+msgid "Pending"
+msgstr "Đang chờ xử lý"
+
+#: src/gs-app-addon-row.c:101 src/gs-app-row.c:451 src/gs-details-page.c:353
+msgid "Pending install"
+msgstr "Chờ để cài đặt"
+
+#: src/gs-app-addon-row.c:105 src/gs-app-row.c:455 src/gs-details-page.c:360
+msgid "Pending remove"
+msgstr "Chờ gỡ bỏ"
+
+#: 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 "Đã cài đặt"
+
+#. 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:199 src/gs-details-page.c:346
+msgid "Installing"
+msgstr "Đang cài đặt"
+
+#: src/gs-app-addon-row.c:119
+msgid "Removing"
+msgstr "Đang xóa"
+
+#: src/gs-app-addon-row.ui:64
+msgid "_Uninstall"
+msgstr "_Gỡ bỏ cài đặt"
+
+#: src/gs-app-details-page.c:68
+msgid "Network"
+msgstr "Mạng"
+
+#: src/gs-app-details-page.c:68
+msgid "Can communicate over the network"
+msgstr "Không thể liên lạc qua mạng"
+
+#: src/gs-app-details-page.c:69
+msgid "System Services"
+msgstr "Dịch vụ Hệ thống"
+
+#: src/gs-app-details-page.c:69
+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:70
+msgid "Session Services"
+msgstr "Dịch vụ phiên làm việc"
+
+#: src/gs-app-details-page.c:70
+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:71
+msgid "Devices"
+msgstr "Thiết bị"
+
+#: src/gs-app-details-page.c:71
+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:72 src/gs-app-details-page.c:73
+msgid "Home folder"
+msgstr "Thư mục riêng (HOME)"
+
+#: 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:147
+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:73 src/gs-app-details-page.c:75
+#: src/gs-app-details-page.c:78 src/gs-app-details-page.c:142
+msgid "Can view files"
+msgstr "Có thể xem các tập tin"
+
+#: src/gs-app-details-page.c:74 src/gs-app-details-page.c:75
+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:77 src/gs-app-details-page.c:78
+msgid "Downloads folder"
+msgstr "Thư mục tải về"
+
+#: src/gs-app-details-page.c:79
+msgid "Settings"
+msgstr "Các cài đặt"
+
+#: src/gs-app-details-page.c:79
+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:80
+msgid "Legacy display system"
+msgstr "Hệ thống hiển thị cũ"
+
+#: src/gs-app-details-page.c:80
+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:81
+msgid "Sandbox escape"
+msgstr "Thoát khỏi sandbox"
+
+#: src/gs-app-details-page.c:81
+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 the source and upgrade version of an
+#. * application, shown to the user when they view more detailed
+#. * information about pending updates. The source is of the form
+#. * ‘deja-dup’ (a package name) or
+#. * ‘app/org.gnome.Builder/x86_64/main’ (a flatpak ID), and the
+#. * version is of the form ‘40.4-1.fc34’ (a version number).
+#: src/gs-app-details-page.c:177
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#. TRANSLATORS: this is where the packager did not write
+#. * a description for the update
+#: src/gs-app-details-page.c:196
+msgid "No update description available."
+msgstr "Không có mô tả cập nhật."
+
+#: 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 "Trở lại"
+
+#: src/gs-app-details-page.ui:48 src/gs-app-row.c:506
+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:800
+msgid "Reviews"
+msgstr "Đánh giá"
+
+#: src/gs-app-reviews-dialog.ui:25
+msgid "No reviews were found for this application."
+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:27
+msgid "No Reviews"
+msgstr "Không có đánh giá nào"
+
+#: src/gs-app-version-history-dialog.ui:6 src/gs-details-page.ui:478
+msgid "Version History"
+msgstr "Lịch sử Phiên bản"
+
+#: src/gs-app-version-history-row.c:71
+#, 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:78
+#, c-format
+msgid "Version %s"
+msgstr "Phiên bản %s"
+
+#: src/gs-app-version-history-row.c:80
+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: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 ""
+"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: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 "Show verbose debugging information"
+msgstr "Hiển thị thông tin gỡ rối chi tiết"
+
+#: 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 update preferences"
+msgstr "Hiển thị tuỳ thích cập nhật phần mềm"
+
+#: 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:246
+msgid "Copyright © 2016–2022 GNOME Software contributors"
+msgstr "Bản quyền © 2016–2022 những người đóng góp cho Phần mềm GNOME"
+
+#: src/gs-application.c:249
+msgid "translator-credits"
+msgstr "Nhóm Việt hóa GNOME <gnome-vi-list@gnome.org>"
+
+#. TRANSLATORS: this is the title of the about window
+#. TRANSLATORS: this is the menu item that opens the about window
+#: src/gs-application.c:262 src/gs-shell.c:2167
+msgid "About Software"
+msgstr "Giới thiệu Phần mềm"
+
+#. TRANSLATORS: well, we seem to think so, anyway
+#: src/gs-application.c:265
+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."
+
+#. TRANSLATORS: we tried to show an app that did not exist
+#: src/gs-application.c:454
+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 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 "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 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 "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:282
+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:293
+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:300
+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:307
+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:314
+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 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 "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:338
+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:345
+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:352
+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:359
+msgid "Can access arbitrary files"
+msgstr "Không thể truy cập các tập tin tùy ý"
+
+#. 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 "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:373 src/gs-safety-context-dialog.c:211
+msgid "Uses a legacy windowing system"
+msgstr "Dùng một hệ thống hiển 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:380 src/gs-safety-context-dialog.c:219
+msgid "Can acquire arbitrary permissions"
+msgstr "Có thể thu thập các quyền tùy ý"
+
+#. 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 "Được đánh giá bởi bản phân phối của bạn"
+
+#. 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 "Cung cấp bởi bên thứ ba"
+
+#. 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 "Mã độc quyề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:431
+msgid "Auditable code"
+msgstr "Mã có thể kiểm tra"
+
+#. 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 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 "Phần mềm không còn được hỗ trợ nữa"
+
+#. 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 "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:474
+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:481
+msgid "Unsafe"
+msgstr "Không an toàn"
+
+#: 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 "Chỉ trên di động"
+
+#: src/gs-app-context-bar.c:561
+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: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 "Chỉ máy tính để bàn"
+
+#: src/gs-app-context-bar.c:567
+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:571 src/gs-hardware-support-context-dialog.c:621
+msgid "Screen Size Mismatch"
+msgstr "Kích cỡ màn hình không khớp nhau"
+
+#: src/gs-app-context-bar.c:572 src/gs-hardware-support-context-dialog.c:622
+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:593 src/gs-hardware-support-context-dialog.c:674
+#: src/gs-hardware-support-context-dialog.c:680
+msgid "Requires a touchscreen"
+msgstr "Cần phải có màn hình cảm ứng"
+
+#: 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 "Cần phải có bàn phím"
+
+#: src/gs-app-context-bar.c:607
+msgid "Requires a mouse"
+msgstr "Cần phải có con chuột"
+
+#: src/gs-app-context-bar.c:618
+msgid "Gamepad Needed"
+msgstr "Cần phải có tay chơi game"
+
+#: src/gs-app-context-bar.c:619
+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:643
+msgid "Adaptive"
+msgstr "Thích nghi"
+
+#: src/gs-app-context-bar.c:644
+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:657
+msgid "Probably requires a keyboard or mouse"
+msgstr "Gần như chắc chắn là cần một bàn phím hoặc con chuột"
+
+#: src/gs-app-context-bar.c:662
+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:705
+msgid "Contains no age-inappropriate content"
+msgstr "Ứng dụng có chứa nội dung không phù hợp với lứa tuổi"
+
+#: src/gs-app-context-bar.c:753
+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 application to be easily installed
+#: src/gs-app-row.c:147
+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 application to be easily installed.
+#. * The ellipsis indicates that further steps are required
+#: src/gs-app-row.c:153
+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 application
+#: src/gs-app-row.c:161 src/gs-updates-section.ui:62
+msgid "Cancel"
+msgstr "Hủy"
+
+#. 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:169 src/gs-common.c:286 src/gs-page.c:374
+msgid "Install"
+msgstr "Cài đặt"
+
+#. TRANSLATORS: this is a button in the updates panel
+#. * that allows the app to be easily updated live
+#: src/gs-app-row.c:177
+msgid "Update"
+msgstr "Cập nhật"
+
+#. 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:182 src/gs-app-row.c:192 src/gs-details-page.ui:276
+#: src/gs-page.c:543
+msgid "Uninstall"
+msgstr "Gỡ bỏ"
+
+#. TRANSLATORS: this is a button next to the search results that
+#. * shows the status of an application being erased
+#: src/gs-app-row.c:206
+msgid "Uninstalling"
+msgstr "Đang gỡ bỏ"
+
+#. TRANSLATORS: during the update the device
+#. * will restart into a special update-only mode
+#: src/gs-app-row.c:317
+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:327 src/gs-shell-search-provider.c:264
+#, 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:513
+#, c-format
+msgid "Renamed from %s"
+msgstr "Được đổi tên từ %s"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "Giúp dịch %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 đượ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:5
+msgid "Translations"
+msgstr "Các bản dịch"
+
+#: src/gs-app-translation-dialog.ui:92
+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:13
+msgid "Login Required"
+msgstr "Phải đăng nhập"
+
+#: src/gs-basic-auth-dialog.ui:21 src/gs-common.c:612
+#: src/gs-details-page.ui:289 src/gs-removal-dialog.ui:17
+#: src/gs-review-dialog.ui:18
+msgid "_Cancel"
+msgstr "_Hủy"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "Đăn_g nhập"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "Tài kh_oản"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "Mật _khẩu"
+
+#. TRANSLATORS: this is where all applications 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:41 src/gs-overview-page.ui:110
+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:133
+msgid "New & Updated"
+msgstr "Mới & Đã cập nhật"
+
+#. Heading for web apps on a category page
+#: src/gs-category-page.ui:97
+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:125
+msgid "Other Software"
+msgstr "Phần mềm khác"
+
+#. 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 "Vui lòng nhập một số từ 1 đến %u: "
+
+#. TRANSLATORS: asking the user to choose an app from a list
+#: lib/gs-cmd.c:258
+msgid "Choose an application:"
+msgstr "Chọn một ứng dụng:"
+
+#: 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"
+
+#: 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"
+
+#: 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 "Mái vòm"
+
+#: 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 "Chát"
+
+#: 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 "Kiểu 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 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 giờ đã được cài đặt"
+
+#. 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 "Phải khởi động lại để các thay đổi được áp dụng."
+
+#. 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 "Ứ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:84
+msgid "System updates are now installed"
+msgstr "Các cập nhật HĐH hiện đã được cài đặt xong"
+
+#. 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 "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:106 src/gs-common.c:775
+msgid "Restart"
+msgstr "Khởi động lại"
+
+#: src/gs-common.c:112
+msgid "Launch"
+msgstr "Khởi chạy"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:218
+msgid "Install Third-Party Software?"
+msgstr "Cài đặt Phần mềm Bên thứ ba?"
+
+#. TRANSLATORS: window title
+#: src/gs-common.c:222 src/gs-repos-dialog.c:168
+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. Application name, e.g. "Firefox"
+#. * 2. Software repository name, e.g. fedora-optional
+#.
+#: src/gs-common.c:240
+#, c-format
+msgid ""
+"%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s không phải là <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">phần mềm tự do và nguồn mở</a>, phần mềm này do “%s” cung "
+"cấp."
+
+#. 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 được cung cấp bởi “%s”."
+
+#: src/gs-common.c:259
+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:269
+#, 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:275
+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:282
+msgid "Don’t Warn Again"
+msgstr "Đừng cảnh báo lại nữa"
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:291
+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:493
+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:509 src/gs-safety-context-dialog.ui:72
+msgid "Details"
+msgstr "Chi tiết"
+
+#. Translators: an accept button label, in a Cancel/Accept dialog
+#: src/gs-common.c:600
+msgid "_Accept"
+msgstr "_Chấp nhận"
+
+#. 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] "Các bản cập nhật đã được cài đặt"
+
+#. 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] "Một ứng dụng vừa bị gỡ bỏ"
+
+#. 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] "Phải khởi động lại để nó được áp dụng."
+
+#. TRANSLATORS: button text
+#: src/gs-common.c:773
+msgid "Not Now"
+msgstr "Không phải Bây giờ"
+
+#. TRANSLATORS: something happened less than 5 minutes ago
+#: src/gs-common.c:869
+msgid "Just now"
+msgstr "Vừa xong"
+
+#: src/gs-common.c:871
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] "%d phút trước"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d giờ trước"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d ngày trước"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d tuần trước"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d tháng trước"
+
+#: src/gs-common.c:891
+#, 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:982
+#, 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 "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:332
+msgid "Find in Software"
+msgstr "Tìm trong Phần mềm"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "_Hiển thị thêm"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "_Hiển thị ít"
+
+#: src/gs-details-page.c:341
+msgid "Removing…"
+msgstr "Đang xóa…"
+
+#: src/gs-details-page.c:351
+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:358
+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:375
+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:382
+msgid "Pending update…"
+msgstr "Cập nhật đang chờ…"
+
+#. Translators: This string is shown when preparing to download and install an app.
+#: src/gs-details-page.c:398
+msgid "Preparing…"
+msgstr "Đang chuẩn bị…"
+
+#. Translators: This string is shown when uninstalling an app.
+#: src/gs-details-page.c:401
+msgid "Uninstalling…"
+msgstr "Đang gỡ bỏ…"
+
+#. 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:828 src/gs-details-page.c:854
+#: src/gs-details-page.ui:223 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "_Cài đặt"
+
+#: src/gs-details-page.c:844
+msgid "_Restart"
+msgstr "_Khởi động lạ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:868
+msgid "_Install…"
+msgstr "_Cài đặt…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1139
+#, c-format
+msgid "Other Apps by %s"
+msgstr "Ứng dụng khác của %s"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1522
+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:1670 src/gs-details-page.c:1686
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "Không tìm thấy “%s”"
+
+#: src/gs-details-page.ui:7
+msgid "Details page"
+msgstr "Trang thông tin chi tiết"
+
+#: src/gs-details-page.ui:42
+msgid "Loading application details…"
+msgstr "Đang tải chi tiết về ứng dụng…"
+
+#: src/gs-details-page.ui:80
+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ỹ."
+
+#: src/gs-details-page.ui:86
+msgid "Help _Translate"
+msgstr "Hỗ trợ _dịch"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:239
+msgid "_Open"
+msgstr "_Mở"
+
+#: src/gs-details-page.ui:252 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "_Cập nhật"
+
+#: src/gs-details-page.ui:314
+msgid "Downloading"
+msgstr "Đang tải về"
+
+#: src/gs-details-page.ui:401 src/gs-installed-page.ui:135
+msgid "Add-ons"
+msgstr "Tiện ích bổ sung"
+
+#: src/gs-details-page.ui:412
+msgid "Selected add-ons will be installed with the application."
+msgstr "Các tiện tích bổ sung được chọn sẽ được cài đặt cùng với ứng dụng."
+
+#: src/gs-details-page.ui:512
+msgid ""
+"This application 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:532
+msgid "Software Repository Included"
+msgstr "Kho phần mềm đã được bao gồm"
+
+#: src/gs-details-page.ui:533
+msgid ""
+"This application 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:550
+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:551
+msgid ""
+"This application 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."
+
+#: src/gs-details-page.ui:569
+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ế."
+
+#. Translators: a repository file used for installing software has been discovered.
+#: src/gs-details-page.ui:586
+msgid "Software Repository Identified"
+msgstr "Kho phần mềm được xác định"
+
+#: src/gs-details-page.ui:587
+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:588
+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:653
+msgid "No Metadata"
+msgstr "Không có siêu dữ liệu"
+
+#: src/gs-details-page.ui:662
+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.ui:690
+msgid "Project _Website"
+msgstr "Trang _web dự án"
+
+#: src/gs-details-page.ui:707
+msgid "_Donate"
+msgstr "_Quyên góp"
+
+#: src/gs-details-page.ui:724
+msgid "Contribute _Translations"
+msgstr "Những người đóng góp _dịch"
+
+#: src/gs-details-page.ui:741
+msgid "_Report an Issue"
+msgstr "_Báo cáo một lỗi"
+
+#: src/gs-details-page.ui:758
+msgid "_Help"
+msgstr "_Trợ giúp"
+
+#. Translators: Button opening a dialog where the users can write and publish their opinions about the apps.
+#: src/gs-details-page.ui:847
+msgid "_Write Review"
+msgstr "_Viết đánh giá"
+
+#. Translators: Button opening a dialog showing all reviews for an app.
+#: src/gs-details-page.ui:884
+msgid "All Reviews"
+msgstr "Mọi đánh giá"
+
+#. TRANSLATORS: status text when downloading
+#: lib/gs-external-appstream-utils.c:216
+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:141
+msgid " and "
+msgstr " và "
+
+#. TRANSLATORS: separator for a list of items
+#: src/gs-extras-page.c:144
+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:170
+#, 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: Application window title for codec installation.
+#. %s will be replaced by actual codec name(s)
+#: src/gs-extras-page.c:178
+#, 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:342
+#, c-format
+msgid "%s not found"
+msgstr "Không tìm thấy %s"
+
+#. TRANSLATORS: hyperlink title
+#: src/gs-extras-page.c:346
+msgid "on the website"
+msgstr "trên website"
+
+#. 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:353
+#, c-format
+msgid "No applications 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:357 src/gs-extras-page.c:368 src/gs-extras-page.c:379
+#, c-format
+msgid ""
+"Information about %s, as well as options for how to get missing applications "
+"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 bỏ lỡ trên trang web %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:364 src/gs-extras-page.c:386
+#, c-format
+msgid "No applications 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:375
+#, 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:390
+#, 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 ""
+"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 %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:397
+#, 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:401
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:408
+#, 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:412
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:419
+#, 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:423
+#, 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 application or
+#. * addon, but it can't be listed for some reason
+#: src/gs-extras-page.c:430
+#, 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:434
+#, 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:480
+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 application name, which requested the codecs, the third %s is a link titled "the documentation"
+#: src/gs-extras-page.c:486
+#, 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:495
+#, 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:573 src/gs-extras-page.c:630 src/gs-extras-page.c:670
+#, 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:866
+#, c-format
+msgid "%s file format"
+msgstr "Định dạng tập tin %s"
+
+#: src/gs-extras-page.c:1241
+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:6
+msgid "Codecs page"
+msgstr "Trang mã hóa - giải 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:577
+#: src/gs-hardware-support-context-dialog.c:586
+msgid "Desktop Support"
+msgstr "Hỗ trợ máy tính để bàn"
+
+#: 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 "Hỗ trợ dùng trên một màn hình lớn"
+
+#: src/gs-hardware-support-context-dialog.c:580
+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:581
+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:584
+msgid "Requires a large screen"
+msgstr "Cần có một màn hình lớn"
+
+#: src/gs-hardware-support-context-dialog.c:589
+msgid "Desktop Not Supported"
+msgstr "Không hỗ trợ máy tính để bàn"
+
+#: src/gs-hardware-support-context-dialog.c:590
+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:597
+#: src/gs-hardware-support-context-dialog.c:606
+msgid "Mobile Support"
+msgstr "Hỗ trợ di động"
+
+#: 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 "Hỗ trợ dùng trên một màn hình nhỏ"
+
+#: src/gs-hardware-support-context-dialog.c:600
+msgid "Mobile Support Unknown"
+msgstr "Không biết có hỗ trợ di động hay không"
+
+#: src/gs-hardware-support-context-dialog.c:601
+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:604
+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:609
+msgid "Mobile Not Supported"
+msgstr "Không hỗ trợ dùng trên di động"
+
+#: src/gs-hardware-support-context-dialog.c:610
+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:633
+#: src/gs-hardware-support-context-dialog.c:642
+msgid "Keyboard Support"
+msgstr "Hỗ trợ bàn phím"
+
+#: src/gs-hardware-support-context-dialog.c:636
+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:637
+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:639
+msgid "Keyboard Required"
+msgstr "Cần bàn phím"
+
+#: src/gs-hardware-support-context-dialog.c:643
+msgid "Supports keyboards"
+msgstr "Hỗ trợ bàn phím"
+
+#: src/gs-hardware-support-context-dialog.c:645
+msgid "Keyboard Not Supported"
+msgstr "Không hỗ trợ bàn phím"
+
+#: src/gs-hardware-support-context-dialog.c:646
+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:653
+#: src/gs-hardware-support-context-dialog.c:662
+msgid "Mouse Support"
+msgstr "Hỗ trợ con chuột"
+
+#: src/gs-hardware-support-context-dialog.c:654
+#: src/gs-hardware-support-context-dialog.c:660
+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:656
+msgid "Mouse Support Unknown"
+msgstr "Không biết có hỗ trợ con chuột không"
+
+#: src/gs-hardware-support-context-dialog.c:657
+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:659
+msgid "Mouse Required"
+msgstr "Cần có chuột"
+
+#: src/gs-hardware-support-context-dialog.c:663
+msgid "Supports mice and pointing devices"
+msgstr "Hỗ trợ con chuột và thiết bị trỏ"
+
+#: src/gs-hardware-support-context-dialog.c:665
+msgid "Mouse Not Supported"
+msgstr "Không hỗ trợ con chuột"
+
+#: src/gs-hardware-support-context-dialog.c:666
+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:673
+#: src/gs-hardware-support-context-dialog.c:682
+msgid "Touchscreen Support"
+msgstr "Hỗ trợ màn hình cảm ứng"
+
+#: src/gs-hardware-support-context-dialog.c:676
+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:677
+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:679
+msgid "Touchscreen Required"
+msgstr "Cần phải có màn hình cảm ứng"
+
+#: src/gs-hardware-support-context-dialog.c:683
+msgid "Supports touchscreens"
+msgstr "Hỗ trợ màn hình cảm ứng"
+
+#: src/gs-hardware-support-context-dialog.c:685
+msgid "Touchscreen Not Supported"
+msgstr "Không hỗ trợ màn hình cảm ứng"
+
+#: src/gs-hardware-support-context-dialog.c:686
+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:699
+msgid "Gamepad Required"
+msgstr "Cần phải có tay chơi game"
+
+#: src/gs-hardware-support-context-dialog.c:700
+msgid "Requires a gamepad"
+msgstr "Cần phải có tay chơi game"
+
+#: src/gs-hardware-support-context-dialog.c:702
+msgid "Gamepad Support"
+msgstr "Hỗ trợ tay chơi game"
+
+#: src/gs-hardware-support-context-dialog.c:703
+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:712
+#, 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:719
+#, c-format
+msgid "%s works on this device"
+msgstr "%s 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:726
+#, 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:733
+#, 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:5
+msgid "Hardware Support"
+msgstr "Hỗ trợ phần cứng"
+
+#. 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:761 src/gs-shell.ui:307
+msgctxt "List of installed apps"
+msgid "Installed"
+msgstr "Đã cài đặt"
+
+#: src/gs-installed-page.ui:6
+msgid "Installed page"
+msgstr "Trang đã cài đặt"
+
+#: src/gs-installed-page.ui:55
+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:75 plugins/flatpak/gs-flatpak-utils.c:107
+msgid "Applications"
+msgstr "Ứng dụng"
+
+#: src/gs-installed-page.ui:95
+msgid "Web Applications"
+msgstr "Ứng dụng Web"
+
+#: src/gs-installed-page.ui:115
+msgid "System Applications"
+msgstr "Ứng dụng Hệ thống"
+
+#: src/gs-license-tile.c:93
+msgid "Community Built"
+msgstr "Bản biên dịch từ cộng đồng"
+
+#. Translators: The placeholder here is the name of a software license.
+#: src/gs-license-tile.c:106
+#, 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 ""
+"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ó thậm chí tốt hơn."
+
+#: src/gs-license-tile.c:111
+msgid "Proprietary"
+msgstr "Quyền sở hữu"
+
+#: src/gs-license-tile.c:118
+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."
+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. Ở đây có thể có hạn chế sử dụng, và nó có "
+"thể nói nó có an toàn hay không.\n"
+"\n"
+"\n"
+"Bạn có không thể đóng góp cho phần mềm này hay phát huy nó."
+
+#: src/gs-license-tile.ui:96
+msgid "_Get Involved"
+msgstr "_Muốn tham gia"
+
+#. TRANSLATORS: initial start
+#: src/gs-loading-page.c:56
+msgid "Software catalog is being downloaded"
+msgstr "Ca-ta-lô phần mềm đang được tải xuống"
+
+#: src/gs-loading-page.ui:6
+msgid "Loading page"
+msgstr "Đang tải trang"
+
+#: src/gs-loading-page.ui:11
+msgid "Starting up…"
+msgstr "Đang khởi động…"
+
+#: src/gs-metered-data-dialog.ui:5 src/gs-shell.ui:256
+msgid "Automatic Updates Paused"
+msgstr "Tự động cập nhật bị tạm dừng"
+
+#: 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 ""
+"Mạng hiện thời được đo đếm. Kết nối bằng gói dữ liệu theo lưu lượng sử dụng "
+"có giới hạn dữ liệu hoặc các khoản phí được liên kết với chúng. Do đó, để "
+"tiết kiệm, các bản cập nhật tự động bị tạm dừng.\n"
+"\n"
+"Cập nhật tự động sẽ được tiếp tục khi một mạng dùng thoải mái trở nên có "
+"sẵn. Cho đến lúc đó, vẫn có thể cài đặt bản cập nhật theo cách thủ công.\n"
+"\n"
+"Ngoài ra, nếu mạng hiện tại đã được xác định không chính xác là đang được "
+"đo, cài đặt này có thể được thay đổi."
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "Mở _Cài đặt Mạng"
+
+#: src/gs-moderate-page.ui:6
+msgid "Moderate page"
+msgstr "Trang kiểm soát"
+
+#: src/gs-moderate-page.ui:71
+msgid "There are no reviews to moderate"
+msgstr "Không có đánh giá nào để kiểm soát"
+
+#. TRANSLATORS: This is followed by a file name, e.g. "Name: gedit.rpm"
+#: src/gs-origin-popover-row.c:55
+msgid "Name"
+msgstr "Tên"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:72
+msgid "system"
+msgstr "hệ thống"
+
+#. TRANSLATORS: the installation location for flatpaks
+#: src/gs-origin-popover-row.c:75
+msgid "user"
+msgstr "người dùng"
+
+#. TRANSLATORS: the title for Snap channels
+#: src/gs-origin-popover-row.c:91
+msgid "Channel"
+msgstr "Kênh"
+
+#. TRANSLATORS: the title for Flatpak branches
+#. Translators: The branch, e.g. 'stable' or '3.32'
+#: src/gs-origin-popover-row.c:96 src/gs-origin-popover-row.ui:82
+msgid "Branch"
+msgstr "Nhánh"
+
+#: src/gs-origin-popover-row.ui:30
+msgid "URL"
+msgstr "URL"
+
+#. Translators: The installation location for flatpaks, e.g. 'user' or 'system'
+#: src/gs-origin-popover-row.ui:56
+msgid "Installation"
+msgstr "Cài đặt"
+
+#. Translators: The available version of an app
+#: src/gs-origin-popover-row.ui:108
+msgid "Version"
+msgstr "Phiên bản"
+
+#. TRANSLATORS: This is the header for package additions during
+#. * a system update
+#: src/gs-os-update-page.c:250
+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:254
+msgid "Removals"
+msgstr "Các tệp đã gỡ"
+
+#. 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 "Các cập nhật"
+
+#. TRANSLATORS: This is the header for package downgrades during
+#. * a system update
+#: src/gs-os-update-page.c:262
+msgid "Downgrades"
+msgstr "Hạ cấp"
+
+#. 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:853
+msgid "selected external sources"
+msgstr "các nguồn bên ngoài đã chọn"
+
+#. Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link.
+#: src/gs-overview-page.c:855
+#, c-format
+msgid ""
+"Provides access to additional software from %s. Some proprietary software is "
+"included."
+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."
+
+#. TRANSLATORS: button to turn on third party software repositories
+#. TRANSLATORS: button to accept the agreement
+#: src/gs-overview-page.c:864 src/gs-repos-dialog.c:173
+msgid "Enable"
+msgstr "Bật"
+
+#. 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:923 src/gs-shell.ui:294
+msgid "Explore"
+msgstr "Khám phá"
+
+#: src/gs-overview-page.ui:7
+msgid "Overview page"
+msgstr "Trang tổng quan"
+
+#: src/gs-overview-page.ui:39
+msgid "Enable Third Party Software Repositories?"
+msgstr "Kích hoạt Kho Phần mềm Bên Thứ ba?"
+
+#. Translators: This is a heading for a list of categories.
+#: src/gs-overview-page.ui:184
+msgid "Other Categories"
+msgstr "Danh mục khác"
+
+#: src/gs-overview-page.ui:225
+msgid "No Application Data Found"
+msgstr "Không Tìm thấy Dữ liệu Ứng dụng"
+
+#: lib/gs-plugin-loader.c:3061
+msgctxt "Distribution name"
+msgid "Unknown"
+msgstr "Không rõ"
+
+#: src/gs-page.c:274
+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 application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:365
+#, 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:512
+#, 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
+#: src/gs-page.c:516
+#, c-format
+msgid ""
+"All applications 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 an
+#. * application summary, e.g. 'GNOME Clocks'
+#: src/gs-page.c:524
+#, 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?"
+
+#. TRANSLATORS: longer dialog text
+#: src/gs-page.c:527
+#, 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ó."
+
+#: src/gs-prefs-dialog.ui:5
+msgid "Update Preferences"
+msgstr "Tuỳ thích cập nhật phần mềm"
+
+#: 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 ""
+"Để 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."
+
+#: src/gs-prefs-dialog.ui:19
+msgid "Automatic Updates"
+msgstr "Tự động cập nhật"
+
+#: src/gs-prefs-dialog.ui:20
+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 trong nền hệ thống khi có thể."
+
+#: src/gs-prefs-dialog.ui:32
+msgid "Automatic Update Notifications"
+msgstr "Tự động thông báo cập nhật bật"
+
+#: src/gs-prefs-dialog.ui:33
+msgid "Show notifications 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."
+
+#. 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 ""
+"Một số phần mềm hiện được cài đặt không tương thích với %s. Nếu bạn tiếp "
+"tục, các phần mềm sau sẽ bị tự động gỡ bỏ trong quá trình nâng cấp:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "Phần mềm Không tương thích"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "_Tiếp tục"
+
+#. 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 "Phần mềm đã được cài đặt từ “%s” sẽ không còn nhận được bản cập nhật."
+
+#: src/gs-repos-dialog.c:248
+msgid "Disable Repository?"
+msgstr "Tắt 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:254
+msgid "_Disable"
+msgstr "_Tắt"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "Gỡ _bỏ"
+
+#: src/gs-repos-dialog.c:505
+msgid "Enable New Repositories"
+msgstr "Bật kho phần mềm mới"
+
+#: src/gs-repos-dialog.c:506
+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:515
+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:520
+#, 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:525
+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:667
+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:725
+#, 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."
+
+#. button in the info bar
+#: src/gs-repos-dialog.ui:8 src/gs-shell.ui:88
+msgid "Software Repositories"
+msgstr "Kho Phần mềm"
+
+#: src/gs-repos-dialog.ui:56
+msgid "No Repositories"
+msgstr "Không có kho Phần mềm"
+
+#. 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 ứng dụng đã được cài đặt"
+
+#. 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] "Đã cài đặt %u tiện ích"
+
+#. 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 ứng dụng"
+
+#. 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 tiện ích"
+
+#. 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 và %s đã được cài đặt"
+
+#. 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 "Ghét nó"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * Not a great application
+#: src/gs-review-dialog.c:82
+msgid "Don’t like it"
+msgstr "Không thích nó"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A fairly-good application
+#: src/gs-review-dialog.c:86
+msgid "It’s OK"
+msgstr "Dùng ổn"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A good application
+#: src/gs-review-dialog.c:90
+msgid "Like it"
+msgstr "Thích nó"
+
+#. TRANSLATORS: lighthearted star rating description;
+#. * A really awesome application
+#: src/gs-review-dialog.c:94
+msgid "Love it"
+msgstr "Yêu nó"
+
+#. 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 "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:122
+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:126
+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:130
+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:134
+msgid "The description is too short"
+msgstr "Mô tả quá ngắn"
+
+#. TRANSLATORS: the review is not acceptable
+#: src/gs-review-dialog.c:138
+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:10
+msgid "Post Review"
+msgstr "Đăng đánh giá"
+
+#. Translators: A button to publish the user's opinion about the app.
+#: src/gs-review-dialog.ui:26
+msgid "_Post"
+msgstr "Đăn_g"
+
+#: src/gs-review-dialog.ui:56
+msgid "Rating"
+msgstr "Đánh giá"
+
+#: src/gs-review-dialog.ui:88
+msgid "Summary"
+msgstr "Tóm tắt"
+
+#: src/gs-review-dialog.ui:97
+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ó\"."
+
+#. Translators: This is where the users enter their opinions about the apps.
+#: src/gs-review-dialog.ui:119
+msgctxt "app review"
+msgid "Review"
+msgstr "Đánh giá"
+
+#: src/gs-review-dialog.ui:128
+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."
+
+#: src/gs-review-dialog.ui:156
+msgid ""
+"Find what data is sent in our <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"Tìm dữ liệu nào được gửi trong <a href=\"https://odrs.gnome.org/privacy"
+"\">chính sách bảo mật</a> 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:92
+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:220
+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:225
+msgid ""
+"Once reported, a review will be hidden until it has been checked by an "
+"administrator."
+msgstr ""
+"Khi được báo cáo, một đá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:239
+msgid "Report Review?"
+msgstr "Báo Cáo Đánh Giá?"
+
+#. TRANSLATORS: button text when
+#. * sending a review for moderation
+#: src/gs-review-row.c:243
+msgid "Report"
+msgstr "Báo cáo"
+
+#. 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 "Đánh giá này có hữu ích đối với bạn không?"
+
+#: src/gs-review-row.ui:100
+msgid "Yes"
+msgstr "Có"
+
+#: src/gs-review-row.ui:108
+msgid "No"
+msgstr "Không"
+
+#. Translators: Button text for indifference, only used when moderating
+#: src/gs-review-row.ui:116
+msgid "Meh"
+msgstr "Thờ ơ"
+
+#: src/gs-review-row.ui:128
+msgid "Report…"
+msgstr "Báo cáo…"
+
+#: src/gs-review-row.ui:137
+msgid "Remove…"
+msgstr "Xóa bỏ…"
+
+#: src/gs-safety-context-dialog.c:144
+msgid "Check that you trust the vendor, as the application 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"
+
+#: src/gs-safety-context-dialog.c:147
+msgid ""
+"Application 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 đã kiểm tra thấy rằng nó "
+"không phải là độc hại"
+
+#. 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 "Không quyền hạn"
+
+#: src/gs-safety-context-dialog.c:161
+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:172
+msgid "Network Access"
+msgstr "Truy cập mạng"
+
+#: src/gs-safety-context-dialog.c:173
+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:176
+msgid "No Network Access"
+msgstr "Không truy cập mạng"
+
+#: src/gs-safety-context-dialog.c:177
+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:183
+msgid "Uses System Services"
+msgstr "Sử dụng dịch vụ hệ thống"
+
+#: src/gs-safety-context-dialog.c:184
+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:191
+msgid "Uses Session Services"
+msgstr "Dùng dịch vụ phiên làm việc"
+
+#: src/gs-safety-context-dialog.c:192
+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:199
+msgid "Device Access"
+msgstr "Truy cập thiết bị"
+
+#: src/gs-safety-context-dialog.c:200
+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:203
+msgid "No Device Access"
+msgstr "Không truy cập thiết bị"
+
+#: src/gs-safety-context-dialog.c:204
+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:210
+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:218
+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:226
+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:238
+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:239
+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:247
+msgid "Home Folder Read/Write Access"
+msgstr "Truy cập đọc ghi thư mục riêng"
+
+#: src/gs-safety-context-dialog.c:248
+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:256
+msgid "Full File System Read Access"
+msgstr "Truy cập đọc hệ thống tập tin đầy đủ"
+
+#: src/gs-safety-context-dialog.c:257
+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:266
+msgid "Home Folder Read Access"
+msgstr "Truy cập đọc thư mục riêng"
+
+#: src/gs-safety-context-dialog.c:267
+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:276
+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:277
+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:288
+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:289
+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:299
+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:310
+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:326
+msgid "No File System Access"
+msgstr "Không truy cập Hệ thống tập tin"
+
+#: src/gs-safety-context-dialog.c:327
+msgid "Cannot access the file system at all"
+msgstr "Không thể truy cập 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:341
+msgid "Proprietary Code"
+msgstr "Mã độc quyền"
+
+#: 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 ""
+"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: 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 "Mã kiểm định được"
+
+#: 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 ""
+"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: 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 "Nhà phát triển ứng dụng đã được xác thực"
+
+#: src/gs-safety-context-dialog.c:355
+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:366
+msgid "Insecure Dependencies"
+msgstr "Các phần phụ thuộc không an toàn"
+
+#: src/gs-safety-context-dialog.c:367
+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"
+
+#. 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 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:383
+#, c-format
+msgid "%s is potentially unsafe"
+msgstr "%s tiềm ẩn thiếu 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:390
+#, c-format
+msgid "%s is unsafe"
+msgstr "%s không an toàn"
+
+#. 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 "An toàn"
+
+#: src/gs-safety-context-dialog.ui:101
+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:141
+msgid "Source"
+msgstr "Mã nguồn"
+
+#: src/gs-safety-context-dialog.ui:181
+msgid "SDK"
+msgstr "SDK"
+
+#: src/gs-safety-context-dialog.ui:205
+msgid "Outdated SDK version"
+msgstr "Phiên bản SDK đã lỗi thời"
+
+#. 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"
+
+#: src/gs-screenshot-carousel.ui:127
+msgid "No screenshot provided"
+msgstr "Không có ảnh màn hình nào được cung cấp"
+
+#. TRANSLATORS: this is when we try to download a screenshot and
+#. * we get back 404
+#: src/gs-screenshot-image.c:355 src/gs-screenshot-image.c:412
+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:431
+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:582
+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:663
+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:677
+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:709
+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:169
+#, 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:6
+msgid "Search page"
+msgstr "Tìm kiếm trang"
+
+#: src/gs-search-page.ui:17
+msgid "Search for Apps"
+msgstr "Tìm kiếm các ứng dụng"
+
+#: src/gs-search-page.ui:46
+msgid "No Application 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:1217 src/gs-shell.c:1222 src/gs-shell.c:1237
+#: src/gs-shell.c:1241
+#, 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:1258
+#, 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:1293
+#, c-format
+msgid "Unable to download firmware updates from %s"
+msgstr "Không thể tải về các cập nhật phần sụn 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:1299
+#, 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:1306 src/gs-shell.c:1346
+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:1311
+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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the source (e.g. "alt.fedoraproject.org")
+#: src/gs-shell.c:1319
+#, 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:1324
+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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1330
+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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1334
+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ệ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1338
+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:1349
+msgid "Unable to get list of updates"
+msgstr "Không thể nhận danh sách các cập nhật"
+
+#. 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:1391
+#, c-format
+msgid "Unable to install %s as download failed from %s"
+msgstr "Không thể cài đặt %s do không tải về được từ %s"
+
+#. 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 download failed"
+msgstr "Không thể cài đặt %s do không tải về được"
+
+#. 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:1409
+#, c-format
+msgid "Unable to install %s as runtime %s not available"
+msgstr "Không thể cài đặt %s do %s chạy thực không khả dụng"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1415
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "Không thể cài đặt %s do không được hỗ trợ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1421
+msgid "Unable to install: internet access was required but wasn’t available"
+msgstr ""
+"Không thể cài đặt: quyền truy cập internet là bắt buộc nhưng không khả dụng"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1426
+msgid "Unable to install: the application has an invalid format"
+msgstr "Không thể cài đặt: ứng dụng có định dạng không hợp lệ"
+
+#. 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: not enough disk space"
+msgstr "Không thể cài đặt %s: không đủ chỗ trống trên ổ đĩa"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1436
+#, c-format
+msgid "Unable to install %s: authentication was required"
+msgstr "Không thể cài đặt %s: phải có chứng thực"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1442
+#, c-format
+msgid "Unable to install %s: authentication was invalid"
+msgstr "Không thể cài đặt %s: chứng thực không hợp lệ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1448
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1455
+#, c-format
+msgid "Unable to install %s: AC power is required"
+msgstr "Không thể cài đặt %s: cần phải có nguồn điện lưới xoay chiều"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1461
+#, 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"
+
+#. 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 install %s"
+msgstr "Không thể cài đặt %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:1515
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "Không thể cập nhật %s từ %s do không tải về được"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1522
+#, c-format
+msgid "Unable to update %s as download failed"
+msgstr "Không thể cập nhật %s do 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:1529
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "Không thể cài đặt cập nhật %s do không tải về được"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1533
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "Không thể cài đặt cập nhật do không tải về được"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1538
+msgid "Unable to update: internet access was required but wasn’t available"
+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,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1547
+#, 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
+#: src/gs-shell.c:1552
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1561
+#, c-format
+msgid "Unable to update %s: authentication was 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
+#: src/gs-shell.c:1566
+#, 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"
+
+#. 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 update %s: authentication was invalid"
+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
+#: src/gs-shell.c:1579
+#, 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ệ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1587
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1593
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1602
+#, c-format
+msgid "Unable to update %s: AC power is required"
+msgstr "Không thể cập nhật %s: Cần phải cắm máy vào điện lưới"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1608
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1616
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "Dell XPS 13")
+#: src/gs-shell.c:1622
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1633
+#, 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:1636
+#, c-format
+msgid "Unable to install updates"
+msgstr "Không thể cài đặt các cập nhật"
+
+#. 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:1678
+#, 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,
+#. * where the %s is the app name (e.g. "GIMP")
+#: src/gs-shell.c:1683
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+msgstr "Không thể nâng cấp lên %s do không tải về được"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1691
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1699
+#, 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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1706
+#, c-format
+msgid "Unable to upgrade to %s: authentication was 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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1712
+#, c-format
+msgid "Unable to upgrade to %s: authentication was invalid"
+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,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1718
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1724
+#, c-format
+msgid "Unable to upgrade to %s: AC power is required"
+msgstr "Không thể nâng cấp lên %s: Cần phải cắm máy vào điện lưới"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1730
+#, 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the distro name (e.g. "Fedora 25")
+#: src/gs-shell.c:1739
+#, 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,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1776
+#, c-format
+msgid "Unable to remove %s: authentication was required"
+msgstr "Không thể gỡ bỏ %s: cần có chứng thực"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1781
+#, 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ệ"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1786
+#, 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"
+
+#. 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: 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"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1798
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "Không thể gỡ bỏ %s: Pin quá yếu"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1810
+#, c-format
+msgid "Unable to remove %s"
+msgstr "Không thể gỡ bỏ %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:1851
+#, c-format
+msgid "Unable to launch %s: %s is not installed"
+msgstr "Không thể khởi chạy %s: %s không được cài đặt"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1857 src/gs-shell.c:1905 src/gs-shell.c:1943
+#: src/gs-shell.c:1986
+msgid "Not enough disk space — free up some space and try again"
+msgstr ""
+"Không đủ chỗ trống trên ổ đĩa — giải phóng đĩa để lấy chỗ trống trên và thử "
+"lại"
+
+#. TRANSLATORS: we failed to get a proper error code
+#: src/gs-shell.c:1868 src/gs-shell.c:1916 src/gs-shell.c:1954
+#: src/gs-shell.c:2007
+msgid "Sorry, something went wrong"
+msgstr "Rấc tiếc, có lỗi xảy ra"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1899
+msgid "Failed to install file: not supported"
+msgstr "Gặp lỗi khi cài đặt tập tin: không được hỗ trợ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1902
+msgid "Failed to install file: authentication failed"
+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
+#: src/gs-shell.c:1937
+msgid "Failed to install: not supported"
+msgstr "Gặp lỗi khi cài đặt: không được hỗ trợ"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1940
+msgid "Failed to install: authentication failed"
+msgstr "Gặp lỗi khi cài đặt: quá trình chứng thực thất bại"
+
+#. 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:1981
+#, 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 application, aka 'GNOME Software'.
+#: src/gs-shell.c:1991
+msgid "Software needs to be restarted to use new plugins."
+msgstr "Cần phải 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:1995
+msgid "AC power is required"
+msgstr "Cần phải cắm máy vào điện lưới"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1998
+msgid "The battery level is too low"
+msgstr "Pin yếu quá"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "_Kho Phần mềm"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "_Tuỳ thích cập nhật phần mềm"
+
+#. button in the info bar
+#: src/gs-shell.ui:98
+msgid "Examine Disk"
+msgstr "Kiểm nghiệm ổ đĩa"
+
+#. 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 "Cài đặt Mạng"
+
+#. button in the info bar
+#: src/gs-shell.ui:118
+msgid "Restart Now"
+msgstr "Khởi động lại ngay"
+
+#. button in the info bar
+#: src/gs-shell.ui:128
+msgid "More Information"
+msgstr "Thông tin thêm"
+
+#: src/gs-shell.ui:189
+msgid "Search"
+msgstr "Tìm kiếm"
+
+#: src/gs-shell.ui:204
+msgid "Primary Menu"
+msgstr "Trình đơn chính"
+
+#: src/gs-shell.ui:274
+msgid "Find Out _More"
+msgstr "Tì_m thêm nữa"
+
+#. 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 "Các cập nhậ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 "Không"
+
+#: src/gs-storage-context-dialog.c:139
+msgid "Application Data"
+msgstr "Dữ liệu Ứng dụng"
+
+#: src/gs-storage-context-dialog.c:140
+msgid "Data needed for the application 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 application"
+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 application 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 application"
+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: 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 "Lưu trữ"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr ""
+"Dữ liệu nhớ đệm có thễ được xóa đi bằng <a href=\"dummy\">_các cài đặt ứng "
+"dụng</a>."
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s (Đã cài đặt)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s (Đang cài đặt)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s (Đang gỡ bỏ)"
+
+#. 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 "Cập Nhật Đã Cài Đặ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:131
+#, c-format
+msgid "Installed on %s"
+msgstr "Đã cài đặt vào %s"
+
+#: src/gs-update-dialog.ui:77
+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."
+
+#: src/gs-update-monitor.c:222
+msgid "Software Updates Are Out of Date"
+msgstr "Các cập nhật phần mềm đã quá cũ"
+
+#: src/gs-update-monitor.c:223
+msgid "Please check for software updates."
+msgstr "Vui lòng kiểm tra cập nhật phần mềm."
+
+#: src/gs-update-monitor.c:229
+msgid "Critical Software Update Ready to Install"
+msgstr "Các Bản cập nhật Phần mềm nguy cấp đã sẵn sàng để cài đặt"
+
+#: src/gs-update-monitor.c:230
+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."
+
+#: src/gs-update-monitor.c:233
+msgid "Critical Software Updates Available to Download"
+msgstr "Đã có các Bản cập nhật Phần mềm nguy cấp để tải về"
+
+#: src/gs-update-monitor.c:234
+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."
+
+#: src/gs-update-monitor.c:242
+msgid "Software 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:243
+msgid "Software updates are waiting and ready to be installed."
+msgstr "Đã có các bản cập nhật đang đợi và sẵn để được cài đặt."
+
+#: src/gs-update-monitor.c:248
+msgid "Software 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:249
+msgid "Please download waiting software updates."
+msgstr "Vui lòng tải xuống các cập nhật còn đang đợi."
+
+#. TRANSLATORS: apps were auto-updated and restart is required
+#: src/gs-update-monitor.c:361
+#, c-format
+msgid "%u Application Updated — Restart Required"
+msgid_plural "%u Applications 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:367
+#, c-format
+msgid "%u Application Updated"
+msgid_plural "%u Applications Updated"
+msgstr[0] "%u Ứng dụng đã cập nhật"
+
+#. TRANSLATORS: %1 is an application name, e.g. Firefox
+#: src/gs-update-monitor.c:378
+#, c-format
+msgid "%s has been updated."
+msgstr "%s đã được cập nhật."
+
+#. TRANSLATORS: the app needs restarting
+#: src/gs-update-monitor.c:381
+msgid "Please restart the application."
+msgstr "Bạn cần khởi động lại ứng dụng."
+
+#. TRANSLATORS: %1 and %2 are both application names, e.g. Firefox
+#: src/gs-update-monitor.c:389
+#, 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 application needs restarting
+#: src/gs-update-monitor.c:395 src/gs-update-monitor.c:414
+#, c-format
+msgid "%u application requires a restart."
+msgid_plural "%u applications require a restart."
+msgstr[0] "%u ứng dụng cần được khởi động lại."
+
+#. TRANSLATORS: %1, %2 and %3 are all application names, e.g. Firefox
+#: src/gs-update-monitor.c:407
+#, 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:677 src/gs-updates-page.ui:20
+msgid "Operating System Updates Unavailable"
+msgstr "Cập nhật Hệ điều hành Không Khả dụng"
+
+#. TRANSLATORS: this is the message dialog for the distro EOL notice
+#: src/gs-update-monitor.c:679
+msgid "Upgrade to continue receiving security updates."
+msgstr "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:734
+#, 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:738
+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:1143
+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:1145
+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."
+
+#: src/gs-update-monitor.c:1146
+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:1168
+msgid "System Upgrade Complete"
+msgstr "Nâng cấp xong hệ thống"
+
+#. 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:1173
+#, 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:1179
+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:1183
+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 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:1194
+msgctxt "updates"
+msgid "Review"
+msgstr "Đánh giá"
+
+#. TRANSLATORS: this is when the offline update failed
+#: src/gs-update-monitor.c:1243
+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:1248
+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:1253
+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:1258
+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:1263
+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:1268
+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:1272
+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:247
+#, c-format
+msgid "Last checked: %s"
+msgstr "Lần cuối kiểm tra: %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 không còn được hỗ trợ."
+
+#: src/gs-updates-page.c:563
+msgid "Your operating system is no longer supported."
+msgstr "Hệ điều hành của bạn không còn được hỗ trợ nữa."
+
+#. 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 "Đ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."
+
+#. 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 "Bạn nên nâng cấp lên phiên bản mới hơn."
+
+#. TRANSLATORS: this is to explain that downloading updates may cost money
+#: src/gs-updates-page.c:849
+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:853
+msgid ""
+"Checking for updates while using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Việc kiểm tra các cập nhật trong khi sử dụng băng thông rộng di động có thể "
+"khiến bạn phải trả phí."
+
+#. TRANSLATORS: this is a link to the
+#. * control-center network panel
+#: src/gs-updates-page.c:857
+msgid "Check _Anyway"
+msgstr "_Vẫn cứ xem"
+
+#. TRANSLATORS: can't do updates check
+#: src/gs-updates-page.c:873
+msgid "No Network"
+msgstr "Không có Mạng"
+
+#. 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 "Cần truy cập Internet để tìm xem các bản cập nhật."
+
+#: src/gs-updates-page.c:1262
+msgid "Check for updates"
+msgstr "Kiểm tra cập nhật"
+
+#: src/gs-updates-page.c:1298
+msgctxt "Apps to be updated"
+msgid "Updates"
+msgstr "Các cập nhật"
+
+#: src/gs-updates-page.ui:6
+msgid "Updates page"
+msgstr "Trang cập nhật"
+
+#. TRANSLATORS: the updates panel is starting up.
+#: src/gs-updates-page.ui:83
+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:96
+msgid "This could take a while."
+msgstr "Việc này có thể hơi mất thời gian."
+
+#. TRANSLATORS: This means all software (plural) installed on this system is up to date.
+#: src/gs-updates-page.ui:204
+msgid "Up to Date"
+msgstr "Đã cập nhật"
+
+#: src/gs-updates-page.ui:243
+msgid "Use Mobile Data?"
+msgstr "Sử dụng dữ liệu từ mạng di động?"
+
+#: src/gs-updates-page.ui:244
+msgid ""
+"Checking for updates when using mobile broadband could cause you to incur "
+"charges."
+msgstr ""
+"Kiểm tra xem có các bản cập nhật không khi sử dụng Internet qua mạng di động "
+"có thể khiến bạn tốn kém tiền bạc."
+
+#: src/gs-updates-page.ui:247
+msgid "_Check Anyway"
+msgstr "_Cứ Kiểm tra"
+
+#: src/gs-updates-page.ui:263
+msgid "No Connection"
+msgstr "Không kết nối"
+
+#: src/gs-updates-page.ui:264
+msgid "Go online to check for updates."
+msgstr "Kết nối mạng để tìm xem các bản cập nhật."
+
+#: src/gs-updates-page.ui:267
+msgid "_Network Settings"
+msgstr "Cài đặt mạ_ng"
+
+#: src/gs-updates-page.ui:296
+msgid "Error"
+msgstr "Lỗi"
+
+#: src/gs-updates-page.ui:297
+msgid "Updates are automatically managed."
+msgstr "Các cập nhật được quản lý tự động."
+
+#. TRANSLATORS: This is the button for installing all
+#. * offline updates
+#: src/gs-updates-section.c:328
+msgid "Restart & Update"
+msgstr "Khởi động lại & Cập nhật"
+
+#. TRANSLATORS: This is the button for upgrading all
+#. * online-updatable applications
+#: src/gs-updates-section.c:334
+msgid "Update All"
+msgstr "Cập nhật Tất cả"
+
+#. TRANSLATORS: This is the header for system firmware that
+#. * requires a reboot to apply
+#: src/gs-updates-section.c:476
+msgid "Integrated Firmware"
+msgstr "Phần dẻo 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:481
+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:486
+msgid "Application Updates"
+msgstr "Các bản 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:491
+msgid "Device Firmware"
+msgstr "Phần dẻo Thiết bị"
+
+#: src/gs-updates-section.ui:33 src/gs-upgrade-banner.ui:72
+#: plugins/packagekit/gs-packagekit-task.c:155
+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:90
+#, c-format
+msgid "%s %s Available"
+msgstr "%s %s Giờ đã 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s đã sẵn có"
+
+#: src/gs-upgrade-banner.c:143
+msgid "Learn about the new version"
+msgstr "Tìm hiểu về phiên bản mới"
+
+#: src/gs-upgrade-banner.c:167
+msgid "Downloading…"
+msgstr "Đang tải về…"
+
+#. 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 "Đã 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:189
+#, c-format
+msgid "%u%% downloaded"
+msgstr "Đã tải về %u%%"
+
+#: src/gs-upgrade-banner.ui:42
+msgid "A major upgrade, with new features and added polish."
+msgstr "Một sự nâng cấp lớn, bổ sung thêm tính năng mới và trau chuốt hơn."
+
+#: src/gs-upgrade-banner.ui:187
+msgid "_Restart & Upgrade"
+msgstr "_Khởi động lại & Nâng cấp"
+
+#: src/gs-upgrade-banner.ui:201
+msgid "Remember to back up data and files before upgrading."
+msgstr ""
+"Bạn nên sao lưu dữ liệu dự phòng và các tập tin trước khi nâng cấp lên phiên "
+"bản mới hơn."
+
+#: src/org.gnome.Software.desktop.in:4
+msgid "Add, remove or update software on this computer"
+msgstr "Cài thêm, xóa hoặc cập nhật phần mềm trên máy tính này"
+
+#. 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;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;"
+
+#. 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 "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:72
+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: status text when downloading
+#: plugins/core/gs-plugin-rewrite-resource.c:155
+msgid "Downloading featured images…"
+msgstr "Đang tải hình ảnh đặc sắc…"
+
+#. 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 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:970
+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:474
+msgid "GNOME Web"
+msgstr "GNOME 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: status text when downloading
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:257
+msgid "Downloading upgrade information…"
+msgstr "Đang tải xuống thông tin nâng cấp…"
+
+#. TRANSLATORS: this is a title for Fedora distro upgrades
+#: plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c:404
+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 applications 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:307
+#, c-format
+msgid "System folder %s"
+msgstr "Thư mục hệ thống %s"
+
+#: plugins/flatpak/gs-flatpak.c:308 plugins/flatpak/gs-flatpak.c:309
+#, c-format
+msgid "Home subfolder %s"
+msgstr "Thư mục con của thư mục riêng %s"
+
+#: plugins/flatpak/gs-flatpak.c:310
+msgid "Host system folders"
+msgstr "Thư mục hệ thống chủ"
+
+#: plugins/flatpak/gs-flatpak.c:311
+msgid "Host system configuration from /etc"
+msgstr "Cấu hình hệ thống chủ từ /etc"
+
+#: plugins/flatpak/gs-flatpak.c:312
+msgid "Desktop folder"
+msgstr "Thư mục nền"
+
+#: plugins/flatpak/gs-flatpak.c:312
+#, 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:313
+msgid "Documents folder"
+msgstr "Thư mục chứa tài liệu"
+
+#: plugins/flatpak/gs-flatpak.c:313
+#, 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:314
+msgid "Music folder"
+msgstr "Thư mục nhạc"
+
+#: plugins/flatpak/gs-flatpak.c:314
+#, c-format
+msgid "Music subfolder %s"
+msgstr "Thư mục con âm nhạc %s"
+
+#: plugins/flatpak/gs-flatpak.c:315
+msgid "Pictures folder"
+msgstr "Thư mục ảnh"
+
+#: plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "Thư mục chứa Ảnh %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Public Share folder"
+msgstr "Thư mục chia sẻ công khai"
+
+#: plugins/flatpak/gs-flatpak.c:316
+#, c-format
+msgid "Public Share subfolder %s"
+msgstr "Thư mục con chia sẻ công khai %s"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Videos folder"
+msgstr "Thư mục chứa phim"
+
+#: plugins/flatpak/gs-flatpak.c:317
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "Thư mục con chứa phim %s"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Templates folder"
+msgstr "Thư mục chứa mẫu"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "Thư mục con chứa mẫu %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "User cache folder"
+msgstr "Thư mục dữ liệu đệm người dùng"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, 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:320
+msgid "User configuration folder"
+msgstr "Thư mục cấu hình người dùng"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, 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:321
+msgid "User data folder"
+msgstr "Thư mục dữ liệu người dùng"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, 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:322
+msgid "User runtime folder"
+msgstr "Thư mục chạy người dùng"
+
+#: plugins/flatpak/gs-flatpak.c:322
+#, 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:380
+#, 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:1397
+#, 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:3534
+#, 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-plugin-flatpak.c:1038
+#, 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:1052
+#, 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: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 ""
+"Máy chủ “%s” không cho phép cài đặt “%s”, gần như chắc chắn là do bộ lọc của "
+"nó. Gỡ bỏ bộ lọc và lặp lại việc cài đặt. Chi tiết lỗi: %s"
+
+#. 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 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:139
+#, 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:144
+#, 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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, 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:185
+#, 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:190
+#, 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:194
+#, 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:198
+#, 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:202
+#, 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:206
+#, 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:210
+#, 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:215
+#, 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:220
+#, 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:225
+#, 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:230
+#, c-format
+msgid "%s USB Receiver Update"
+msgstr "%s Cập nhật thiết bị nhận qua USB"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+msgid "Firmware"
+msgstr "Firmware"
+
+#: plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in:6
+msgid "Firmware Upgrade Support"
+msgstr "Hỗ trợ Nâng cấp Phần dẻo"
+
+#: 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:148
+msgid "Install Unsigned Software?"
+msgstr "Cài đặt phần mềm chưa ký?"
+
+#: 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 ""
+"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:153
+msgid "Download Unsigned Software?"
+msgstr "Tải về phần mềm chưa ký?"
+
+#: 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 ""
+"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:158
+msgid "Update Unsigned Software?"
+msgstr "Cập nhật phần mềm chưa ký?"
+
+#: 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 ""
+"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:367
+msgid "Packages"
+msgstr "Gói phần mềm"
+
+#: plugins/rpm-ostree/gs-plugin-rpm-ostree.c:2596
+msgid "Operating System (OSTree)"
+msgstr "Hệ điều hành (OSTree)"
+
+#. TRANSLATORS: default snap store name
+#: plugins/snap/gs-plugin-snap.c:286
+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 "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ó"
+
+#~ msgid "_Installed"
+#~ msgstr "Đã cà_i đặt"
+
+#~ msgid "_Updates"
+#~ msgstr "_Bản cập nhật"
+
+#, 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 "Reference"
+#~ msgstr "Tùy thích"
+
+#~ 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 "Unknown Software License"
+#~ msgstr "Bản quyền Phần mềm Không xác định"
+
+#~ 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 "Remove"
+#~ msgstr "Xóa"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "Không có kho Bổ sung"
+
+#~ msgid "_Enable"
+#~ msgstr "_Bật"
+
+#~ 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 "_Restart Now"
+#~ msgstr "_Khởi động lại Ngay"
+
+#~ 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"
+
+#, c-format
+#~ msgid "%s %s Ready to be Installed"
+#~ msgstr "%s %s Đã sẵn sàng để được Cài đặt"
+
+#~ msgid "_Learn More"
+#~ msgstr "_Tìm hiểu thêm"
+
+#~ 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 "Failed to save file"
+#~ msgstr "Không thể lưu file"
+
+#~ 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 "App ID"
+#~ msgstr "ID Ứng dụng"
+
+#~ 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 "Delete Design"
+#~ msgstr "Xóa Thiết kế"
+
+#~ msgid "OS Upgrade"
+#~ msgstr "Nâng cấp Hệ điều hành"
+
+#~ 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 "I have forgotten my password"
+#~ msgstr "Tôi đã quên mật khẩu của mình"
+
+#~ 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 "Unable to update %s from %s"
+#~ msgstr "Không thể cập nhật %s từ %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 "U_pdate All"
+#~ msgstr "Cập nhật Tất cả"
+
+#~ msgid "Restart & _Install"
+#~ msgstr "Khởi động lại & _Cài đặt"
+
+#~ msgid "App Center"
+#~ msgstr "Trung tâm Ứng dụng"
+
+#~ msgid "More Apps"
+#~ msgstr "Ứng dụng khác"
+
+#~ 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..26dc8fa
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,6996 @@
+# 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 <www.eternalhui@gmail.com>, 2013
+# Wylmer Wang <wantinghard@gmail.com>, 2013.
+# YunQiang Su <wzssyqa@gmail.com>, 2014.
+# Sphinx Jiang <yishanj13@gmail.com>, 2014.
+# Tong Hui <tonghuix@gmail.com>, 2014.
+# Mingye Wang <arthur2e5@gmail.com>, 2015, 2016.
+# Mingcong Bai <jeffbai@aosc.xyz>, 2015, 2016, 2018.
+# Bin Li <binli@gnome.org>, 2016.
+# Michael Chen <searchends@gnu.hk>, 2016.
+# Mandy Wang <wangmychn@gmail.com>, 2016.
+# Boyuan Yang <073plan@gmail.com>, 2018, 2021.
+# Zhou Nan <zhounan@nfschina.com>, 2021.
+# Dingzhong Chen <wsxy162@gmail.com>, 2015-2021.
+# lumingzh <lumingzh@qq.com>, 2021-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-software 41\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-software/issues\n"
+"POT-Creation-Date: 2022-08-26 18:50+0000\n"
+"PO-Revision-Date: 2022-08-28 21:09+0800\n"
+"Last-Translator: lumingzh <lumingzh@qq.com>\n"
+"Language-Team: Chinese - China <i18n-zh@googlegroups.com>\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 42.0\n"
+"X-DamnedLies-Scope: partial\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:1980
+#: src/gs-application.c:256
+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 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 ""
+"选择更大的数值意味着更少往返远程服务器,但是屏幕截图的更新可能需要更长时间才"
+"能显示给用户。数值 0 代表从不检查服务器如果图像已经存在于缓存中。"
+
+#: 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 "评论的最小 Karma 值"
+
+#: data/org.gnome.software.gschema.xml:86
+msgid "Reviews with karma less than this number will not be shown."
+msgstr "低于此 Karma 值的评论将被隐藏。"
+
+#: 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 "应用程序为自由软件时要使用的许可 URL"
+
+#: 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://zh.wikipedia.org/wiki/专有软件'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "解释非自由和专有软件的 URI"
+
+#: 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 "指向将下载到 swcatalog 文件夹的 AppStream 文件的 URL 列表"
+
+#: 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 ""
+"为所有用户安装 AppStream 文件到系统级位置。如果为假,文件将被安装在非标准的 "
+"$XDG_DATA_HOME/swcatalog/xml 目录中"
+
+#: 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 ""
+"首选的打包格式优先顺序,格式越重要越靠前列出。空数组代表默认顺序。省略的格式"
+"将被列于后方。作为举例的打包格式有:deb、flatpak、rpm、snap。"
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "GNOME 软件 AppStream 系统级安装器"
+
+#: 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 "该程序只能被 root 用户使用"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, c-format
+msgid "Failed to validate content type: %s"
+msgstr "验证内容类型失败:%s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "%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:1027
+#, 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:1031
+#, 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 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 适合青少年"
+
+#. 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 适合成年人"
+
+#. 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 适合 %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 "年龄分级"
+
+#: 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:6167
+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:6186 src/gs-safety-context-dialog.c:439
+#, c-format
+msgid "%s (%s)"
+msgstr "%s(%s)"
+
+#: lib/gs-app.c:6263
+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 "卸载(_U)"
+
+#: 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 "可以访问在系统总线上访问 D-Bus 服务"
+
+#: 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 "可以在会话总线上访问 D-Bus 服务"
+
+#: 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 "版本 %s 的新功能"
+
+#: 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 "%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 "显示应用程序详情(使用应用程序 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: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 "对 AppStream 优先使用本地文件源"
+
+#: 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 ""
+"eternalhui <www.eternalhui@gmail.com>, 2013\n"
+"tuhaihe <1132321739qq@gmail.com>, 2013, 2020\n"
+"Wylmer Wang <wantinghard@gmail.com>, 2013\n"
+"YunQiang Su <wzssyqa@gmail.com>, 2014\n"
+"Sphinx Jiang <yishanj13@gmail.com>, 2014\n"
+"Tong Hui <tonghuix@gmail.com>, 2014\n"
+"Mingye Wang <arthur2e5@gmail.com>, 2015, 2016\n"
+"Mingcong Bai <jeffbai@aosc.xyz>, 2015, 2018\n"
+"Bin Li <binli@gnome.org>, 2016\n"
+"Michael Chen <searchends@gnu.hk>, 2016\n"
+"Mandy Wang <wangmychn@gmail.com>, 2016\n"
+"Dingzhong Chen <wsxy162@gmail.com>, 2015-2021\n"
+"lumingzh <lumingzh@qq.com>, 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:2147
+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 "需要 %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: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 "来源:%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 "从 %s 改名"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "帮助翻译 %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 由国际化的社区中的志愿者设计、开发和翻译。\n"
+"\n"
+"这意味着虽然它还未提供您的语言,但您可以参与进去,自己来帮助翻译。"
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "翻译"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "翻译网站(_T)"
+
+#. 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: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 "取消(_C)"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "登录(_L)"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "用户(_U)"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "密码(_P)"
+
+#. 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 "请输入 1-%u 的任一数字: "
+
+#. 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 "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 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 已安装"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"%s 不是 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software"
+"\">自由开源软件</a>,它由 “%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 由 %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 "在一些国家安装或使用 %s 是非法的。"
+
+#. 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 "接受(_A)"
+
+#. 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] "已安装更新"
+
+#. 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] "应用程序已移除"
+
+#. 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] "需要重新启动以使更新生效。"
+
+#. 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] "%d 分钟前"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d 小时前"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d 天前"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d 周前"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d 个月前"
+
+#: src/gs-common.c:891
+#, 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:1246
+#, 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 "应用程序"
+
+#. 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:332
+msgid "Find in Software"
+msgstr "在“软件”中查找"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "显示更多(_S)"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "显示更少(_S)"
+
+#: 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:857 src/gs-details-page.c:883
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "安装(_I)"
+
+#: src/gs-details-page.c:873
+msgid "_Restart"
+msgstr "重新启动(_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:897
+msgid "_Install…"
+msgstr "安装(_I)…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1174
+#, c-format
+msgid "Other Apps by %s"
+msgstr "%s 的其它应用"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1557
+msgid "You need internet access to write a review"
+msgstr "您需要互联网连接以编写评论"
+
+#: src/gs-details-page.c:1708 src/gs-details-page.c:1724
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "无法找到“%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 "帮助翻译(_T)"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "打开(_O)"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "更新(_U)"
+
+#: 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 "项目网站(_W)"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "捐赠(_D)"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "贡献翻译(_T)"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "报告问题(_R)"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "帮助(_H)"
+
+#. 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 "编写评论(_W)"
+
+#. 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:216
+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] "%s 书写系统可用的字体"
+
+#. 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] "%s 可用的软件"
+
+#: 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 "未找到 %s"
+
+#. 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 "没有提供 %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 "%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"%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:398
+#, 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:402
+#, 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:409
+#, 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: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 "%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:420
+#, 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:424
+#, 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 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 "没有对 %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 "%s 的相关信息,以及如何获取支持此打印机的驱动的选项有可能在 %s 找到。"
+
+#. 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] "没有找到 %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: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] "没有找到您要搜索的 %s。请访问 %s 获取更多相关信息。"
+
+#: 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 "未找到任何搜索结果:%s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "%s 文件格式"
+
+#: 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 "%s 很可能可以工作在这个设备上"
+
+#. 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 可以工作在这个设备上"
+
+#. 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 不能正常工作在这个设备上"
+
+#. 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 不能工作在这个设备上"
+
+#. 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 "参与贡献(_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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"此软件由一个志愿者社区开放地开发,并在 <a href=\"%s\">%s 许可证</a>下发布。\n"
+"\n"
+"您可以贡献并帮助完善它。"
+
+#. 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 ""
+"此软件由一个志愿者社区开放地开发,并在 %s 许可证下发布。\n"
+"\n"
+"您可以贡献并帮助完善它。"
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "专有软件"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "了解更多(_L)"
+
+#: 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 ""
+"此软件的开发不公开,所以只有它的开发者知道它的工作方式。由于难以检测可能并不"
+"安全,且可能在没有监管的情况下进行更改。\n"
+"\n"
+"您可能无法参与贡献此软件。"
+
+#. 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 ""
+"当前网络为计费流量。计费连接有流量限制或产生相关费用。为了节省流量,自动更新"
+"已暂停。\n"
+"当可使用非计费网络时,自动更新将恢复。届时,仍可能需要手动安装更新。\n"
+"另外情形,如果当前网络被错误识别为计费流量,该设置也会发生改动。"
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "打开网络设置(_S)"
+
+#: 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:104
+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 "Beta"
+
+#. 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 "提供获取来自 %s 的附加软件。也包括一些专有软件。"
+
+#. 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:2824
+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 "您确定要移除 %s 仓库吗?"
+
+#. 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 "所有来自 %s 的应用程序将被卸载,想再次使用它们您必须重新安装仓库。"
+
+#. 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 "您确定要卸载 %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 将被卸载,想再次使用它您必须重新安装。"
+
+#: 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 ""
+"当前已安装的一些软件与 %s 不兼容。如果您想继续,升级过程中下列软件将被自动移"
+"除:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "不兼容的软件"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "继续(_C)"
+
+#. 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 "从“%s”安装的软件将停止收到更新。"
+
+#: 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 "禁用(_D)"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: 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 "选择的第三方附加仓库 — %s。"
+
+#: src/gs-repos-dialog.c:528
+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: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 "这些仓库内的软件可替代 %s 提供的默认软件。"
+
+#. 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] "已安装 %u 款应用程序"
+
+#. 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 个附加组件"
+
+#. 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 款应用程序"
+
+#. 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 个附加组件"
+
+#. 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 和 %s 已安装"
+
+#. 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 "差评"
+
+#. 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 "发布(_P)"
+
+#: 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 <a href=\"https://odrs.gnome.org/privacy"
+"\">privacy policy</a>. The full name attached to your account will be shown "
+"publicly."
+msgstr ""
+"在我们的 <a href=\"https://odrs.gnome.org/privacy\">隐私政策</a> 中查看发送了"
+"什么数据。您账号附加的全名将会公开显示。"
+
+#: 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:93
+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: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 "%s 可能是安全的"
+
+#. 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 不安全"
+
+#. 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 "过期的 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 "下一张截图"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "截图无效"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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:169
+#, c-format
+msgid "%u more match"
+msgid_plural "%u more matches"
+msgstr[0] "还有 %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 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:1197 src/gs-shell.c:1202 src/gs-shell.c:1217
+#: src/gs-shell.c:1221
+#, 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:1238
+#, 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:1273
+#, 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:1279
+#, c-format
+msgid "Unable to download updates from %s"
+msgstr "无法从 %s 下载更新"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1286 src/gs-shell.c:1326
+msgid "Unable to download updates"
+msgstr "无法下载更新"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1291
+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:1299
+#, 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:1304
+msgid "Unable to download updates: not enough disk space"
+msgstr "无法下载更新:磁盘空间不足"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1310
+msgid "Unable to download updates: authentication was required"
+msgstr "无法下载更新:需要身份验证"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1314
+msgid "Unable to download updates: authentication was invalid"
+msgstr "无法下载更新:身份验证无效"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1318
+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:1329
+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:1371
+#, c-format
+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:1377
+#, c-format
+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:1389
+#, c-format
+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:1395
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "无法安装 %s 由于不支持"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1401
+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:1406
+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:1410
+#, c-format
+msgid "Unable to install %s: not enough disk space"
+msgstr "无法安装 %s:磁盘空间不足"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1416
+#, c-format
+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:1422
+#, c-format
+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:1428
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1435
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1441
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "无法安装 %s:电池电量太低"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1450
+#, c-format
+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:1495
+#, c-format
+msgid "Unable to update %s from %s as download failed"
+msgstr "无法从 %2$s 更新 %1$s 由于下载失败"
+
+#. 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 update %s as 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:1509
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "无法从 %s 安装更新由于下载失败"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1513
+#, c-format
+msgid "Unable to install updates as download failed"
+msgstr "无法安装更新由于下载失败"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1518
+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:1527
+#, c-format
+msgid "Unable to update %s: not enough disk space"
+msgstr "无法更新 %s:磁盘空间不足"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1532
+#, 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:1541
+#, c-format
+msgid "Unable to update %s: authentication was required"
+msgstr "无法更新 %s:需要身份验证"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1546
+#, 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:1554
+#, c-format
+msgid "Unable to update %s: authentication was invalid"
+msgstr "无法更新 %s:身份验证无效"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1559
+#, 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:1567
+#, c-format
+msgid "Unable to update %s: you do not have permission to update software"
+msgstr "无法更新 %s:您没有更新软件的权限"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1573
+#, 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:1582
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1588
+#, 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:1596
+#, c-format
+msgid "Unable to update %s: The battery level is too low"
+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:1602
+#, 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:1613
+#, c-format
+msgid "Unable to update %s"
+msgstr "无法更新 %s"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1616
+#, 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:1658
+#, c-format
+msgid "Unable to upgrade to %s from %s"
+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:1663
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1671
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1679
+#, c-format
+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:1686
+#, c-format
+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:1692
+#, c-format
+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:1698
+#, c-format
+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:1704
+#, c-format
+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:1710
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1719
+#, c-format
+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:1756
+#, c-format
+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:1761
+#, c-format
+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:1766
+#, c-format
+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:1772
+#, c-format
+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:1778
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "无法移除 %s:电池电量太低"
+
+#. TRANSLATORS: failure text for the in-app notification,
+#. * where the %s is the application name (e.g. "GIMP")
+#: src/gs-shell.c:1790
+#, c-format
+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:1831
+#, 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:1837 src/gs-shell.c:1885 src/gs-shell.c:1923
+#: src/gs-shell.c:1966
+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:1848 src/gs-shell.c:1896 src/gs-shell.c:1934
+#: src/gs-shell.c:1987
+msgid "Sorry, something went wrong"
+msgstr "抱歉,出现了问题"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1879
+msgid "Failed to install file: not supported"
+msgstr "无法安装文件:不支持"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1882
+msgid "Failed to install file: authentication failed"
+msgstr "无法安装文件:身份验证失败"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1917
+msgid "Failed to install: not supported"
+msgstr "无法安装:不支持"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1920
+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:1961
+#, c-format
+msgid "Unable to contact %s"
+msgstr "无法联系 %s"
+
+#. TRANSLATORS: failure text for the in-app notification, where the 'Software' means this application, aka 'GNOME Software'.
+#: src/gs-shell.c:1971
+msgid "Software needs to be restarted to use new plugins."
+msgstr "软件商店需要重启才能使用新插件。"
+
+#. TRANSLATORS: need to be connected to the AC power
+#: src/gs-shell.c:1975
+msgid "AC power is required"
+msgstr "需要交流电源"
+
+#. TRANSLATORS: not enough juice to do this safely
+#: src/gs-shell.c:1978
+msgid "The battery level is too low"
+msgstr "电池电量太低"
+
+#: src/gs-shell.ui:7
+msgid "_Software Repositories"
+msgstr "软件仓库(_S)"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "更新首选项(_U)"
+
+#. 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 "了解更多(_M)"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr "缓存数据可以从 <a href=\"dummy\">_application settings</a> 中清除。"
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s(已安装)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s(安装中)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s(移除中)"
+
+#. 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 "已在 %s 上安装"
+
+#: 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] "已更新 %u 款应用程序——需要重启"
+
+#. 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 款应用程序"
+
+#. 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 "%s 和 %s 已经更新。"
+
+#. 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 款应用程序需要重启。"
+
+#. 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 "%s 有新版本可用"
+
+#. 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 "欢迎使用 %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] "软件更新已安装"
+
+#. 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] "重要的操作系统更新已安装。"
+
+#. 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 "上次检查:%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。"
+
+#: 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 "依然检查(_C)"
+
+#: 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 "网络设置(_N)"
+
+#: 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 "下载(_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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s 可用"
+
+#: 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 "已下载 %s,共 %s"
+
+#. 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%% 已下载"
+
+#: 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 "重启并更新(_R)"
+
+#: 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 ""
+"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: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 "%s 更新了新特性和缺陷修复。"
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "EOS 更新服务无法获取和应用更新。"
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "GNOME 浏览器"
+
+#: 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 "在浏览器里运行流行的网络应用程序"
+
+#. 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:404
+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 "Flatpak 是用于 Linux 上桌面应用程序的框架"
+
+#. 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 "系统文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "主目录子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "主机系统文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "来自 /etc 的主机系统配置"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "桌面文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "桌面子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "文档文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "文档子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "音乐文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "音乐子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "图片文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "图片子文件夹 %s"
+
+#: 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 "共享子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "视频文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "视频子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "模板文件夹"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "模板子文件夹 %s"
+
+#: 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 "用户缓存子文件夹 %s"
+
+#: 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 "用户配置子文件夹 %s"
+
+#: 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 "用户数据子文件夹 %s"
+
+#: 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 "用户运行时子文件夹 %s"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "对 %s 的文件系统访问"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "正在获取 %s 的 flatpak 元数据…"
+
+#: plugins/flatpak/gs-flatpak.c:3540
+#, 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-plugin-flatpak.c:1038
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "无法将扩展“%s”添加来安装:%s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1052
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "无法将扩展“%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 ""
+"远程仓库“%s”不允许安装“%s”,可能是因为它的筛选器。移除筛选器并重复安装。错误"
+"详情:%s"
+
+#. 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 设备更新"
+
+#. 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 系统更新"
+
+#. 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 嵌入式控制器(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:149
+#, 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:154
+#, 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:159
+#, 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:165
+#, 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:171
+#, 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:176
+#, 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:181
+#, c-format
+msgid "%s Configuration Update"
+msgstr "%s 配置更新"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "%s 摄像头更新"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "%s 可信平台模块(TPM)更新"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "%s 触摸板更新"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "%s 鼠标更新"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "%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 存储控制器更新"
+
+#. 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 网络接口更新"
+
+#. 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 显示器更新"
+
+#. 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)更新"
+
+#. 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 "%s USB 接收器更新"
+
+#: plugins/fwupd/gs-plugin-fwupd.c:1241
+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:2687
+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 "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 "system"
+#~ 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 "Remove"
+#~ msgstr "移除"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "没有更多软件源"
+
+#~ msgid "_Enable"
+#~ msgstr "启用(_E)"
+
+#~ msgid "_Remove…"
+#~ msgstr "移除(_R)…"
+
+#~ msgid "_Disable…"
+#~ msgstr "禁用(_D)…"
+
+#~ msgid "Disabling"
+#~ msgstr "正在禁用"
+
+#~ msgid "Enabled"
+#~ msgstr "已启用"
+
+#~ msgid "Disabled"
+#~ msgstr "已禁用"
+
+#~ msgid "_Remove All"
+#~ msgstr "全部移除(_R)"
+
+#~ 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"
+
+#~ msgid "%s %s Ready to be Installed"
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Navigation sidebar"
+#~ 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 "_Explore"
+#~ msgstr "浏览(_E)"
+
+#~ msgid "_Installed"
+#~ msgstr "已安装(_I)"
+
+#~ msgid "_Updates"
+#~ msgstr "更新(_U)"
+
+#~ 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, %R"
+#~ msgstr "昨天,%R"
+
+#~ 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 "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 "App ID"
+#~ msgstr "应用 ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "删除设计"
+
+#~ msgid "OS Upgrade"
+#~ 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 "Unable to purchase %s"
+#~ 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 "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 "_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 "U_pdate All"
+#~ msgstr "全部更新(_P)"
+
+#~ 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 "_Install All"
+#~ msgstr "全部安装(_I)"
+
+#~ 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 "web app"
+#~ 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 <EMAIL@ADDRESS>, 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 <j_h_liau@yahoo.com.tw>\n"
+"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\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 <pswo10680@gmail.com>, 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..af728ae
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,7094 @@
+# 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 <EMAIL@ADDRESS>, YEAR.
+# Freddy Cheng <freddy4212@gmail.com>, 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: 2022-09-05 16:51+0000\n"
+"PO-Revision-Date: 2022-09-22 00:47+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
+"Language-Team: Chinese - Taiwan <chinese-l10n@googlegroups.com>\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.1.1\n"
+"X-DamnedLies-Scope: partial\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:2018
+#: src/gs-application.c:256
+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 "是否要以《軟體》來管理更新與升級"
+
+#: 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 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 ""
+"若數值較大,則代表較少與遠端伺服器來回,更新的螢幕快照可能要花上較長時間才能"
+"夠顯示。數值為 0 表示倘若快取中已下載過螢幕快照,則永不從伺服器檢查更新。"
+
+#: 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 "應用程式為自由軟體時所使用的授權條款 URL 位址"
+
+#: 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://zh.wikipedia.org/zh-tw/%E4%B8%93%E6%9C%89%E8%BD%AF%E4%BB%B6'"
+
+#: data/org.gnome.software.gschema.xml:127
+msgid "The URI that explains nonfree and proprietary software"
+msgstr "解釋何謂非自由軟體和專有軟體的 URL 位址"
+
+#: 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 "一份要下載至「swcatalog」資料夾中的 AppStream 檔案所指向之 URL 清單"
+
+#: 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 ""
+"將所有使用者的 AppStream 檔案安裝到系統層級位置上。若設為「False」,則檔案會"
+"在非標準的「$XDG_DATA_HOME/swcatalog/xml」目錄中安裝"
+
+#: 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 ""
+"偏好的軟體包格式優先順序,愈重要的格式愈往前列出。空白陣列表示使用預設順序;"
+"省略的格式則列在後方。軟體包格式範例有:「deb」、「flatpak」、「rpm」、"
+"「snap」等。"
+
+#: data/org.gnome.software.gschema.xml:146
+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:143
+msgid "GNOME Software AppStream system-wide installer"
+msgstr "《軟體》的 AppStrem 系統層級安裝程式"
+
+#: 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 "此程式僅能由 Root 使用者使用"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:167
+#, c-format
+msgid "Failed to validate content type: %s"
+msgstr "無法核驗內容類型:%s"
+
+#. TRANSLATORS: error details
+#: gs-install-appstream/gs-install-appstream.c:178
+#, 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: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 "《%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:1027
+#, 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:1031
+#, 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 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》適合青少年"
+
+#. 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》適合成人"
+
+#. 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》適合%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 "年齡分級"
+
+#: 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 "解除安裝(_U)"
+
+#: 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 "可以取用系統匯流排的《D-Bus》服務"
+
+#: 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 "可以取用作業階段匯流排的《D-Bus》服務"
+
+#: 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 "版本 %s 的更新內容"
+
+#: 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 "%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:141
+msgid "Show a local metainfo or appdata file"
+msgstr "顯示本機中介資料或 appdata 檔案"
+
+#: 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 "《AppStream》優先使用本機的檔案來源"
+
+#: 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 "Copyright © 2016–2022 GNOME《軟體》貢獻者"
+
+#: src/gs-application.c:263 src/gs-application.c:272
+msgid "translator-credits"
+msgstr ""
+"Cheng-Chia Tseng <pswo10680@gmail.com>, 2013-2020, 2022.\n"
+"Yi-Jyun Pan <pan93412@gmail.com>, 2020.\n"
+"Freddy Cheng <freddy4212@gmail.com>, 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 "需要 %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: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 "來源:%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 "由《%s》改名而來"
+
+#. Translators: The placeholder is an application name
+#: src/gs-app-translation-dialog.c:67
+#, c-format
+msgid "Help Translate %s"
+msgstr "協助翻譯《%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》是由世界各地的社群志願者所設計、開發、翻譯的。\n"
+"\n"
+"意味著即便該軟體並未提供您所使用的語言,您仍舊可以參與其中並協助翻譯。"
+
+#: src/gs-app-translation-dialog.ui:5
+msgid "Translations"
+msgstr "翻譯"
+
+#: src/gs-app-translation-dialog.ui:92
+msgid "_Translation Website"
+msgstr "翻譯網站(_T)"
+
+#. 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: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 "取消(_C)"
+
+#: src/gs-basic-auth-dialog.ui:35
+msgid "_Login"
+msgstr "登入(_L)"
+
+#: src/gs-basic-auth-dialog.ui:88
+msgid "_User"
+msgstr "使用者(_U)"
+
+#: src/gs-basic-auth-dialog.ui:107
+msgid "_Password"
+msgstr "密碼(_P)"
+
+#. 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 "請輸入 1 至 %u 間的數字:"
+
+#. 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 "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 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》"
+
+#. 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 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">free and open source software</a>, and is provided by “%s”."
+msgstr ""
+"《%s》並非 <a href=\"https://en.wikipedia.org/wiki/Free_and_open-"
+"source_software\">自由及開源軟體</a>,由「%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》由「%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 "在某些國家安裝或使用《%s》可能是違法的。"
+
+#. 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 "接受(_A)"
+
+#. 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] "已安裝更新"
+
+#. 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] "已移除應用程式"
+
+#. 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] "需重新啟動才能使更動生效。"
+
+#. 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] "%d 分鐘前"
+
+#: src/gs-common.c:875
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "%d 小時前"
+
+#: src/gs-common.c:879
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "%d 天前"
+
+#: src/gs-common.c:883
+#, c-format
+msgid "%d week ago"
+msgid_plural "%d weeks ago"
+msgstr[0] "%d 週前"
+
+#: src/gs-common.c:887
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "%d 個月前"
+
+#: src/gs-common.c:891
+#, 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: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 "應用程式"
+
+#. 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:332
+msgid "Find in Software"
+msgstr "在《軟體》中尋找"
+
+#: src/gs-description-box.c:67 src/gs-description-box.c:269
+msgid "_Show More"
+msgstr "顯示更多(_S)"
+
+#: src/gs-description-box.c:67
+msgid "_Show Less"
+msgstr "顯示較少(_S)"
+
+#: 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:860 src/gs-details-page.c:886
+#: src/gs-details-page.ui:228 plugins/packagekit/gs-packagekit-task.c:150
+msgid "_Install"
+msgstr "安裝(_I)"
+
+#: src/gs-details-page.c:876
+msgid "_Restart"
+msgstr "重新啟動(_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:900
+msgid "_Install…"
+msgstr "安裝(_I)…"
+
+#. Translators: the '%s' is replaced with a developer name or a project group
+#: src/gs-details-page.c:1177
+#, c-format
+msgid "Other Apps by %s"
+msgstr "「%s」開發的其他應用程式"
+
+#. TRANSLATORS: we need a remote server to process
+#: src/gs-details-page.c:1560
+msgid "You need internet access to write a review"
+msgstr "需連接網際網路才能撰寫評論"
+
+#: src/gs-details-page.c:1711 src/gs-details-page.c:1727
+#, c-format
+msgid "Unable to find “%s”"
+msgstr "找不到《%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 "協助翻譯(_T)"
+
+#. TRANSLATORS: A label for a button to execute the selected application.
+#: src/gs-details-page.ui:244
+msgid "_Open"
+msgstr "開啟(_O)"
+
+#: src/gs-details-page.ui:257 plugins/packagekit/gs-packagekit-task.c:160
+msgid "_Update"
+msgstr "更新(_U)"
+
+#: 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 "專案網站(_W)"
+
+#: src/gs-details-page.ui:762
+msgid "_Donate"
+msgstr "捐款贊助(_D)"
+
+#: src/gs-details-page.ui:779
+msgid "Contribute _Translations"
+msgstr "貢獻翻譯(_T)"
+
+#: src/gs-details-page.ui:796
+msgid "_Report an Issue"
+msgstr "回報議題(_R)"
+
+#: src/gs-details-page.ui:813
+msgid "_Help"
+msgstr "求助資訊(_H)"
+
+#. 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 "撰寫評論(_W)"
+
+#. 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:216
+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] "「%s」文書可用的字型"
+
+#. 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] "「%s」可用的軟體"
+
+#: 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 "找不到「%s」"
+
+#. 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 "沒有提供「%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 "「%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:365 src/gs-extras-page.c:387
+#, 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:376
+#, 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: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 ""
+"要瞭解「%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:398
+#, 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:402
+#, 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:409
+#, 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: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 ""
+"要瞭解「%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:420
+#, 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:424
+#, 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 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 "沒有「%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 ""
+"要瞭解「%s」的相關資訊及如何取得支援該印表機之驅動程式的選項可於%s中找到。"
+
+#. 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] "找不到《%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: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] "找不到您所搜尋的內容「%s」。請參閱%s深入瞭解資訊。"
+
+#: 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 "找不到任何搜尋結果:%s"
+
+#: src/gs-extras-page.c:874
+#, c-format
+msgid "%s file format"
+msgstr "「%s」檔案格式"
+
+#: 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 "《%s》或許能運作於此裝置"
+
+#. 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》能運作於此裝置"
+
+#. 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》無法正常運作於此裝置"
+
+#. 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》無法運作於此裝置"
+
+#. 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 "參與貢獻(_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:114
+#, c-format
+msgid ""
+"This software is developed in the open by a community of volunteers, and "
+"released under the <a href=\"%s\">%s license</a>.\n"
+"\n"
+"You can contribute and help make it even better."
+msgstr ""
+"該軟體是在開放條件下由社群志願者們所一同開發,並採用 <a href=\"%s\">%s 授權條"
+"款</a>。\n"
+"\n"
+"您可以為該軟體做些貢獻使其更加美好。"
+
+#. 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 ""
+"該軟體是在開放條件下由社群志願者們所一同開發,並採用 %s 授權條款。\n"
+"\n"
+"您可以為該軟體做些貢獻使其更加美好。"
+
+#: src/gs-license-tile.c:127
+msgid "Proprietary"
+msgstr "專有授權"
+
+#: src/gs-license-tile.c:133
+msgid "_Learn More"
+msgstr "深入瞭解(_L)"
+
+#: 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 ""
+"該軟體並非在開放條件下開發,只有軟體開發者知道它的運作方式。並且由於難以監測"
+"其安全性,無法保證該軟體是否安全。\n"
+"\n"
+"您無法為該軟體做些貢獻或影響其開發。"
+
+#. 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 ""
+"目前的網路環境為計量連線,因此會有資料傳輸量上限或可能產生額外費用;已暫停自"
+"動更新。\n"
+"\n"
+"自動更新會在使用非計量連線時恢復,在那之前您仍舊可以手動安裝更新。\n"
+"\n"
+"倘若目前的網路被誤認為計量連線的話,您可以更改該設定值。"
+
+#: src/gs-metered-data-dialog.ui:17
+msgid "Open Network _Settings"
+msgstr "開啟網路設定值(_S)"
+
+#: 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 "Beta"
+
+#. 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 "您可以自%s取用額外軟體,此處也包含一些專有軟體。"
+
+#. 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 "確定要移除「%s」嗎?"
+
+#. 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 "所有來自「%s」的應用程式都將移除,欲再次使用必須重新安裝軟體庫。"
+
+#. 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 "確定要解除安裝《%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》將被解除安裝,欲再次使用必須重新安裝。"
+
+#: 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 "部分已安裝軟體和 %s 不相容。繼續升級會將下列軟體移除:"
+
+#: src/gs-removal-dialog.ui:4
+msgid "Incompatible Software"
+msgstr "不相容的軟體"
+
+#: src/gs-removal-dialog.ui:23
+msgid "_Continue"
+msgstr "繼續(_C)"
+
+#. 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 "自「%s」安裝的軟體將無法繼續接收更新。"
+
+#: 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 "停用(_D)"
+
+#. TRANSLATORS: this is button text to remove a repo
+#: src/gs-repos-dialog.c:257
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: 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 "從已選擇的第三方來源取用額外軟體庫—%s。"
+
+#: src/gs-repos-dialog.c:528
+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: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 "這些軟體庫可以補充 %s 所預裝軟體。"
+
+#. 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] "已安裝 %u 個應用程式"
+
+#. 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 個附加元件"
+
+#. 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 個應用程式"
+
+#. 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 個附加元件"
+
+#. 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與%s"
+
+#. 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 "厭惡"
+
+#. 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 "張貼(_P)"
+
+#: 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 <a href=\"https://odrs.gnome.org/"
+"privacy\">privacy policy</a>. The full name attached to your account will be "
+"shown publicly."
+msgstr ""
+"參閱我們的<a href=\"https://odrs.gnome.org/privacy\">隱私權政策</a>以瞭解哪些"
+"資料會被傳送。同時,您的帳號全名也會被公開顯示。"
+
+#: 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:93
+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: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 "《%s》可能不安全"
+
+#. 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》不安全"
+
+#. 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 "過時的 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 "下一張螢幕快照"
+
+#: 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:622
+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:650
+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:732
+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:746
+msgid "Screenshot not valid"
+msgstr "螢幕快照無效"
+
+#. TRANSLATORS: this is when networking is not available
+#: src/gs-screenshot-image.c:796
+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] "其他 %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 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 "無法自 %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 "無法自 %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 "無法下載更新"
+
+#. 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 "無法自 %s 下載更新:磁碟空間不足"
+
+#. 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 "無法安裝%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 "無法安裝%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:1391
+#, c-format
+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:1397
+#, c-format
+msgid "Unable to install %s as not supported"
+msgstr "無法安裝%s,未提供支援"
+
+#. 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 "無法安裝%s:磁碟空間不足"
+
+#. TRANSLATORS: failure text for the in-app notification
+#: src/gs-shell.c:1418
+#, c-format
+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:1424
+#, c-format
+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:1430
+#, c-format
+msgid "Unable to install %s: you do not have permission to install 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:1437
+#, c-format
+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. "Dell XPS 13")
+#: src/gs-shell.c:1443
+#, c-format
+msgid "Unable to install %s: The battery level is too low"
+msgstr "無法安裝%s:電池電量過低"
+
+#. 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 "無法安裝%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 "無法自 %2$s 更新%1$s,下載失敗"
+
+#. 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 "無法更新%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:1511
+#, c-format
+msgid "Unable to install updates from %s as download failed"
+msgstr "無法自 %s 安裝更新,下載失敗"
+
+#. 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 "無法更新%s:磁碟空間不足"
+
+#. 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 "無法更新%s:需要核對身分"
+
+#. 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 "無法更新%s:身分核對無效"
+
+#. 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 "無法更新%s:您沒有更新軟體的許可權"
+
+#. 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 "無法更新%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: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 "無法安裝%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: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 "無法更新%s"
+
+#. 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 "無法自 %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:1665
+#, c-format
+msgid "Unable to upgrade to %s as download failed"
+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:1673
+#, c-format
+msgid ""
+"Unable to upgrade to %s: internet access was required but wasn’t available"
+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:1681
+#, c-format
+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:1688
+#, c-format
+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:1694
+#, c-format
+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:1700
+#, c-format
+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:1706
+#, c-format
+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:1712
+#, c-format
+msgid "Unable to upgrade to %s: The battery level is too low"
+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:1721
+#, c-format
+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:1758
+#, c-format
+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:1763
+#, c-format
+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:1768
+#, c-format
+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:1774
+#, c-format
+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:1780
+#, c-format
+msgid "Unable to remove %s: The battery level is too low"
+msgstr "無法移除%s:電池電量過低"
+
+#. 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 "無法移除%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 "無法啟動%s:未安裝 %s"
+
+#. 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 "無法聯絡 %s"
+
+#. 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 "軟體庫(_S)"
+
+#: src/gs-shell.ui:12
+msgid "_Update Preferences"
+msgstr "更新偏好設定(_U)"
+
+#. 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 "深入瞭解(_M)"
+
+#. 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 <a href=\"dummy\">_application settings</"
+"a>."
+msgstr "快取資料可以從<a href=\"dummy\">應用程式設定</a>中清除。"
+
+#: src/gs-summary-tile.c:118
+#, c-format
+msgid "%s (Installed)"
+msgstr "%s(已安裝)"
+
+#: src/gs-summary-tile.c:123
+#, c-format
+msgid "%s (Installing)"
+msgstr "%s(正在安裝)"
+
+#: src/gs-summary-tile.c:128
+#, c-format
+msgid "%s (Removing)"
+msgstr "%s(正在移除)"
+
+#. 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 "安裝於 %s"
+
+#: 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] "%u 個應用程式已更新—需重新啟動"
+
+#. 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 個應用程式已更新"
+
+#. 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 "《%s》與《%s》已更新。"
+
+#. 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 個應用程式需重新啟動。"
+
+#. 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 "新版的 %s 已可安裝"
+
+#. 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 "歡迎使用 %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] "軟體更新已安裝"
+
+#. 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] "重要的作業系統更新已安裝。"
+
+#. 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 "上次檢查時間:%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 不再提供支援。"
+
+#: 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 "無論如何都檢查(_A)"
+
+#. 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 "無論如何都檢查(_C)"
+
+#: 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 "網路設定(_N)"
+
+#: 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 "下載(_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:90
+#, 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:95
+#, c-format
+msgid "%s Available"
+msgstr "%s 已推出新版本"
+
+#: 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 "已下載 %s,共 %s"
+
+#. 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%%"
+
+#: 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 "重新啟動並升級(_R)"
+
+#: 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 ""
+"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: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 "%s 的更新,包含新功能與錯誤修正。"
+
+#: plugins/eos-updater/gs-plugin-eos-updater.c:970
+msgid "EOS update service could not fetch and apply the update."
+msgstr "無法取得 EOS 更新服務並套用更新。"
+
+#: plugins/epiphany/gs-plugin-epiphany.c:498
+msgid "GNOME Web"
+msgstr "GNOME《網頁》"
+
+#: 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:404
+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 "《Flatpak》為一種用於 Linux 的桌面應用程式框架"
+
+#. 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 "系統資料夾 %s"
+
+#: plugins/flatpak/gs-flatpak.c:314 plugins/flatpak/gs-flatpak.c:315
+#, c-format
+msgid "Home subfolder %s"
+msgstr "家目錄中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:316
+msgid "Host system folders"
+msgstr "主機系統資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:317
+msgid "Host system configuration from /etc"
+msgstr "/etc 中的主機系統設定值"
+
+#: plugins/flatpak/gs-flatpak.c:318
+msgid "Desktop folder"
+msgstr "桌面資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:318
+#, c-format
+msgid "Desktop subfolder %s"
+msgstr "「桌面」中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:319
+msgid "Documents folder"
+msgstr "文件資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:319
+#, c-format
+msgid "Documents subfolder %s"
+msgstr "「文件」中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:320
+msgid "Music folder"
+msgstr "音樂資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:320
+#, c-format
+msgid "Music subfolder %s"
+msgstr "「音樂」中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:321
+msgid "Pictures folder"
+msgstr "圖片資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:321
+#, c-format
+msgid "Pictures subfolder %s"
+msgstr "「圖片」中的 %s 資料夾"
+
+#: 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 "「公共」中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:323
+msgid "Videos folder"
+msgstr "影片資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:323
+#, c-format
+msgid "Videos subfolder %s"
+msgstr "「影片」中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:324
+msgid "Templates folder"
+msgstr "模板資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:324
+#, c-format
+msgid "Templates subfolder %s"
+msgstr "「模板」中的 %s 資料夾"
+
+#: 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 "使用者快取中的 %s 資料夾"
+
+#: 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 "使用者設定值中的 %s 資料夾"
+
+#: 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 "使用者資料中的 %s 資料夾"
+
+#: 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 "使用者執行時期中的 %s 資料夾"
+
+#: plugins/flatpak/gs-flatpak.c:386
+#, c-format
+msgid "Filesystem access to %s"
+msgstr "%s 的檔案系統取用權"
+
+#. TRANSLATORS: status text when downloading new metadata
+#: plugins/flatpak/gs-flatpak.c:1403
+#, c-format
+msgid "Getting flatpak metadata for %s…"
+msgstr "正在取得《%s》的 flatpak 中介資料…"
+
+#: plugins/flatpak/gs-flatpak.c:3579
+#, 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-plugin-flatpak.c:1037
+#, c-format
+msgid "Failed to add to install for addon ‘%s’: %s"
+msgstr "無法將附加元件「%s」加入至安裝︰%s"
+
+#: plugins/flatpak/gs-plugin-flatpak.c:1051
+#, c-format
+msgid "Failed to add to uninstall for addon ‘%s’: %s"
+msgstr "無法將附加元件「%s」加入至解除安裝︰%s"
+
+#: 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 ""
+"「%s」遠端不允許安裝「%s」,可能是其過濾器所造成的。\n"
+"請移除過濾器並重試。詳細錯誤資訊:%s"
+
+#. 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」裝置更新"
+
+#. 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」系統更新"
+
+#. 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」內嵌控制器更新"
+
+#. 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 更新"
+
+#. 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 更新"
+
+#. 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 更新"
+
+#. 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」控制器更新"
+
+#. 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 控制器更新"
+
+#. 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」CPU 微碼更新"
+
+#. 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」組態設定更新"
+
+#. TRANSLATORS: battery refers to the system power source
+#: plugins/fwupd/gs-fwupd-app.c:185
+#, 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:190
+#, c-format
+msgid "%s Camera Update"
+msgstr "「%s」相機更新"
+
+#. TRANSLATORS: TPM refers to a Trusted Platform Module
+#: plugins/fwupd/gs-fwupd-app.c:194
+#, c-format
+msgid "%s TPM Update"
+msgstr "「%s」TPM 更新"
+
+#. TRANSLATORS: TouchPad refers to a flat input device
+#: plugins/fwupd/gs-fwupd-app.c:198
+#, c-format
+msgid "%s Touchpad Update"
+msgstr "「%s」觸控板更新"
+
+#. TRANSLATORS: Mouse refers to a handheld input device
+#: plugins/fwupd/gs-fwupd-app.c:202
+#, c-format
+msgid "%s Mouse Update"
+msgstr "「%s」滑鼠更新"
+
+#. TRANSLATORS: Keyboard refers to an input device for typing
+#: plugins/fwupd/gs-fwupd-app.c:206
+#, c-format
+msgid "%s Keyboard Update"
+msgstr "「%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」儲存控制器更新"
+
+#. 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」網路介面更新"
+
+#. 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」顯示器更新"
+
+#. 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 更新"
+
+#. 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 "「%s」USB 接收器更新"
+
+#: 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 "作業系統 (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 "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 "system"
+#~ 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 "_Installed"
+#~ msgstr "已安裝(_I)"
+
+#~ msgid "_Updates"
+#~ msgstr "更新(_U)"
+
+#~ 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 "Reference"
+#~ 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 "Unknown Software License"
+#~ 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 "Remove"
+#~ msgstr "移除"
+
+#~ msgid "No Additional Repositories"
+#~ msgstr "無額外軟體庫"
+
+#~ msgid "_Enable"
+#~ msgstr "啟用(_E)"
+
+#~ 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 "_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"
+
+#~ 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, %R"
+#~ msgstr "昨日 %R"
+
+#~ 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 "App ID"
+#~ msgstr "App ID"
+
+#~ 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 "Delete Design"
+#~ msgstr "刪除設計"
+
+#~ msgid "OS Upgrade"
+#~ 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 "Unable to purchase %s"
+#~ 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 "U_pdate All"
+#~ msgstr "全部更新(_P)"
+
+#~ 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 "_Install All"
+#~ msgstr "全部安裝(_I)"
+
+#~ 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 "web app"
+#~ 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 "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 "No sources found."
+#~ msgstr "找不到來源。"
+
+#~ msgid "OK"
+#~ 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..1dd0d56
--- /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/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..4efe369
--- /dev/null
+++ b/src/gnome-software.gresource.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/Software">
+ <file preprocess="xml-stripblanks">gs-age-rating-context-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-addon-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-context-bar.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-details-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-reviews-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-version-history-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-version-history-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-app-translation-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-basic-auth-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-category-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-category-tile.ui</file>
+ <file preprocess="xml-stripblanks">gs-context-dialog-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-details-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-extras-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-feature-tile.ui</file>
+ <file preprocess="xml-stripblanks">gs-featured-carousel.ui</file>
+ <file preprocess="xml-stripblanks">gs-hardware-support-context-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-info-bar.ui</file>
+ <file preprocess="xml-stripblanks">gs-info-window.ui</file>
+ <file preprocess="xml-stripblanks">gs-installed-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-license-tile.ui</file>
+ <file preprocess="xml-stripblanks">gs-loading-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-lozenge.ui</file>
+ <file preprocess="xml-stripblanks">gs-metered-data-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-moderate-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-overview-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-origin-popover-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-os-update-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-prefs-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-progress-button.ui</file>
+ <file preprocess="xml-stripblanks">gs-removal-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-repo-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-repos-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-review-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-review-histogram.ui</file>
+ <file preprocess="xml-stripblanks">gs-review-row.ui</file>
+ <file preprocess="xml-stripblanks">gs-safety-context-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-screenshot-carousel.ui</file>
+ <file preprocess="xml-stripblanks">gs-screenshot-image.ui</file>
+ <file preprocess="xml-stripblanks">gs-search-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-shell.ui</file>
+ <file preprocess="xml-stripblanks">gs-star-widget.ui</file>
+ <file preprocess="xml-stripblanks">gs-storage-context-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-summary-tile.ui</file>
+ <file preprocess="xml-stripblanks">gs-update-dialog.ui</file>
+ <file preprocess="xml-stripblanks">gs-updates-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-updates-section.ui</file>
+ <file preprocess="xml-stripblanks">gs-upgrade-banner.ui</file>
+ <file preprocess="xml-stripblanks">org.freedesktop.PackageKit.xml</file>
+ <file>style.css</file>
+ <file>style-dark.css</file>
+ <file>style-hc.css</file>
+ <file preprocess="xml-stripblanks" alias="up-to-date.svg">../data/assets/up-to-date.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-addon.svg">../data/icons/system-component-addon.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-application.svg">../data/icons/system-component-application.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-codecs.svg">../data/icons/system-component-codecs.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-driver.svg">../data/icons/system-component-driver.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-firmware.svg">../data/icons/system-component-firmware.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-input-sources.svg">../data/icons/system-component-input-sources.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-language.svg">../data/icons/system-component-language.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-os-updates.svg">../data/icons/system-component-os-updates.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/apps/system-component-runtime.svg">../data/icons/system-component-runtime.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Create.svg">../data/icons/org.gnome.Software.Create.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Develop.svg">../data/icons/org.gnome.Software.Develop.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Learn.svg">../data/icons/org.gnome.Software.Learn.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Play.svg">../data/icons/org.gnome.Software.Play.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Socialize.svg">../data/icons/org.gnome.Software.Socialize.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/categories/org.gnome.Software.Work.svg">../data/icons/org.gnome.Software.Work.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/adaptive-symbolic.svg">../data/icons/adaptive-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/chat-none-symbolic.svg">../data/icons/chat-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/chat-symbolic.svg">../data/icons/chat-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/cigarette-none-symbolic.svg">../data/icons/cigarette-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/cigarette-symbolic.svg">../data/icons/cigarette-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/community-none-symbolic.svg">../data/icons/community-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/community-symbolic.svg">../data/icons/community-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/desktop-symbolic.svg">../data/icons/desktop-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/emblem-synchronizing-symbolic.svg">../data/icons/emblem-synchronizing-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/explore-symbolic.svg">../data/icons/explore-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/external-link-symbolic.svg">../data/icons/external-link-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/flag-outline-thin-symbolic.svg">../data/icons/flag-outline-thin-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/graveyard-symbolic.svg">../data/icons/graveyard-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/hand-open-symbolic.svg">../data/icons/hand-open-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/heart-filled-symbolic.svg">../data/icons/heart-filled-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/help-link-symbolic.svg">../data/icons/help-link-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/money-none-symbolic.svg">../data/icons/money-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/money-symbolic.svg">../data/icons/money-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/nudity-none-symbolic.svg">../data/icons/nudity-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/nudity-symbolic.svg">../data/icons/nudity-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/app-installed-symbolic.svg">../data/icons/app-installed-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/padlock-open-symbolic.svg">../data/icons/padlock-open-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/phone-symbolic.svg">../data/icons/phone-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/pub-symbolic.svg">../data/icons/pub-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/review-symbolic.svg">../data/icons/review-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/safety-symbolic.svg">../data/icons/safety-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/devices/sign-language-symbolic.svg">../data/icons/sign-language-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/strong-language-none-symbolic.svg">../data/icons/strong-language-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/strong-language-symbolic.svg">../data/icons/strong-language-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/test-symbolic.svg">../data/icons/test-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/violence-none-symbolic.svg">../data/icons/violence-none-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/violence-symbolic.svg">../data/icons/violence-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/webpage-symbolic.svg">../data/icons/webpage-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/flatpak-symbolic.svg">../data/icons/flatpak-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/package-x-generic-symbolic.svg">../data/icons/package-x-generic-symbolic.svg</file>
+ <file preprocess="xml-stripblanks" alias="icons/scalable/emblems/snap-symbolic.svg">../data/icons/snap-symbolic.svg</file>
+ </gresource>
+</gresources>
diff --git a/src/gnome-software.xml b/src/gnome-software.xml
new file mode 100644
index 0000000..5f87829
--- /dev/null
+++ b/src/gnome-software.xml
@@ -0,0 +1,74 @@
+<?xml version='1.0'?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+
+<refentry id="gnome-software">
+
+ <refentryinfo>
+ <title>gnome-software</title>
+ <productname>GNOME</productname>
+ <author>
+ <contrib>Maintainer</contrib>
+ <firstname>Richard</firstname>
+ <surname>Hughes</surname>
+ <email>richard@hughsie.com</email>
+ </author>
+ <copyright>
+ <year>2013</year>
+ <holder>Richard Hughes</holder>
+ </copyright>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle>gnome-software</refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo class="manual">User Commands</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname>gnome-software</refname>
+ <refpurpose>Install applications</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>gnome-software</command>
+ <arg choice="opt" rep="repeat">OPTION</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+ <para>
+ This manual page documents briefly the <command>gnome-software</command> command.
+ </para>
+ <para>
+ <command>gnome-software</command> allows you to add and remove
+ applications and update your system.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Options</title>
+ <variablelist>
+ <varlistentry>
+ <term><option>-?</option>, <option>--help</option></term>
+ <listitem><para>Prints a short help text and exits.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--version</option></term>
+ <listitem><para>Prints the program version and exits.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--mode</option> <replaceable>MODE</replaceable></term>
+ <listitem><para>Starts gnome-software in the given mode. <replaceable>MODE</replaceable> can be 'updates', 'updated', 'installed' or 'overview'. The default mode is 'overview'.</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Author</title>
+ <para>This manual page was written by Richard Hughes <email>richard@hughsie.com</email>.
+ </para>
+ </refsect1>
+</refentry>
diff --git a/src/gs-age-rating-context-dialog.c b/src/gs-age-rating-context-dialog.c
new file mode 100644
index 0000000..4ecf9c5
--- /dev/null
+++ b/src/gs-age-rating-context-dialog.c
@@ -0,0 +1,1253 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 `<content_rating>` 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#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"),
+ "pub-symbolic",
+ NULL,
+ },
+ {
+ "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"),
+ "cigarette-symbolic",
+ "cigarette-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"),
+ "cigarette-symbolic",
+ "cigarette-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"),
+ "chat-symbolic",
+ "chat-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"),
+ "money-symbolic",
+ "money-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"),
+ "money-symbolic",
+ "money-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"),
+ "chat-symbolic",
+ "chat-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-headset-symbolic",
+ NULL,
+ },
+ {
+ "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"),
+ "contact-new-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"),
+ "x-office-address-book-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"),
+ "nudity-symbolic",
+ "nudity-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"),
+ "graveyard-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 ? "cigarette-none-symbolic" : "cigarette-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 ? "chat-none-symbolic" : "chat-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:
+ 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 `<content_rating>` 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;
+ GtkStyleContext *context;
+ 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);
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (lozenge));
+
+ for (gsize i = 0; i < G_N_ELEMENTS (css_age_classes); i++)
+ gtk_style_context_remove_class (context, css_age_classes[i]);
+ gtk_style_context_remove_class (context, "grey");
+
+ gtk_style_context_add_class (context, 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
+gs_age_rating_context_dialog_init (GsAgeRatingContextDialog *self)
+{
+ 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);
+}
+
+/**
+ * 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..f619004
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..d3b601e
--- /dev/null
+++ b/src/gs-age-rating-context-dialog.ui
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsAgeRatingContextDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes" comments="Translators: This is the title of the dialog which contains information about the suitability of an app for different ages.">Age Rating</property>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">True</property>
+ <style>
+ <class name="large"/>
+ <class name="grey"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="title">
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="justify">center</property>
+ <property name="label">Shortwave is appropriate for children</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBox" id="attributes_list">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <!-- Rows are added in code -->
+ <placeholder/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLinkButton">
+ <property name="label" translatable="yes">How to contribute missing information</property>
+ <property name="margin-top">16</property>
+ <property name="uri">https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/software-metadata#age-rating</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c
new file mode 100644
index 0000000..e43f1d7
--- /dev/null
+++ b/src/gs-app-addon-row.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) 2012-2013 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "gs-app-addon-row.h"
+
+struct _GsAppAddonRow
+{
+ GtkListBoxRow parent_instance;
+
+ GsApp *app;
+ GtkWidget *name_label;
+ GtkWidget *description_label;
+ GtkWidget *label;
+ GtkWidget *button_remove;
+ GtkWidget *checkbox;
+};
+
+G_DEFINE_TYPE (GsAppAddonRow, gs_app_addon_row, GTK_TYPE_LIST_BOX_ROW)
+
+enum {
+ PROP_ZERO,
+ PROP_SELECTED
+};
+
+enum {
+ SIGNAL_REMOVE_BUTTON_CLICKED,
+ SIGNAL_LAST
+};
+
+static guint signals [SIGNAL_LAST] = { 0 };
+
+static void
+checkbox_toggled (GtkWidget *widget, GsAppAddonRow *row)
+{
+ g_object_notify (G_OBJECT (row), "selected");
+}
+
+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;
+
+ if (row->app == NULL)
+ return;
+
+ /* join the lines */
+ str = gs_app_addon_row_get_summary (row);
+ as_gstring_replace (str, "\n", " ");
+ gtk_label_set_markup (GTK_LABEL (row->description_label), str->str);
+ gtk_label_set_label (GTK_LABEL (row->name_label),
+ 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_UPDATABLE:
+ case GS_APP_STATE_UPDATABLE_LIVE:
+ case GS_APP_STATE_INSTALLED:
+ gtk_widget_set_visible (row->label, TRUE);
+ gtk_label_set_label (GTK_LABEL (row->label), C_("Single app", "Installed"));
+ 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;
+ default:
+ gtk_widget_set_visible (row->label, FALSE);
+ break;
+ }
+
+ /* update the checkbox, remove button, and activatable state */
+ g_signal_handlers_block_by_func (row->checkbox, checkbox_toggled, row);
+ g_signal_handlers_block_by_func (row->checkbox, app_addon_remove_button_cb, row);
+ switch (gs_app_get_state (row->app)) {
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ gtk_widget_set_sensitive (row->checkbox, TRUE);
+ gtk_check_button_set_active (GTK_CHECK_BUTTON (row->checkbox), TRUE);
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+ break;
+ case GS_APP_STATE_AVAILABLE:
+ case GS_APP_STATE_AVAILABLE_LOCAL:
+ gtk_widget_set_visible (row->checkbox, TRUE);
+ gtk_widget_set_sensitive (row->checkbox, TRUE);
+ gtk_check_button_set_active (GTK_CHECK_BUTTON (row->checkbox), FALSE);
+ gtk_widget_set_visible (row->button_remove, FALSE);
+ 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:
+ gtk_widget_set_visible (row->checkbox, FALSE);
+ gtk_widget_set_visible (row->button_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:
+ gtk_widget_set_sensitive (row->checkbox, FALSE);
+ gtk_check_button_set_active (GTK_CHECK_BUTTON (row->checkbox), TRUE);
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
+ break;
+ case GS_APP_STATE_REMOVING:
+ gtk_widget_set_visible (row->checkbox, FALSE);
+ gtk_widget_set_visible (row->button_remove, TRUE);
+ gtk_widget_set_sensitive (row->button_remove, FALSE);
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
+ break;
+ default:
+ gtk_widget_set_sensitive (row->checkbox, FALSE);
+ gtk_check_button_set_active (GTK_CHECK_BUTTON (row->checkbox), FALSE);
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
+ break;
+ }
+ g_signal_handlers_unblock_by_func (row->checkbox, checkbox_toggled, row);
+ g_signal_handlers_unblock_by_func (row->checkbox, app_addon_remove_button_cb, row);
+}
+
+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_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+ GsAppAddonRow *row = GS_APP_ADDON_ROW (object);
+
+ switch (prop_id) {
+ case PROP_SELECTED:
+ gs_app_addon_row_set_selected (row, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_app_addon_row_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ GsAppAddonRow *row = GS_APP_ADDON_ROW (object);
+
+ switch (prop_id) {
+ case PROP_SELECTED:
+ g_value_set_boolean (value, gs_app_addon_row_get_selected (row));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_app_addon_row_class_init (GsAppAddonRowClass *klass)
+{
+ GParamSpec *pspec;
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->dispose = gs_app_addon_row_dispose;
+ object_class->set_property = gs_app_addon_row_set_property;
+ object_class->get_property = gs_app_addon_row_get_property;
+
+ pspec = g_param_spec_boolean ("selected", NULL, NULL,
+ FALSE, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_SELECTED, pspec);
+
+ 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, name_label);
+ gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, description_label);
+ gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, label);
+ gtk_widget_class_bind_template_child (widget_class, GsAppAddonRow, checkbox);
+ 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->checkbox, "toggled",
+ G_CALLBACK (checkbox_toggled), row);
+ g_signal_connect (row->button_remove, "clicked",
+ G_CALLBACK (app_addon_remove_button_cb), row);
+}
+
+void
+gs_app_addon_row_set_selected (GsAppAddonRow *row, gboolean selected)
+{
+ gtk_check_button_set_active (GTK_CHECK_BUTTON (row->checkbox), selected);
+}
+
+gboolean
+gs_app_addon_row_get_selected (GsAppAddonRow *row)
+{
+ return gtk_check_button_get_active (GTK_CHECK_BUTTON (row->checkbox));
+}
+
+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..257ef86
--- /dev/null
+++ b/src/gs-app-addon-row.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) 2012 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkListBoxRow)
+
+GtkWidget *gs_app_addon_row_new (GsApp *app);
+void gs_app_addon_row_refresh (GsAppAddonRow *row);
+void gs_app_addon_row_set_selected (GsAppAddonRow *row,
+ gboolean selected);
+gboolean gs_app_addon_row_get_selected (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..27384ea
--- /dev/null
+++ b/src/gs-app-addon-row.ui
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsAppAddonRow" parent="GtkListBoxRow">
+ <property name="selectable">False</property>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkBox" id="name_box">
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="margin-bottom">6</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">20</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description_label">
+ <property name="wrap">True</property>
+ <property name="max_width_chars">20</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="valign">center</property>
+ <property name="hexpand">False</property>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">False</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="width_request">100</property>
+ <property name="xalign">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="visible">False</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Uninstall</property>
+ <property name="width_request">105</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbox">
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-context-bar.c b/src/gs-app-context-bar.c
new file mode 100644
index 0000000..2a21c87
--- /dev/null
+++ b/src/gs-app-context-bar.c
@@ -0,0 +1,988 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#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 applications 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 application 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 application.
+ * 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_POTENTIALLY_UNSAFE,
+ SAFETY_UNSAFE
+} SafetyRating;
+
+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. */
+ if (item_rating > *chosen_rating) {
+ 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
+update_safety_tile (GsAppContextBar *self)
+{
+ const gchar *icon_name, *title, *css_class;
+ 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_UNKNOWN;
+ GtkStyleContext *context;
+
+ /* 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);
+ for (GsAppPermissionsFlags i = GS_APP_PERMISSIONS_FLAGS_NONE; i < GS_APP_PERMISSIONS_FLAGS_LAST; i <<= 1) {
+ if (!(perm_flags & i))
+ continue;
+
+ switch (i) {
+ case GS_APP_PERMISSIONS_FLAGS_NONE:
+ 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"));
+ break;
+ 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_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_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_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_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_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 arbitrary 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_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_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;
+ }
+ }
+
+ /* Unknown permissions 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.
+ *
+ * FIXME: We could do better by potentially adding a ‘trusted’ state
+ * to indicate that something is probably safe, but isn’t sandboxed.
+ * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1451 */
+ if (perm_flags == GS_APP_PERMISSIONS_FLAGS_UNKNOWN &&
+ gs_app_has_quirk (self->app, GS_APP_QUIRK_PROVENANCE))
+ add_to_safety_rating (&chosen_rating, descriptions,
+ SAFETY_SAFE,
+ /* 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. */
+ _("Reviewed by your distribution"));
+ else if (perm_flags == GS_APP_PERMISSIONS_FLAGS_UNKNOWN)
+ add_to_safety_rating (&chosen_rating, descriptions,
+ SAFETY_POTENTIALLY_UNSAFE,
+ /* 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. */
+ _("Provided by a third party"));
+
+ /* 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_POTENTIALLY_UNSAFE,
+ /* 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"));
+ else
+ 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"));
+
+ 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"));
+
+ 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_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"));
+
+ 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/new */
+ description = g_strjoinv (_("; "), (gchar **) descriptions->pdata);
+
+ /* Update the UI. */
+ switch (chosen_rating) {
+ case SAFETY_SAFE:
+ icon_name = "safety-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_POTENTIALLY_UNSAFE:
+ icon_name = "dialog-question-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 = "yellow";
+ break;
+ case SAFETY_UNSAFE:
+ icon_name = "dialog-warning-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);
+
+ context = gtk_widget_get_style_context (self->tiles[SAFETY_TILE].lozenge);
+
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_remove_class (context, "red");
+
+ gtk_style_context_add_class (context, 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;
+ GtkStyleContext *context;
+
+ g_assert (self->app != NULL);
+
+ /* Don’t show the hardware support tile for non-desktop applications. */
+ 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,
+ &current_match, &current_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 = "phone-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 = "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 = "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 = "phone-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 = "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 = "desktop-symbolic";
+ title = _("Desktop Only");
+ description = _("Probably requires a keyboard or mouse");
+ css_class = "yellow";
+ } else {
+ icon_name = "desktop-symbolic";
+ title = _("Desktop Only");
+ description = _("Works on desktops and laptops");
+ css_class = "grey";
+ }
+ }
+
+ /* Update the UI. The `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, "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);
+
+ context = gtk_widget_get_style_context (self->tiles[HARDWARE_SUPPORT_TILE].lozenge);
+
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_remove_class (context, "red");
+
+ gtk_style_context_add_class (context, css_class);
+
+ if (g_str_equal (icon_name, "adaptive-symbolic"))
+ gtk_style_context_add_class (context, "wide-image");
+ else
+ gtk_style_context_remove_class (context, "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/new */
+ 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 applications. */
+ 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);
+ GtkWindow *dialog;
+ GtkRoot *root = gtk_widget_get_root (widget);
+
+ if (GTK_IS_WINDOW (root)) {
+ if (widget == self->tiles[STORAGE_TILE].tile)
+ dialog = GTK_WINDOW (gs_storage_context_dialog_new (self->app));
+ else if (widget == self->tiles[SAFETY_TILE].tile)
+ dialog = GTK_WINDOW (gs_safety_context_dialog_new (self->app));
+ else if (widget == self->tiles[HARDWARE_SUPPORT_TILE].tile)
+ dialog = GTK_WINDOW (gs_hardware_support_context_dialog_new (self->app));
+ else if (widget == self->tiles[AGE_RATING_TILE].tile)
+ dialog = GTK_WINDOW (gs_age_rating_context_dialog_new (self->app));
+ else
+ g_assert_not_reached ();
+
+ gtk_window_set_transient_for (dialog, GTK_WINDOW (root));
+ gtk_widget_show (GTK_WIDGET (dialog));
+ }
+}
+
+static void
+gs_app_context_bar_init (GsAppContextBar *self)
+{
+ 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..e016747
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..db70912
--- /dev/null
+++ b/src/gs-app-context-bar.ui
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsAppContextBar" parent="GtkBox">
+ <property name="homogeneous">True</property>
+ <property name="spacing">0</property>
+ <style>
+ <class name="card"/>
+ </style>
+
+ <child>
+ <object class="GtkBox">
+ <property name="homogeneous">True</property>
+
+ <child>
+ <object class="GtkButton" id="storage_tile">
+ <signal name="clicked" handler="tile_clicked_cb"/>
+ <style>
+ <class name="context-tile"/>
+ <class name="flat"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GsLozenge" id="storage_tile_lozenge">
+ <property name="circular">False</property>
+ <style>
+ <class name="grey"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">storage_tile_title</relation>
+ <relation name="details">storage_tile_description</relation>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="storage_tile_title">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Download Size</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="storage_tile_description">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Needs 150 MB of additional system downloads</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="caption"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkButton" id="safety_tile">
+ <signal name="clicked" handler="tile_clicked_cb"/>
+ <style>
+ <class name="context-tile"/>
+ <class name="flat"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GsLozenge" id="safety_tile_lozenge">
+ <property name="circular">True</property>
+ <!-- this is a placeholder: the icon is actually set in code -->
+ <property name="icon-name">safety-symbolic</property>
+ <style>
+ <class name="green"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">safety_tile_title</relation>
+ <relation name="details">safety_tile_description</relation>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="safety_tile_title">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Safe</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="safety_tile_description">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Auditable, no tracking, few permissions</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="caption"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkBox">
+ <property name="homogeneous">True</property>
+
+ <child>
+ <object class="GtkButton" id="hardware_support_tile">
+ <signal name="clicked" handler="tile_clicked_cb"/>
+ <style>
+ <class name="context-tile"/>
+ <class name="flat"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GsLozenge" id="hardware_support_tile_lozenge">
+ <property name="circular">False</property>
+ <!-- this is a placeholder: the icon is actually set in code -->
+ <property name="icon-name">adaptive-symbolic</property>
+ <property name="pixel-size">56</property>
+ <style>
+ <class name="green"/>
+ <class name="wide-image"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">hardware_support_tile_title</relation>
+ <relation name="details">hardware_support_tile_description</relation>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hardware_support_tile_title">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Adaptive</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hardware_support_tile_description">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Works on phones, tablets and desktops</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="caption"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkButton" id="age_rating_tile">
+ <signal name="clicked" handler="tile_clicked_cb"/>
+ <style>
+ <class name="context-tile"/>
+ <class name="flat"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GsLozenge" id="age_rating_tile_lozenge">
+ <property name="circular">True</property>
+ <style>
+ <class name="details-rating-18"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">age_rating_tile_title</relation>
+ <relation name="details">age_rating_tile_description</relation>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="age_rating_tile_title">
+ <property name="justify">center</property>
+ <!-- this one’s not a placeholder -->
+ <property name="label" translatable="yes">Age Rating</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="age_rating_tile_description">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">May contain sex, drugs, rock‘n’roll and more</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="caption"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+
+ <object class="GtkSizeGroup" id="app_context_bar_size_group">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="storage_tile_lozenge"/>
+ <widget name="safety_tile_lozenge"/>
+ <widget name="hardware_support_tile_lozenge"/>
+ <widget name="age_rating_tile_lozenge"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-app-details-page.c b/src/gs-app-details-page.c
new file mode 100644
index 0000000..c224f2a
--- /dev/null
+++ b/src/gs-app-details-page.c
@@ -0,0 +1,451 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2021 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * SECTION:gs-app-details-page
+ * @title: GsAppDetailsPage
+ * @include: gnome-software.h
+ * @stability: Stable
+ * @short_description: A small page showing an application's details
+ *
+ * This is a page from #GsUpdateDialog.
+ */
+
+#include "config.h"
+
+#include <adwaita.h>
+#include <glib/gi18n.h>
+
+#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_SHOW_BACK_BUTTON,
+ PROP_TITLE,
+} GsAppDetailsPageProperty;
+
+enum {
+ SIGNAL_BACK_CLICKED,
+ SIGNAL_LAST
+};
+
+static GParamSpec *obj_props[PROP_TITLE + 1] = { NULL, };
+
+static guint signals[SIGNAL_LAST] = { 0 };
+
+struct _GsAppDetailsPage
+{
+ GtkBox parent_instance;
+
+ GtkWidget *back_button;
+ GtkWidget *header_bar;
+ GtkWidget *label_details;
+ GtkWidget *permissions_section;
+ GtkWidget *permissions_section_list;
+ GtkWidget *status_page;
+ AdwWindowTitle *window_title;
+
+ GsApp *app; /* (owned) (nullable) */
+};
+
+G_DEFINE_TYPE (GsAppDetailsPage, gs_app_details_page, GTK_TYPE_BOX)
+
+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 system device files") },
+ { 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_style_context_add_class (gtk_widget_get_style_context (row), "permission-row-warning");
+
+ image = gtk_image_new_from_icon_name ("dialog-warning-symbolic");
+ if (!is_warning_row)
+ gtk_widget_set_opacity (image, 0);
+
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE);
+#endif
+ 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_updates_description_ui (GsAppDetailsPage *page, GsApp *app)
+{
+ g_autoptr(GIcon) icon = NULL;
+ guint icon_size;
+ const gchar *update_details;
+ GdkDisplay *display;
+ g_autoptr (GtkIconPaintable) paintable = NULL;
+
+ /* FIXME support app == NULL */
+
+ /* set window title */
+ adw_window_title_set_title (page->window_title, _("Update Details"));
+ g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_TITLE]);
+
+ /* set update header */
+ update_details = gs_app_get_update_details_markup (app);
+ if (update_details == NULL) {
+ /* 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 (page->label_details), update_details);
+ 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), gs_app_get_summary (app));
+
+ /* 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)),
+ "system-component-application");
+ }
+
+ 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_show (page->permissions_section);
+ populate_permissions_section (page, permissions);
+ } else {
+ gtk_widget_hide (page->permissions_section);
+ }
+}
+
+/**
+ * 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]);
+}
+
+/**
+ * gs_app_details_page_get_show_back_button:
+ * @page: a #GsAppDetailsPage
+ *
+ * Get the value of #GsAppDetailsPage:show-back-button.
+ *
+ * Returns: whether to show the back button
+ *
+ * Since: 41
+ */
+gboolean
+gs_app_details_page_get_show_back_button (GsAppDetailsPage *page)
+{
+ g_return_val_if_fail (GS_IS_APP_DETAILS_PAGE (page), FALSE);
+ return gtk_widget_get_visible (page->back_button);
+}
+
+/**
+ * gs_app_details_page_set_show_back_button:
+ * @page: a #GsAppDetailsPage
+ * @show_back_button: whether to show the back button
+ *
+ * Set the value of #GsAppDetailsPage:show-back-button.
+ *
+ * Since: 41
+ */
+void
+gs_app_details_page_set_show_back_button (GsAppDetailsPage *page, gboolean show_back_button)
+{
+ g_return_if_fail (GS_IS_APP_DETAILS_PAGE (page));
+
+ show_back_button = !!show_back_button;
+
+ if (gtk_widget_get_visible (page->back_button) == show_back_button)
+ return;
+
+ gtk_widget_set_visible (page->back_button, show_back_button);
+
+ g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_SHOW_BACK_BUTTON]);
+}
+
+static void
+back_clicked_cb (GtkWidget *widget, GsAppDetailsPage *page)
+{
+ g_signal_emit (page, signals[SIGNAL_BACK_CLICKED], 0);
+}
+
+static void
+gs_app_details_page_dispose (GObject *object)
+{
+ GsAppDetailsPage *page = GS_APP_DETAILS_PAGE (object);
+
+ 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_SHOW_BACK_BUTTON:
+ g_value_set_boolean (value, gs_app_details_page_get_show_back_button (page));
+ break;
+ case PROP_TITLE:
+ g_value_set_string (value, adw_window_title_get_title (page->window_title));
+ 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_SHOW_BACK_BUTTON:
+ gs_app_details_page_set_show_back_button (page, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_app_details_page_init (GsAppDetailsPage *page)
+{
+ gtk_widget_init_template (GTK_WIDGET (page));
+}
+
+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:show-back-button
+ *
+ * Whether to show the back button.
+ *
+ * Since: 41
+ */
+ obj_props[PROP_SHOW_BACK_BUTTON] =
+ g_param_spec_boolean ("show-back-button", NULL, NULL,
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
+ /**
+ * GsAppDetailsPage:title
+ *
+ * Read-only window title.
+ *
+ * Since: 42
+ */
+ obj_props[PROP_TITLE] =
+ g_param_spec_string ("title", NULL, NULL,
+ NULL,
+ 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);
+
+ /**
+ * GsAppDetailsPage:back-clicked:
+ * @app: a #GsApp
+ *
+ * Emitted when the back button got activated and the #GsUpdateDialog
+ * containing this page is expected to go back.
+ *
+ * Since: 41
+ */
+ signals[SIGNAL_BACK_CLICKED] =
+ g_signal_new ("back-clicked",
+ 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-details-page.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, back_button);
+ gtk_widget_class_bind_template_child (widget_class, GsAppDetailsPage, header_bar);
+ 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, window_title);
+ gtk_widget_class_bind_template_callback (widget_class, back_clicked_cb);
+}
+
+/**
+ * gs_app_details_page_new:
+ *
+ * Create a new #GsAppDetailsPage.
+ *
+ * Returns: (transfer full): a new #GsAppDetailsPage
+ * Since: 41
+ */
+GtkWidget *
+gs_app_details_page_new (void)
+{
+ return GTK_WIDGET (g_object_new (GS_TYPE_APP_DETAILS_PAGE, NULL));
+}
diff --git a/src/gs-app-details-page.h b/src/gs-app-details-page.h
new file mode 100644
index 0000000..60b823a
--- /dev/null
+++ b/src/gs-app-details-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) 2021 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkBox)
+
+GtkWidget *gs_app_details_page_new (void);
+GsApp *gs_app_details_page_get_app (GsAppDetailsPage *page);
+void gs_app_details_page_set_app (GsAppDetailsPage *page,
+ GsApp *app);
+gboolean gs_app_details_page_get_show_back_button (GsAppDetailsPage *page);
+void gs_app_details_page_set_show_back_button (GsAppDetailsPage *page,
+ gboolean show_back_button);
+
+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..2cf1ad1
--- /dev/null
+++ b/src/gs-app-details-page.ui
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsAppDetailsPage" parent="GtkBox">
+ <property name="orientation">vertical</property>
+
+ <child>
+ <object class="AdwHeaderBar" id="header_bar">
+ <property name="valign">start</property>
+ <property name="show_start_title_buttons">True</property>
+ <property name="show_end_title_buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle" id="window_title" />
+ </property>
+ <child type="start">
+ <object class="GtkButton" id="back_button">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <signal name="clicked" handler="back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <accessibility>
+ <property name="label" translatable="yes">Go back</property>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwStatusPage" id="status_page">
+ <property name="icon_name">system-component-application</property>
+ <property name="title">Inkscape</property>
+ <property name="description">Vector based drawing program</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="compact"/>
+ <class name="icon-dropshadow"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwPreferencesGroup" id="permissions_section">
+ <property name="title" translatable="yes">Requires additional permissions</property>
+ <!-- We can't remove children from a AdwPreferencesGroup
+ without knowing them beforehand, so let's simply
+ include a GtkListBox and remove its children. -->
+ <child>
+ <object class="GtkListBox" id="permissions_section_list">
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox">
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <child>
+ <object class="GtkLabel" id="label_details">
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+ <property name="label">New in kmod 14-1
+* Moo
+* bar</property>
+ <property name="wrap">True</property>
+ <property name="selectable">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-reviews-dialog.c b/src/gs-app-reviews-dialog.c
new file mode 100644
index 0000000..a00bef0
--- /dev/null
+++ b/src/gs-app-reviews-dialog.c
@@ -0,0 +1,559 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright (C) Adrien Plazas <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-app-reviews-dialog.h"
+
+#include "gnome-software-private.h"
+#include "gs-common.h"
+#include "gs-review-row.h"
+#include <glib/gi18n.h>
+
+struct _GsAppReviewsDialog
+{
+ GtkDialog parent_instance;
+ 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, GTK_TYPE_DIALOG)
+
+typedef enum {
+ PROP_APP = 1,
+ PROP_ODRS_PROVIDER,
+ PROP_PLUGIN_LOADER,
+} GsAppReviewsDialogProperty;
+
+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 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_button_clicked_cb (GsReviewRow *row,
+ GsReviewAction action,
+ GsAppReviewsDialog *self)
+{
+ AsReview *review = gs_review_row_get_review (row);
+ g_autoptr(GError) local_error = NULL;
+
+ g_assert (self->odrs_provider != NULL);
+
+ /* FIXME: Make this async */
+ switch (action) {
+ case GS_REVIEW_ACTION_UPVOTE:
+ gs_odrs_provider_upvote_review (self->odrs_provider, self->app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_DOWNVOTE:
+ gs_odrs_provider_downvote_review (self->odrs_provider, self->app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_REPORT:
+ gs_odrs_provider_report_review (self->odrs_provider, self->app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_REMOVE:
+ gs_odrs_provider_remove_review (self->odrs_provider, self->app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_DISMISS:
+ /* The dismiss action is only used from the moderate page. */
+ default:
+ g_assert_not_reached ();
+ }
+
+ if (local_error != NULL) {
+ g_warning ("failed to set review on %s: %s",
+ gs_app_get_id (self->app), local_error->message);
+ return;
+ }
+
+ refresh_reviews (self);
+}
+
+static void
+populate_reviews (GsAppReviewsDialog *self)
+{
+ GPtrArray *reviews;
+ 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 */
+ gs_widget_remove_all (self->listbox, (GsRemoveFunc) gtk_list_box_remove);
+ g_ptr_array_sort (reviews, (GCompareFunc) sort_reviews);
+ for (i = 0; i < reviews->len; i++) {
+ AsReview *review = g_ptr_array_index (reviews, i);
+ GtkWidget *row = gs_review_row_new (review);
+ guint64 actions;
+
+ 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_set_network_available (GS_REVIEW_ROW (row),
+ GS_IS_PLUGIN_LOADER (self->plugin_loader) && gs_plugin_loader_get_network_available (self->plugin_loader));
+ }
+
+ 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 = GS_APP_REVIEWS_DIALOG (user_data);
+ g_autoptr(GError) error = NULL;
+
+ if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) {
+ 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, 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:
+ * @parent: (nullable): a #GtkWindow, or %NULL
+ * @app: (nullable): a #GsApp, or %NULL
+ * @odrs_provider: (nullable): a #GsOdrsProvider, or %NULL
+ * @plugin_loader: (nullable): a #GsPluginLoader, or %NULL
+ *
+ * Create a new #GsAppReviewsDialog transient for @parent, 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 (GtkWindow *parent, GsApp *app, GsOdrsProvider *odrs_provider, GsPluginLoader *plugin_loader)
+{
+ GsAppReviewsDialog *self;
+
+ g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
+ 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,
+ "modal", TRUE,
+ "odrs-provider", odrs_provider,
+ "plugin-loader", plugin_loader,
+ "transient-for", parent,
+ "use-header-bar", TRUE,
+ 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..76dd5dc
--- /dev/null
+++ b/src/gs-app-reviews-dialog.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 Adrien Plazas <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkDialog)
+
+GtkWidget *gs_app_reviews_dialog_new (GtkWindow *parent,
+ 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..2ceee89
--- /dev/null
+++ b/src/gs-app-reviews-dialog.ui
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsAppReviewsDialog" parent="GtkDialog">
+ <property name="title" translatable="yes">Reviews</property>
+ <property name="default_width">550</property>
+ <property name="default_height">600</property>
+ <property name="width_request">360</property>
+ <property name="height_request">400</property>
+ <property name="use_header_bar">1</property>
+ <child internal-child="headerbar">
+ <object class="AdwHeaderBar"/>
+ </child>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkStack" id="stack">
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">empty</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="description" translatable="yes">No reviews were found for this application.</property>
+ <property name="icon-name">review-symbolic</property>
+ <property name="title" translatable="yes">No Reviews</property>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">reviews</property>
+ <property name="child">
+ <object class="GtkScrolledWindow">
+ <child>
+ <object class="AdwClamp">
+ <property name="vexpand">True</property>
+ <property name="hexpand">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <child>
+ <object class="GtkListBox" id="listbox">
+ <property name="selection-mode">none</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
new file mode 100644
index 0000000..0cc9895
--- /dev/null
+++ b/src/gs-app-row.c
@@ -0,0 +1,1240 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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 *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;
+ 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);
+ GtkStyleContext *context;
+
+ /* disabled */
+ if (!priv->show_buttons) {
+ gs_app_row_update_button_reveal (app_row);
+ gtk_widget_set_visible (priv->button, FALSE);
+ return;
+ }
+
+ /* 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 application 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 application 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 application */
+ 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 application 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) {
+ /* 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");
+ } else {
+ /* TRANSLATORS: this is a button next to the search results that
+ * allows the application 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 application 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 application 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 application 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;
+ 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:
+ 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 */
+ context = gtk_widget_get_style_context (priv->button);
+ if (!priv->colorful) {
+ gtk_style_context_remove_class (context, "destructive-action");
+ } else {
+ switch (gs_app_get_state (priv->app)) {
+ case GS_APP_STATE_UPDATABLE:
+ case GS_APP_STATE_INSTALLED:
+ gtk_style_context_add_class (context, "destructive-action");
+ break;
+ case GS_APP_STATE_UPDATABLE_LIVE:
+ if (priv->show_update)
+ gtk_style_context_remove_class (context, "destructive-action");
+ else
+ gtk_style_context_add_class (context, "destructive-action");
+ break;
+ default:
+ gtk_style_context_remove_class (context, "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:
+ 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
+gs_app_row_actually_refresh (GsAppRow *app_row)
+{
+ GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
+ GtkStyleContext *context;
+ 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:
+ 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) {
+ as_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_REMOVABLE_HARDWARE)) {
+ 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_show (priv->label_warning);
+ }
+
+ /* 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, priv->show_installed);
+ break;
+ default:
+ gtk_widget_set_visible (priv->label_installed, FALSE);
+ break;
+ }
+ } else {
+ gtk_widget_set_visible (priv->label_installed, 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_show (priv->version_current_label);
+ } else {
+ gtk_widget_hide (priv->version_current_label);
+ }
+
+ /* 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_show (priv->version_update_label);
+ } else {
+ gtk_widget_hide (priv->version_update_label);
+ }
+
+ /* have both: show arrow */
+ if (version_current != NULL && version_update != NULL &&
+ g_strcmp0 (version_current, version_update) != 0) {
+ gtk_widget_show (priv->version_arrow_label);
+ } else {
+ gtk_widget_hide (priv->version_arrow_label);
+ }
+
+ /* 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 */
+ if (version_current != NULL || version_update != NULL)
+ gtk_widget_show (priv->version_box);
+ else
+ gtk_widget_hide (priv->version_box);
+
+ gtk_widget_hide (priv->star);
+ } else {
+ gtk_widget_hide (priv->version_box);
+ if (missing_search_result || gs_app_get_rating (priv->app) <= 0 || !priv->show_rating) {
+ gtk_widget_hide (priv->star);
+ } else {
+ gtk_widget_show (priv->star);
+ 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_show (priv->system_updates_label);
+ } else {
+ gtk_widget_hide (priv->system_updates_label);
+ }
+
+ /* 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),
+ "system-component-application");
+ gtk_image_set_from_gicon (GTK_IMAGE (priv->image), icon);
+
+ context = gtk_widget_get_style_context (priv->image);
+ if (missing_search_result)
+ gtk_style_context_add_class (context, "dimmer-label");
+ else
+ gtk_style_context_remove_class (context, "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_spinner_start (GTK_SPINNER (priv->spinner));
+ 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:
+ case GS_APP_STATE_INSTALLING:
+ 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_show (priv->label_app_size);
+ } else {
+ gtk_widget_hide (priv->label_app_size);
+ }
+
+ /* 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 (warning->len > 0) {
+ gtk_label_set_text (GTK_LABEL (priv->label_warning), warning->str);
+ gtk_widget_show (priv->label_warning);
+ }
+ }
+
+ gtk_widget_set_visible (priv->box_tag,
+ gtk_widget_get_visible (priv->label_origin) ||
+ gtk_widget_get_visible (priv->label_installed) ||
+ 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);
+}
+
+static void
+finish_unreveal (GsAppRow *app_row)
+{
+ gtk_widget_hide (GTK_WIDGET (app_row));
+
+ 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_show (revealer);
+
+ 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, 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);
+ 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;
+
+ 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..8d29a2f
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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..8df9c8e
--- /dev/null
+++ b/src/gs-app-row.ui
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsAppRow" parent="GtkListBoxRow">
+ <style>
+ <class name="app"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="orientation">horizontal</property>
+ <style>
+ <class name="header"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="pixel_size">64</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="name_box">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <style>
+ <class name="title"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="wrap">True</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <property name="ellipsize">end</property>
+ <property name="lines">3</property>
+ <property name="wrap-mode">word-char</property>
+ <style>
+ <class name="title"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description_label">
+ <property name="visible" bind-source="GsAppRow" bind-property="show-description" bind-flags="sync-create"/>
+ <property name="valign">start</property>
+ <property name="vexpand">True</property>
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="ellipsize">end</property>
+ <property name="lines">2</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="version_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="version_current_label">
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="version_arrow_label">
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <property name="ellipsize">end</property>
+ <property name="label">→</property>
+ <style>
+ <class name="version-arrow-label"/>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="version_update_label">
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_warning">
+ <property name="visible">False</property>
+ <property name="label">warning-text</property>
+ <property name="halign">start</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="title"/>
+ <class name="warning"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="system_updates_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="hexpand">True</property>
+ <property name="visible" bind-source="system_updates_label" bind-property="visible" bind-flags="sync-create"/>
+ <child>
+ <object class="GtkLabel" id="system_updates_label">
+ <property name="hexpand">True</property>
+ <property name="visible">False</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.5</property>
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="ellipsize">end</property>
+ <property name="lines">2</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_app_size">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="label">150 MB</property>
+ <style>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarWidget" id="star">
+ <property name="visible">False</property>
+ <property name="halign">start</property>
+ <property name="icon-size">12</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_tag">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="box_desc">
+ <property name="orientation">horizontal</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="label_origin">
+ <property name="xalign">0.0</property>
+ <property name="yalign">1.0</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ <class name="dim-label"/>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="label_installed">
+ <property name="visible">False</property>
+ <property name="orientation">horizontal</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="valign">end</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="installed-icon">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="pixel-size">16</property>
+ <property name="icon-name">app-installed-symbolic</property>
+ <style>
+ <class name="success"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="installed-label">
+ <property name="valign">center</property>
+ <property name="label" translatable="yes" context="Single app">Installed</property>
+ <style>
+ <class name="caption"/>
+ <class name="subtitle"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical_box">
+ <property name="orientation">vertical</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="button_box">
+ <property name="orientation">horizontal</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkRevealer" id="button_revealer">
+ <property name="reveal-child">True</property>
+ <child>
+ <object class="GsProgressButton" id="button">
+ <property name="visible">False</property>
+ <property name="halign">end</property>
+ <property name="show-icon" bind-source="GsAppRow" bind-property="is-narrow" bind-flags="sync-create"/>
+ <style>
+ <class name="list-button"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSpinner" id="spinner">
+ <property name="visible">False</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="halign">end</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">False</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="halign">end</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-tile.c b/src/gs-app-tile.c
new file mode 100644
index 0000000..01449a7
--- /dev/null
+++ b/src/gs-app-tile.c
@@ -0,0 +1,176 @@
+/* -*- 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 <mclasen@redhat.com>
+ * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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_BUTTON)
+
+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);
+ }
+
+ 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;
+}
diff --git a/src/gs-app-tile.h b/src/gs-app-tile.h
new file mode 100644
index 0000000..37c77ef
--- /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 <mclasen@redhat.com>
+ * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkButton)
+
+struct _GsAppTileClass
+{
+ GtkButtonClass 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-tile.ui b/src/gs-app-tile.ui
new file mode 100644
index 0000000..8333843
--- /dev/null
+++ b/src/gs-app-tile.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsAppTile" parent="GtkButton">
+ <property name="hexpand">True</property>
+ <!-- This is the minimum (sic!) width of a tile when the GtkFlowBox parent container switches to 3 columns -->
+ <property name="preferred-width">270</property>
+ <style>
+ <class name="card"/>
+ </style>
+ <child>
+ <object class="GtkStack" id="stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">waiting</property>
+ <property name="child">
+ <object class="GtkImage" id="waiting">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="pixel-size">16</property>
+ <property name="icon-name">content-loading-symbolic</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">content</property>
+ <property name="child">
+ <object class="GtkOverlay" id="overlay">
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <child type="overlay">
+ <object class="AdwBin">
+ <property name="visible">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="margin-top">58</property>
+ <property name="margin-start">12</property>
+ <style>
+ <class name="installed-overlay-box"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="installed-label">
+ <property name="label" translatable="yes" context="Single app">Installed</property>
+ <property name="margin-start">16</property>
+ <property name="margin-end">16</property>
+ <property name="margin-top">4</property>
+ <property name="margin-bottom">4</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid">
+ <property name="margin-top">14</property>
+ <property name="margin-bottom">15</property>
+ <property name="margin-start">17</property>
+ <property name="margin-end">17</property>
+ <property name="row-spacing">3</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="width-request">64</property>
+ <property name="height-request">64</property>
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="name">
+ <property name="ellipsize">end</property>
+ <property name="xalign">0.0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ <style>
+ <class name="app-tile-label"/>
+ </style>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary">
+ <property name="ellipsize">end</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.0</property>
+ <property name="lines">2</property>
+ <property name="vexpand">True</property>
+ <property name="single-line-mode">True</property>
+ <style>
+ <class name="app-tile-label"/>
+ </style>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-translation-dialog.c b/src/gs-app-translation-dialog.c
new file mode 100644
index 0000000..81a8a44
--- /dev/null
+++ b/src/gs-app-translation-dialog.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) 2021 Endless OS Foundation LLC
+ *
+ * Author: Philip Withnall <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#include "gs-app.h"
+#include "gs-app-translation-dialog.h"
+#include "gs-common.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 application name */
+ title = g_strdup_printf (_("Help Translate %s"), gs_app_get_name (self->app));
+
+ /* Translators: The placeholder is an application name */
+ description = g_strdup_printf (_("%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."), 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);
+
+ gtk_show_uri (GTK_WINDOW (self), url, GDK_CURRENT_TIME);
+}
+
+static void
+gs_app_translation_dialog_init (GsAppTranslationDialog *self)
+{
+ 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..2c7353e
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..4b5b41f
--- /dev/null
+++ b/src/gs-app-translation-dialog.ui
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsAppTranslationDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes">Translations</property>
+ <property name="default-width">480</property>
+ <property name="default-height">375</property>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">24</property>
+ <property name="margin-end">24</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">True</property>
+ <property name="icon-name">flag-outline-thin-symbolic</property>
+ <property name="pixel-size">24</property>
+ <style>
+ <class name="large"/>
+ <class name="blue"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Help Translate Shortwave</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="description">
+ <property name="justify">center</property>
+ <!-- This is a placeholder: the actual label is set in code -->
+ <property name="label">Shortwave is designed, developed, and translated by an international community of volunteers.\n\nThis means that while it’s not yet available in your language, you can get involved and help translate it yourself.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkButton">
+ <property name="halign">center</property>
+ <property name="margin-top">14</property>
+ <property name="margin-bottom">14</property>
+ <property name="margin-start">14</property>
+ <property name="margin-end">14</property>
+ <signal name="clicked" handler="button_clicked_cb"/>
+ <style>
+ <class name="suggested-action"/>
+ <class name="pill"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <property name="halign">center</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes">_Translation Website</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-version-history-dialog.c b/src/gs-app-version-history-dialog.c
new file mode 100644
index 0000000..e6e04a9
--- /dev/null
+++ b/src/gs-app-version-history-dialog.c
@@ -0,0 +1,93 @@
+/* -*- 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 <mwleeds@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <glib/gi18n.h>
+
+struct _GsAppVersionHistoryDialog
+{
+ GtkDialog parent_instance;
+ GsApp *app;
+ GtkWidget *listbox;
+};
+
+G_DEFINE_TYPE (GsAppVersionHistoryDialog, gs_app_version_history_dialog, GTK_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_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_show (row);
+ 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_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_show (row);
+ }
+}
+
+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 (GtkWindow *parent, GsApp *app)
+{
+ GsAppVersionHistoryDialog *dialog;
+
+ dialog = g_object_new (GS_TYPE_APP_VERSION_HISTORY_DIALOG,
+ "use-header-bar", TRUE,
+ "transient-for", parent,
+ "modal", TRUE,
+ 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..6abed18
--- /dev/null
+++ b/src/gs-app-version-history-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) 2021 Matthew Leeds <mwleeds@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkDialog)
+
+GtkWidget *gs_app_version_history_dialog_new (GtkWindow *parent,
+ 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..f673c78
--- /dev/null
+++ b/src/gs-app-version-history-dialog.ui
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsAppVersionHistoryDialog" parent="GtkDialog">
+ <property name="title" translatable="yes">Version History</property>
+ <property name="default_width">550</property>
+ <property name="default_height">600</property>
+ <property name="width_request">360</property>
+ <property name="height_request">400</property>
+ <property name="use_header_bar">1</property>
+ <child internal-child="headerbar">
+ <object class="AdwHeaderBar"/>
+ </child>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <child>
+ <object class="AdwClamp">
+ <property name="vexpand">True</property>
+ <property name="hexpand">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-top">18</property>
+ <child>
+ <object class="GtkListBox" id="listbox">
+ <property name="selection-mode">none</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-app-version-history-row.c b/src/gs-app-version-history-row.c
new file mode 100644
index 0000000..0c0dd9e
--- /dev/null
+++ b/src/gs-app-version-history-row.c
@@ -0,0 +1,115 @@
+/* -*- 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 <mwleeds@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "gs-app-version-history-row.h"
+
+#include "gs-common.h"
+
+struct _GsAppVersionHistoryRow
+{
+ GtkListBoxRow parent_instance;
+
+ GtkWidget *version_number_label;
+ GtkWidget *version_date_label;
+ GtkWidget *version_description_label;
+};
+
+G_DEFINE_TYPE (GsAppVersionHistoryRow, gs_app_version_history_row, GTK_TYPE_LIST_BOX_ROW)
+
+static void
+gs_app_version_history_row_class_init (GsAppVersionHistoryRowClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ 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_label);
+}
+
+static void
+gs_app_version_history_row_init (GsAppVersionHistoryRow *row)
+{
+ 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);
+ gtk_label_set_markup (GTK_LABEL (row->version_description_label), version_description);
+ gtk_style_context_remove_class (gtk_widget_get_style_context (row->version_description_label), "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");
+ gtk_label_set_label (GTK_LABEL (row->version_description_label), version_description_fallback);
+ gtk_style_context_add_class (gtk_widget_get_style_context (row->version_description_label), "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_string ((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);
+
+ 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);
+}
diff --git a/src/gs-app-version-history-row.h b/src/gs-app-version-history-row.h
new file mode 100644
index 0000000..0e91ac6
--- /dev/null
+++ b/src/gs-app-version-history-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) 2021 Matthew Leeds <mwleeds@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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);
+
+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..e6d08ec
--- /dev/null
+++ b/src/gs-app-version-history-row.ui
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsAppVersionHistoryRow" parent="GtkListBoxRow">
+ <property name="selectable">False</property>
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin_start">15</property>
+ <property name="margin_top">15</property>
+ <property name="margin_bottom">15</property>
+ <property name="margin_end">15</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="version_number_label">
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="version_date_label">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="version_description_label">
+ <property name="margin_top">6</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-application.c b/src/gs-application.c
new file mode 100644
index 0000000..961c400
--- /dev/null
+++ b/src/gs-application.c
@@ -0,0 +1,1525 @@
+/* -*- 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 <mclasen@redhat.com>
+ * Copyright (C) 2013-2018 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-application.h"
+
+#include <stdlib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <gio/gdesktopappinfo.h>
+
+#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’"), NULL },
+ { "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,
+ _("Show verbose debugging information"), 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 update 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
+ };
+
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_show_about_window (app->main_window,
+ "application-name", g_get_application_name (),
+ "application-icon", APPLICATION_ID,
+ "developer-name", _("The GNOME Project"),
+ "version", get_version(),
+ "website", "https://wiki.gnome.org/Apps/Software",
+ "issue-url", "https://gitlab.gnome.org/GNOME/gnome-software/-/issues/new",
+ "developers", developers,
+ "copyright", _("Copyright \xc2\xa9 2016–2022 GNOME Software contributors"),
+ "license-type", GTK_LICENSE_GPL_2_0,
+ "translator-credits", _("translator-credits"),
+ NULL);
+#else
+ GtkAboutDialog *dialog;
+ dialog = GTK_ABOUT_DIALOG (gtk_about_dialog_new ());
+ gtk_about_dialog_set_authors (dialog, developers);
+ gtk_about_dialog_set_copyright (dialog, _("Copyright \xc2\xa9 2016–2022 GNOME Software contributors"));
+ gtk_about_dialog_set_license_type (dialog, GTK_LICENSE_GPL_2_0);
+ gtk_about_dialog_set_logo_icon_name (dialog, APPLICATION_ID);
+ gtk_about_dialog_set_translator_credits (dialog, _("translator-credits"));
+ gtk_about_dialog_set_version (dialog, get_version ());
+ gtk_about_dialog_set_program_name (dialog, g_get_application_name ());
+
+ /* TRANSLATORS: this is the title of the about window */
+ gtk_window_set_title (GTK_WINDOW (dialog), _("About Software"));
+
+ /* TRANSLATORS: well, we seem to think so, anyway */
+ gtk_about_dialog_set_comments (dialog, _("A nice way to manage the "
+ "software on your system."));
+
+ gs_shell_modal_dialog_present (app->shell, GTK_WINDOW (dialog));
+#endif
+}
+
+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_newv (GS_PLUGIN_ACTION_UPDATE_CANCEL, NULL);
+ 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
+shutdown_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer data)
+{
+ GsApplication *app = GS_APPLICATION (data);
+ g_application_quit (G_APPLICATION (app));
+}
+
+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);
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE, NULL);
+ 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 app)
+{
+ GApplicationFlags flags;
+ GList *windows;
+ GtkWidget *window;
+
+ flags = g_application_get_flags (app);
+
+ if (flags & G_APPLICATION_IS_SERVICE) {
+ windows = gtk_application_get_windows (GTK_APPLICATION (app));
+ if (windows) {
+ window = windows->data;
+ gtk_widget_hide (window);
+ }
+
+ return;
+ }
+
+ g_application_quit (G_APPLICATION (app));
+}
+
+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, "moderate") == 0) {
+ gs_shell_set_mode (app->shell, GS_SHELL_MODE_MODERATE);
+ } 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,
+ 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_autoptr (GsApp) a = NULL;
+ 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,
+ 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_newv (GS_PLUGIN_ACTION_LAUNCH,
+ "app", app,
+ NULL);
+ 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_autoptr(GAsyncResult) setup_result = NULL;
+
+ 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-installed");
+ g_application_withdraw_notification (application, "upgrades-available");
+ g_application_withdraw_notification (application, "offline-updates");
+ g_application_withdraw_notification (application, "eol");
+
+ /* 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)
+{
+ GsApplication *self = GS_APPLICATION (app);
+ const gchar *id;
+ const gchar *pkgname;
+ const gchar *local_filename;
+ const gchar *mode;
+ const gchar *search;
+ gint rc = -1;
+ g_autoptr(GError) error = NULL;
+
+ gs_debug_set_verbose (self->debug, g_variant_dict_contains (options, "verbose"));
+
+ /* 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, "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")) {
+ /* 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_contains (options, "verbose")) {
+ g_action_group_activate_action (G_ACTION_GROUP (app),
+ "verbose",
+ NULL);
+ }
+
+ 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..1c04a7b
--- /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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+
+#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..cff8584
--- /dev/null
+++ b/src/gs-basic-auth-dialog.c
@@ -0,0 +1,131 @@
+/* -*- 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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-basic-auth-dialog.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+struct _GsBasicAuthDialog
+{
+ GtkDialog parent_instance;
+
+ GsBasicAuthCallback callback;
+ gpointer callback_data;
+
+ /* template widgets */
+ GtkButton *login_button;
+ GtkLabel *description_label;
+ GtkEntry *user_entry;
+ GtkEntry *password_entry;
+};
+
+G_DEFINE_TYPE (GsBasicAuthDialog, gs_basic_auth_dialog, GTK_TYPE_DIALOG)
+
+static void
+cancel_button_clicked_cb (GsBasicAuthDialog *dialog)
+{
+ /* abort the basic auth request */
+ dialog->callback (NULL, NULL, dialog->callback_data);
+
+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
+}
+
+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));
+
+ /* submit the user/password to basic auth */
+ dialog->callback (user, password, dialog->callback_data);
+
+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
+}
+
+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);
+ gtk_label_set_text (dialog->description_label, description);
+}
+
+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);
+
+ 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, description_label);
+ 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);
+}
+
+GtkWidget *
+gs_basic_auth_dialog_new (GtkWindow *parent,
+ const gchar *remote,
+ const gchar *realm,
+ GsBasicAuthCallback callback,
+ gpointer callback_data)
+{
+ GsBasicAuthDialog *dialog;
+
+ dialog = g_object_new (GS_TYPE_BASIC_AUTH_DIALOG,
+ "use-header-bar", TRUE,
+ "transient-for", parent,
+ "modal", TRUE,
+ 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..9c07778
--- /dev/null
+++ b/src/gs-basic-auth-dialog.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) 2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkDialog)
+
+GtkWidget *gs_basic_auth_dialog_new (GtkWindow *parent,
+ 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..f7c887c
--- /dev/null
+++ b/src/gs-basic-auth-dialog.ui
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GsBasicAuthDialog" parent="GtkDialog">
+ <property name="can_focus">False</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="title" translatable="yes">Login Required</property>
+ <property name="use_header_bar">1</property>
+ <child internal-child="headerbar">
+ <object class="GtkHeaderBar">
+ <property name="can_focus">False</property>
+ <property name="show_close_button">False</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="cancel_button_clicked_cb" object="GsBasicAuthDialog" swapped="yes"/>
+ <style>
+ <class name="text-button"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">_Login</property>
+ <property name="can_focus">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="login_button_clicked_cb" object="GsBasicAuthDialog" swapped="yes"/>
+ <style>
+ <class name="text-button"/>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">6</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">40</property>
+ <child>
+ <object class="GtkLabel" id="description_label">
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="margin_bottom">20</property>
+ <property name="max_width_chars">55</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">2</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="user_label">
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_User</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">user_entry</property>
+ <property name="margin_start">20</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_label">
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password_entry</property>
+ <property name="margin_start">20</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="user_entry">
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="invisible_char_set">True</property>
+ <property name="input_purpose">password</property>
+ <signal name="changed" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
+ <signal name="activate" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="invisible_char_set">True</property>
+ <property name="input_purpose">password</property>
+ <signal name="changed" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
+ <signal name="activate" handler="dialog_validate" object="GsBasicAuthDialog" swapped="yes"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">4</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup">
+ <widgets>
+ <widget name="user_label"/>
+ <widget name="password_label"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup">
+ <widgets>
+ <widget name="user_entry"/>
+ <widget name="password_entry"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="login_button"/>
+ <widget name="cancel_button"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-category-page.c b/src/gs-category-page.c
new file mode 100644
index 0000000..ba57ed2
--- /dev/null
+++ b/src/gs-category-page.c
@@ -0,0 +1,693 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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;
+
+ GtkWidget *top_carousel;
+ 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)
+
+#define MAX_RECENTLY_UPDATED_APPS 18
+
+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_tile_clicked (GsAppTile *tile, gpointer data)
+{
+ GsCategoryPage *self = GS_CATEGORY_PAGE (data);
+ GsApp *app;
+
+ app = gs_app_tile_get_app (tile);
+ 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 gint
+_max_results_sort_cb (GsApp *app1, GsApp *app2, gpointer user_data)
+{
+ gint name_sort = gs_utils_sort_strcmp (gs_app_get_name (app1), gs_app_get_name (app2));
+
+ if (name_sort != 0)
+ return name_sort;
+
+ return gs_app_get_rating (app1) - gs_app_get_rating (app2);
+}
+
+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_can_focus (gtk_widget_get_parent (tile), FALSE);
+ gtk_widget_remove_css_class (tile, "activatable");
+ }
+
+ gtk_widget_show (GTK_WIDGET (flow_box));
+}
+
+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;
+} 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);
+ 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);
+ 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)
+{
+ const guint n_top_carousel_apps = 5;
+ 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;
+
+ /* The top carousel should contain @n_top_carousel_apps, taken from the
+ * set of featured or recently updated 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_recently_updated, is_hi_res;
+
+ is_featured = (data->featured_app_ids != NULL &&
+ g_hash_table_contains (data->featured_app_ids, gs_app_get_id (app)));
+ is_recently_updated = (gs_app_get_release_date (app) > recently_updated_cutoff_secs);
+ is_hi_res = app_has_hi_res_icon (data->page, app);
+
+ if ((is_featured || is_recently_updated) && 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; returning empty", candidates->len);
+ 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
+compare_release_date_cb (gconstpointer aa,
+ gconstpointer bb)
+{
+ GsApp *app_a = gs_app_tile_get_app ((GsAppTile *) aa);
+ GsApp *app_b = gs_app_tile_get_app ((GsAppTile *) bb);
+ guint64 release_date_a = gs_app_get_release_date (app_a);
+ guint64 release_date_b = gs_app_get_release_date (app_b);
+
+ if (release_date_a == release_date_b)
+ return g_utf8_collate (gs_app_get_name (app_a), gs_app_get_name (app_b));
+
+ return release_date_a < release_date_b ? -1 : 1;
+}
+
+static void
+load_category_finish (LoadCategoryData *data)
+{
+ GsCategoryPage *self = data->page;
+ guint64 recently_updated_cutoff_secs;
+ guint64 n_recently_updated = 0;
+ guint64 min_release_date = G_MAXUINT64;
+ GSList *recently_updated = NULL, *link;
+ g_autoptr(GsAppList) top_carousel_apps = NULL;
+
+ if (!data->get_featured_apps_finished ||
+ !data->get_main_apps_finished)
+ 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;
+
+ /* Apps to go in the top carousel */
+ top_carousel_apps = choose_top_carousel_apps (data, recently_updated_cutoff_secs);
+
+ 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_recently_updated;
+ guint64 release_date;
+ GtkWidget *flow_box = self->category_detail_box;
+ GtkWidget *tile;
+
+ /* To be listed in the top carousel? */
+ if (gs_app_list_lookup (top_carousel_apps, gs_app_get_unique_id (app)) != NULL)
+ 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);
+ g_signal_connect (tile, "clicked",
+ G_CALLBACK (app_tile_clicked), self);
+
+ if (is_featured) {
+ flow_box = self->featured_flow_box;
+ } else if (is_recently_updated) {
+ if (n_recently_updated < MAX_RECENTLY_UPDATED_APPS) {
+ recently_updated = g_slist_insert_sorted (recently_updated, tile, compare_release_date_cb);
+ n_recently_updated++;
+ if (min_release_date > release_date)
+ min_release_date = release_date;
+ flow_box = NULL;
+ } else if (release_date >= min_release_date) {
+ recently_updated = g_slist_insert_sorted (recently_updated, tile, compare_release_date_cb);
+ tile = recently_updated->data;
+ recently_updated = g_slist_remove (recently_updated, tile);
+ min_release_date = gs_app_get_release_date (gs_app_tile_get_app (GS_APP_TILE (recently_updated->data)));
+ }
+ } else if (gs_app_get_kind (app) == AS_COMPONENT_KIND_WEB_APP) {
+ flow_box = self->web_apps_flow_box;
+ }
+
+ if (flow_box != NULL) {
+ gtk_flow_box_insert (GTK_FLOW_BOX (flow_box), tile, -1);
+ gtk_widget_set_can_focus (gtk_widget_get_parent (tile), FALSE);
+ }
+ }
+
+ for (link = recently_updated; link != NULL; link = g_slist_next (link)) {
+ GtkWidget *tile = link->data;
+ gtk_flow_box_insert (GTK_FLOW_BOX (self->recently_updated_flow_box), tile, -1);
+ gtk_widget_set_can_focus (gtk_widget_get_parent (tile), FALSE);
+ }
+
+ g_slist_free (recently_updated);
+
+ 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 if they have any children. */
+ gtk_widget_set_visible (self->featured_flow_box, gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->featured_flow_box), 0) != NULL);
+ gtk_widget_set_visible (self->recently_updated_flow_box, gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->recently_updated_flow_box), 0) != NULL);
+ gtk_widget_set_visible (self->web_apps_flow_box, gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->web_apps_flow_box), 0) != NULL);
+ gtk_widget_set_visible (self->category_detail_box, gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->category_detail_box), 0) != NULL);
+
+ load_category_data_free (data);
+}
+
+static void
+gs_category_page_load_category (GsCategoryPage *self)
+{
+ GsCategory *featured_subcat = NULL;
+ GtkAdjustment *adj = 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);
+
+ 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));
+
+ gs_featured_carousel_set_apps (GS_FEATURED_CAROUSEL (self->top_carousel), NULL);
+ gtk_widget_show (self->top_carousel);
+ gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->category_detail_box),
+ MIN (30, gs_category_get_size (self->subcategory)));
+ gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->recently_updated_flow_box), MAX_RECENTLY_UPDATED_APPS);
+
+ if (gs_plugin_loader_get_enabled (self->plugin_loader, "epiphany"))
+ gs_category_page_add_placeholders (self, GTK_FLOW_BOX (self->web_apps_flow_box), 12);
+
+ if (featured_subcat != NULL) {
+ /* 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_show (self->top_carousel);
+ } else {
+ gs_widget_remove_all (self->featured_flow_box, (GsRemoveFunc) gtk_flow_box_remove);
+ gtk_widget_hide (self->featured_flow_box);
+ gtk_widget_hide (self->top_carousel);
+ }
+
+ /* 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,
+ "sort-func", gs_utils_app_sort_name,
+ 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,
+ "sort-func", _max_results_sort_cb,
+ 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);
+
+ /* scroll the list of apps to the beginning, otherwise it will show
+ * with the previous scroll value */
+ adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_category));
+ gtk_adjustment_set_value (adj, gtk_adjustment_get_lower (adj));
+}
+
+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)
+ 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 gint
+recently_updated_sort_cb (GtkFlowBoxChild *child1,
+ GtkFlowBoxChild *child2,
+ gpointer user_data)
+{
+ GsSummaryTile *tile1 = GS_SUMMARY_TILE (gtk_flow_box_child_get_child (child1));
+ GsSummaryTile *tile2 = GS_SUMMARY_TILE (gtk_flow_box_child_get_child (child2));
+ GsApp *app1 = gs_app_tile_get_app (GS_APP_TILE (tile1));
+ GsApp *app2 = gs_app_tile_get_app (GS_APP_TILE (tile2));
+ guint64 release_date1 = 0, release_date2 = 0;
+
+ /* Placeholder tiles have no app. */
+ if (app1 != NULL)
+ release_date1 = gs_app_get_release_date (app1);
+ if (app2 != NULL)
+ release_date2 = gs_app_get_release_date (app2);
+
+ /* Don’t use the normal subtraction trick, as there’s the possibility
+ * for overflow in the conversion from guint64 to gint. */
+ if (release_date1 > release_date2)
+ return -1;
+ else if (release_date2 > release_date1)
+ return 1;
+ else
+ return 0;
+}
+
+static void
+gs_category_page_init (GsCategoryPage *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+ /* Sort the recently updated apps by update date. */
+ gtk_flow_box_set_sort_func (GTK_FLOW_BOX (self->recently_updated_flow_box),
+ recently_updated_sort_cb,
+ NULL,
+ NULL);
+
+ 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, 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);
+}
+
+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..98bf197
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..4fd72a3
--- /dev/null
+++ b/src/gs-category-page.ui
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+
+ <template class="GsCategoryPage" parent="GsPage">
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_category">
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkViewport" id="viewport3">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="AdwClamp">
+ <!-- We use the same sizes as the overview page. -->
+ <property name="maximum-size">1000</property>
+ <property name="tightening-threshold">600</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">9</property>
+ <property name="valign">start</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">0</property><!-- top margin provided by headings -->
+ <property name="margin-bottom">24</property>
+
+ <child>
+ <object class="GsFeaturedCarousel" id="top_carousel">
+ <property name="height-request">318</property>
+ <property name="margin_top">24</property>
+ <signal name="app-clicked" handler="top_carousel_app_clicked_cb"/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="featured_heading">
+ <property name="visible" bind-source="featured_flow_box" bind-property="visible" bind-flags="sync-create|bidirectional" />
+ <property name="xalign">0</property>
+ <property name="margin_top">24</property>
+ <property name="label" translatable="yes" comments="Heading for featured apps on a category page">Editor’s Choice</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="featured_flow_box">
+ <property name="visible">False</property>
+ <property name="column_spacing">14</property>
+ <property name="halign">fill</property>
+ <property name="row_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">start</property>
+ <property name="selection-mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">featured_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="recently_updated_heading">
+ <property name="visible" bind-source="recently_updated_flow_box" bind-property="visible" bind-flags="sync-create|bidirectional" />
+ <property name="xalign">0</property>
+ <property name="margin_top">24</property>
+ <property name="label" translatable="yes" comments="Heading for recently updated apps on a category page">New &amp; Updated</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="recently_updated_flow_box">
+ <property name="visible">False</property>
+ <property name="column_spacing">14</property>
+ <property name="halign">fill</property>
+ <property name="row_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">start</property>
+ <property name="selection-mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">recently_updated_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="web_apps_heading">
+ <property name="visible" bind-source="web_apps_flow_box" bind-property="visible" bind-flags="sync-create|bidirectional" />
+ <property name="xalign">0</property>
+ <property name="margin_top">24</property>
+ <property name="label" translatable="yes" comments="Heading for web apps on a category page">Picks from the Web</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="web_apps_flow_box">
+ <property name="visible">False</property>
+ <property name="column_spacing">14</property>
+ <property name="halign">fill</property>
+ <property name="row_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">start</property>
+ <property name="selection-mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">web_apps_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="other_heading">
+ <property name="visible" bind-source="category_detail_box" bind-property="visible" bind-flags="sync-create|bidirectional" />
+ <property name="xalign">0</property>
+ <property name="margin_top">24</property>
+ <property name="label" translatable="yes" comments="Heading for the rest of the apps on a category page">Other Software</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="category_detail_box">
+ <property name="halign">fill</property>
+ <property name="row_spacing">14</property>
+ <property name="column_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">start</property>
+ <property name="selection-mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">other_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-category-tile.c b/src/gs-category-tile.c
new file mode 100644
index 0000000..34fced1
--- /dev/null
+++ b/src/gs-category-tile.c
@@ -0,0 +1,219 @@
+/* -*- 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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * 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
+{
+ GtkButton parent_instance;
+
+ GsCategory *category; /* (owned) (not nullable) */
+ GtkWidget *label;
+ GtkWidget *image;
+ GtkBox *box;
+};
+
+G_DEFINE_TYPE (GsCategoryTile, gs_category_tile, GTK_TYPE_BUTTON)
+
+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)
+{
+ GtkStyleContext *context;
+ 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. */
+ context = gtk_widget_get_style_context (GTK_WIDGET (tile));
+ if (icon_name != NULL)
+ gtk_style_context_remove_class (context, "category-tile-iconless");
+ else
+ gtk_style_context_add_class (context, "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)
+{
+ GtkStyleContext *context;
+
+ g_return_if_fail (GS_IS_CATEGORY_TILE (tile));
+ g_return_if_fail (GS_IS_CATEGORY (cat));
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (tile));
+
+ /* 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_style_context_remove_class (context, 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_style_context_add_class (context, 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..577587e
--- /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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkButton)
+
+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..6b5b1a7
--- /dev/null
+++ b/src/gs-category-tile.ui
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsCategoryTile" parent="GtkButton">
+ <style>
+ <class name="card"/>
+ <class name="category-tile"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="halign">center</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <!-- Placeholder; the actual icon is set in code -->
+ <property name="icon_name">folder-music-symbolic</property>
+ <property name="icon_size">large</property><!-- GTK_ICON_SIZE_LARGE -->
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="xalign">0</property>
+ <property name="ellipsize">end</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-common.c b/src/gs-common.c
new file mode 100644
index 0000000..7499d74
--- /dev/null
+++ b/src/gs-common.c
@@ -0,0 +1,1261 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2016-2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gio/gdesktopappinfo.h>
+
+#ifndef TESTDATADIR
+#include "gs-application.h"
+#endif
+
+#include "gs-common.h"
+
+#ifdef HAVE_GSETTINGS_DESKTOP_SCHEMAS
+#include <gdesktop-enums.h>
+#endif
+
+#include <langinfo.h>
+
+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 application
+ * has been successfully installed */
+ summary = g_strdup_printf (_("%s is now installed"), gs_app_get_name (app));
+ if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) {
+ /* TRANSLATORS: an application 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 application
+ * has been successfully installed */
+ body = _("Application 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 are now 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 is now installed"), gs_app_get_name (app));
+ if (gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT)) {
+ /* TRANSLATORS: an application 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 application */
+ 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);
+ }
+ 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;
+
+typedef struct
+{
+ gint response_id;
+ GMainLoop *loop;
+} RunInfo;
+
+static void
+shutdown_loop (RunInfo *run_info)
+{
+ if (g_main_loop_is_running (run_info->loop))
+ g_main_loop_quit (run_info->loop);
+}
+
+static void
+unmap_cb (GtkDialog *dialog,
+ RunInfo *run_info)
+{
+ shutdown_loop (run_info);
+}
+
+static void
+response_cb (GtkDialog *dialog,
+ gint response_id,
+ RunInfo *run_info)
+{
+ run_info->response_id = response_id;
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ shutdown_loop (run_info);
+}
+
+static gboolean
+close_requested_cb (GtkDialog *dialog,
+ RunInfo *run_info)
+{
+ shutdown_loop (run_info);
+ return GDK_EVENT_PROPAGATE;
+}
+
+GtkResponseType
+gs_app_notify_unavailable (GsApp *app, GtkWindow *parent)
+{
+ GsAppLicenseHint hint = GS_APP_LICENSE_FREE;
+ GtkWidget *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;
+ g_autoptr(GString) title = NULL;
+
+ RunInfo run_info = {
+ GTK_RESPONSE_NONE,
+ NULL,
+ };
+
+ /* 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;
+
+ title = g_string_new ("");
+ if (already_enabled) {
+ g_string_append_printf (title, "<b>%s</b>",
+ /* TRANSLATORS: window title */
+ _("Install Third-Party Software?"));
+ } else {
+ g_string_append_printf (title, "<b>%s</b>",
+ /* TRANSLATORS: window title */
+ _("Enable Third-Party Software Repository?"));
+ }
+ dialog = gtk_message_dialog_new (parent,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ NULL);
+ gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), title->str);
+
+ 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. Application name, e.g. "Firefox"
+ * 2. Software repository name, e.g. fedora-optional
+ */
+ _("%s is not <a href=\"https://en.wikipedia.org/wiki/Free_and_open-source_software\">"
+ "free and open source software</a>, "
+ "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. Application 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."));
+ }
+ }
+
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s", body->str);
+ /* TRANSLATORS: this is button text to not ask about non-free content again */
+ if (0) gtk_dialog_add_button (GTK_DIALOG (dialog), _("Don’t Warn Again"), GTK_RESPONSE_YES);
+ if (already_enabled) {
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: button text */
+ _("Install"),
+ GTK_RESPONSE_OK);
+ } else {
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: button text */
+ _("Enable and Install"),
+ GTK_RESPONSE_OK);
+ }
+
+
+ /* Run */
+ if (!gtk_widget_get_visible (dialog))
+ gtk_window_present (GTK_WINDOW (dialog));
+
+ g_signal_connect (dialog, "close-request", G_CALLBACK (close_requested_cb), &run_info);
+ g_signal_connect (dialog, "response", G_CALLBACK (response_cb), &run_info);
+ g_signal_connect (dialog, "unmap", G_CALLBACK (unmap_cb), &run_info);
+
+ run_info.loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (run_info.loop);
+ g_clear_pointer (&run_info.loop, g_main_loop_unref);
+
+ if (run_info.response_id == GTK_RESPONSE_YES) {
+ run_info.response_id = GTK_RESPONSE_OK;
+ g_settings_set_boolean (settings, "prompt-for-nonfree", FALSE);
+ }
+ return run_info.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);
+ as_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
+ * @class_name: class name to use, without the leading `.`
+ * @css: (nullable): CSS to set on the widget, or %NULL to clear custom CSS
+ *
+ * Set custom CSS on the given @widget instance. This doesn’t affect any other
+ * instances of the same widget. The @class_name must be a static string to be
+ * used as a name for the @css. It doesn’t need to vary with @widget, but
+ * multiple values of @class_name can be used with the same @widget to control
+ * several independent snippets of custom CSS.
+ *
+ * @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 *class_name, const gchar *css)
+{
+ GtkStyleContext *context;
+ 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));
+ g_return_if_fail (class_name != NULL);
+
+ context = gtk_widget_get_style_context (widget);
+
+ /* remove custom class if NULL */
+ if (css == NULL) {
+ if (*provider != NULL)
+ gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (*provider));
+ g_clear_object (provider);
+ gtk_style_context_remove_class (context, class_name);
+ return;
+ }
+
+ str = g_string_sized_new (1024);
+ g_string_append_printf (str, ".%s {\n", class_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 the custom CSS class */
+ gtk_style_context_add_class (context, class_name);
+
+ /* set up custom provider and store on the widget */
+ gtk_css_provider_load_from_data (*provider, str->str, -1);
+ gtk_style_context_add_provider (context, 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 (GtkMessageDialog *dialog,
+ const gchar *details,
+ gboolean add_prefix)
+{
+ GtkWidget *message_area, *sw, *label;
+ GtkWidget *tv;
+ GtkWidget *child;
+ GtkTextBuffer *buffer;
+ g_autoptr(GString) msg = NULL;
+
+ g_assert (GTK_IS_MESSAGE_DIALOG (dialog));
+ g_assert (details != NULL);
+
+ gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
+
+ 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);
+ }
+
+ message_area = gtk_message_dialog_get_message_area (dialog);
+ g_assert (GTK_IS_BOX (message_area));
+
+ /* Find the secondary label and set its width_chars. */
+ /* Otherwise the label will tend to expand vertically. */
+ child = gtk_widget_get_first_child (message_area);
+ if (child) {
+ GtkWidget *next = gtk_widget_get_next_sibling (child);
+ if (next && GTK_IS_LABEL (next))
+ gtk_label_set_width_chars (GTK_LABEL (next), 40);
+ }
+
+ label = gtk_label_new (_("Details"));
+ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_widget_set_visible (label, TRUE);
+ gtk_box_append (GTK_BOX (message_area), label);
+
+ 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_visible (sw, TRUE);
+
+ 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_style_context_add_class (gtk_widget_get_style_context (tv),
+ "update-failed-details");
+ gtk_text_buffer_set_text (buffer, msg ? msg->str : details, -1);
+ gtk_widget_set_visible (tv, TRUE);
+
+ gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv);
+ gtk_widget_set_vexpand (sw, TRUE);
+ gtk_box_append (GTK_BOX (message_area), 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 (GtkWindow *parent,
+ const gchar *title,
+ const gchar *msg,
+ const gchar *details)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new_with_markup (parent,
+ 0,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_CLOSE,
+ "<big><b>%s</b></big>", title);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", msg);
+ if (details != NULL)
+ insert_details_widget (GTK_MESSAGE_DIALOG (dialog), details, TRUE);
+
+ g_signal_connect_swapped (dialog, "response",
+ G_CALLBACK (gtk_window_destroy),
+ dialog);
+ gtk_widget_show (dialog);
+}
+
+/**
+ * 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 (GtkWindow *parent,
+ const gchar *title,
+ const gchar *msg,
+ const gchar *details,
+ const gchar *accept_label)
+{
+ GtkWidget *dialog;
+ RunInfo run_info;
+
+ g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), FALSE);
+ 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 = gtk_message_dialog_new_with_markup (parent,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ "<big><b>%s</b></big>", title);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", msg);
+ if (details != NULL)
+ insert_details_widget (GTK_MESSAGE_DIALOG (dialog), details, FALSE);
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Cancel"), GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (GTK_DIALOG (dialog), accept_label, GTK_RESPONSE_OK);
+
+ run_info.response_id = GTK_RESPONSE_NONE;
+ run_info.loop = g_main_loop_new (NULL, FALSE);
+
+ /* Run */
+ if (!gtk_widget_get_visible (dialog))
+ gtk_window_present (GTK_WINDOW (dialog));
+
+ g_signal_connect (dialog, "close-request", G_CALLBACK (close_requested_cb), &run_info);
+ g_signal_connect (dialog, "response", G_CALLBACK (response_cb), &run_info);
+ g_signal_connect (dialog, "unmap", G_CALLBACK (unmap_cb), &run_info);
+
+ g_main_loop_run (run_info.loop);
+ g_clear_pointer (&run_info.loop, g_main_loop_unref);
+
+ return run_info.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 application in the list would match a given application,
+ * 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 application name */
+ tmp = g_strdup_printf ("An application “%s” has been 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 application name */
+ tmp = g_strdup_printf ("An application “%s” has been removed", app_name);
+ title = tmp;
+ } else {
+ /* TRANSLATORS: we've just removed some apps */
+ title = ngettext ("An application has been removed",
+ "Applications have been removed",
+ 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_time_to_string:
+ * @unix_time_seconds: Time since the epoch in seconds
+ *
+ * Converts a time to a string such as "5 minutes ago" or "2 weeks ago"
+ *
+ * Returns: (transfer full): the time string, or %NULL if @unix_time_seconds is
+ * not valid
+ */
+gchar *
+gs_utils_time_to_string (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 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);
+}
+
+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 {
+ g_autoptr(GDBusConnection) bus = NULL;
+ 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 ("<span font_size='x-small'>%s</span>", 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 */
+}
diff --git a/src/gs-common.h b/src/gs-common.h
new file mode 100644
index 0000000..f7292e9
--- /dev/null
+++ b/src/gs-common.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) 2013 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gdesktopappinfo.h>
+#include <gtk/gtk.h>
+
+#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,
+ GtkWindow *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 *class_name,
+ const gchar *css);
+const gchar *gs_utils_get_error_value (const GError *error);
+void gs_utils_show_error_dialog (GtkWindow *parent,
+ const gchar *title,
+ const gchar *msg,
+ const gchar *details);
+gboolean gs_utils_ask_user_accepts (GtkWindow *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_string (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);
+
+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..420816f
--- /dev/null
+++ b/src/gs-context-dialog-row.c
@@ -0,0 +1,379 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#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_WARNING:
+ return "yellow";
+ case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT:
+ return "red";
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static void
+gs_context_dialog_row_init (GsContextDialogRow *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (self), FALSE);
+#endif
+}
+
+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: {
+ GtkStyleContext *context;
+ const gchar *css_class;
+
+ self->importance = g_value_get_enum (value);
+ css_class = css_class_for_importance (self->importance);
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (self->lozenge));
+
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_remove_class (context, "red");
+ gtk_style_context_remove_class (context, "grey");
+
+ gtk_style_context_add_class (context, 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..d5d68fd
--- /dev/null
+++ b/src/gs-context-dialog-row.h
@@ -0,0 +1,69 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+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_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_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..47a78df
--- /dev/null
+++ b/src/gs-context-dialog-row.ui
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsContextDialogRow" parent="AdwActionRow">
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+
+ <child type="prefix">
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">True</property>
+ <property name="pixel-size">16</property>
+ <property name="margin-top">8</property>
+ <property name="margin-bottom">8</property>
+ <style>
+ <class name="grey"/>
+ </style>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-css.c b/src/gs-css.c
new file mode 100644
index 0000000..ff81855
--- /dev/null
+++ b/src/gs-css.c
@@ -0,0 +1,308 @@
+/* -*- 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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * SECTION:gs-css
+ * @title: GsCss
+ * @stability: Unstable
+ * @short_description: Parse, validate and rewrite CSS resources
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <appstream.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);
+ as_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);
+ gtk_css_provider_load_from_data (provider, str->str, -1);
+ 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..d2041a9
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+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..7f44ec0
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <gio/gdesktopappinfo.h>
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <packagekit-glib2/packagekit.h>
+
+#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 application");
+ }
+
+ 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..12ea252
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gio/gio.h>
+#include <glib-object.h>
+
+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..72acd06
--- /dev/null
+++ b/src/gs-description-box.c
@@ -0,0 +1,358 @@
+/* -*- 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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib/gi18n.h>
+
+#include "gs-description-box.h"
+
+#define MAX_COLLAPSED_LINES 4
+
+struct _GsDescriptionBox {
+ GtkWidget parent;
+ GtkWidget *box;
+ GtkLabel *label;
+ GtkButton *button;
+ gchar *text;
+ gboolean is_collapsed;
+ gboolean needs_recalc;
+ gint last_width;
+ gint last_height;
+ guint idle_update_id;
+};
+
+G_DEFINE_TYPE (GsDescriptionBox, gs_description_box, GTK_TYPE_WIDGET)
+
+static void
+gs_description_box_update_content (GsDescriptionBox *box)
+{
+ GtkAllocation allocation;
+ PangoLayout *layout;
+ gint n_lines;
+ const gchar *text;
+
+ if (!box->text || !*(box->text)) {
+ gtk_widget_hide (GTK_WIDGET (box));
+ box->needs_recalc = TRUE;
+ return;
+ }
+
+ gtk_widget_get_allocation (GTK_WIDGET (box), &allocation);
+
+ if (!box->needs_recalc && box->last_width == allocation.width && box->last_height == allocation.height)
+ return;
+
+ box->needs_recalc = allocation.width <= 1 || allocation.height <= 1;
+ box->last_width = allocation.width;
+ box->last_height = allocation.height;
+
+ 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);
+
+ gtk_widget_set_visible (GTK_WIDGET (box->button), n_lines > MAX_COLLAPSED_LINES);
+
+ if (box->is_collapsed && n_lines > MAX_COLLAPSED_LINES) {
+ 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] == '/') {
+ 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, "</%s>", 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_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)
+{
+ GtkStyleContext *style_context;
+ GtkWidget *widget;
+
+ box->is_collapsed = TRUE;
+
+ box->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 24);
+ gtk_widget_set_parent (GTK_WIDGET (box->box), GTK_WIDGET (box));
+
+ style_context = gtk_widget_get_style_context (GTK_WIDGET (box));
+ gtk_style_context_add_class (style_context, "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);
+
+ style_context = gtk_widget_get_style_context (widget);
+ gtk_style_context_add_class (style_context, "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);
+
+ style_context = gtk_widget_get_style_context (widget);
+ gtk_style_context_add_class (style_context, "button");
+ gtk_style_context_add_class (style_context, "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->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;
+}
+
+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);
+
+ gtk_widget_queue_resize (GTK_WIDGET (box));
+ }
+}
+
+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 ? 1 : 0) != (box->is_collapsed ? 1 : 0)) {
+ box->is_collapsed = collapsed;
+ box->needs_recalc = TRUE;
+
+ gtk_widget_queue_resize (GTK_WIDGET (box));
+ }
+}
diff --git a/src/gs-description-box.h b/src/gs-description-box.h
new file mode 100644
index 0000000..667b214
--- /dev/null
+++ b/src/gs-description-box.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) 2020 Red Hat <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+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);
+
+G_END_DECLS
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
new file mode 100644
index 0000000..0232925
--- /dev/null
+++ b/src/gs-details-page.c
@@ -0,0 +1,2896 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2019 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <locale.h>
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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"
+
+/* 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_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) */
+ GHashTable *packaging_format_preference; /* gchar * ~> gint */
+ GtkWidget *app_reviews_dialog;
+ GtkCssProvider *origin_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;
+
+ 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;
+ AdwActionRow *project_website_row;
+ AdwActionRow *donate_row;
+ AdwActionRow *translate_row;
+ AdwActionRow *report_an_issue_row;
+ AdwActionRow *help_row;
+ GtkWidget *button_install;
+ GtkWidget *button_update;
+ GtkWidget *button_remove;
+ GsProgressButton *button_cancel;
+ GtkWidget *infobar_details_app_norepo;
+ GtkWidget *infobar_details_app_repo;
+ GtkWidget *infobar_details_package_baseos;
+ GtkWidget *infobar_details_repo;
+ GtkWidget *label_progress_percentage;
+ GtkWidget *label_progress_status;
+ GtkWidget *label_addons_uninstalled_app;
+ GsAppContextBar *context_bar;
+ GtkLabel *developer_name_label;
+ GtkImage *developer_verified_image;
+ GtkWidget *label_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;
+ GtkWidget *box_reviews;
+ GtkWidget *box_reviews_internal;
+ GtkWidget *histogram;
+ GtkWidget *histogram_row;
+ GtkWidget *button_review;
+ GtkWidget *scrolledwindow_details;
+ GtkWidget *spinner_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;
+ GtkInfoBar *translation_infobar;
+ GtkButton *translation_infobar_button;
+ 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) {
+ gtk_window_destroy (GTK_WINDOW (self->app_reviews_dialog));
+ g_clear_object (&self->app_reviews_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;
+
+ /* spinner */
+ switch (state) {
+ case GS_DETAILS_PAGE_STATE_LOADING:
+ gtk_spinner_start (GTK_SPINNER (self->spinner_details));
+ break;
+ case GS_DETAILS_PAGE_STATE_READY:
+ case GS_DETAILS_PAGE_STATE_FAILED:
+ gtk_spinner_stop (GTK_SPINNER (self->spinner_details));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ /* 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
+app_has_pending_action (GsApp *app)
+{
+ /* sanitize the pending state change by verifying we're in one of the
+ * expected states */
+ if (gs_app_get_state (app) != GS_APP_STATE_AVAILABLE &&
+ gs_app_get_state (app) != GS_APP_STATE_UPDATABLE_LIVE &&
+ gs_app_get_state (app) != GS_APP_STATE_UPDATABLE &&
+ gs_app_get_state (app) != GS_APP_STATE_QUEUED_FOR_INSTALL)
+ return FALSE;
+
+ return (gs_app_get_pending_action (app) != GS_PLUGIN_ACTION_UNKNOWN) ||
+ (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL);
+}
+
+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_hide (self->origin_box);
+ 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_show (self->origin_box);
+
+ packaging_icon = gs_app_get_metadata_item (self->app, "GnomeSoftware::PackagingIcon");
+ if (packaging_icon == NULL)
+ packaging_icon = "package-x-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, "packaging-color", 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;
+ }
+
+ /* hide the alternates for now until the query is complete */
+ gtk_widget_hide (self->origin_box);
+
+ /* 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)
+{
+ 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:
+ 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 (app_has_pending_action (self->app)) {
+ 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_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 (app_has_pending_action (self->app)) {
+ GsPluginAction action = gs_app_get_pending_action (self->app);
+ gtk_widget_set_visible (self->label_progress_status, TRUE);
+ switch (action) {
+ case GS_PLUGIN_ACTION_INSTALL:
+ 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…"));
+ break;
+ case GS_PLUGIN_ACTION_UPDATE:
+ case GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD:
+ 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…"));
+ break;
+ default:
+ gtk_widget_set_visible (self->label_progress_status, FALSE);
+ break;
+ }
+ }
+
+ /* percentage bar */
+ switch (state) {
+ case GS_APP_STATE_INSTALLING:
+ case GS_APP_STATE_REMOVING:
+ percentage = gs_app_get_progress (self->app);
+ if (percentage == GS_APP_PROGRESS_UNKNOWN) {
+ 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 (app_has_pending_action (self->app)) {
+ 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_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)
+{
+ 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 {
+ /* 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 = "https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/Software-licensing";
+ }
+
+ gs_shell_show_uri (self->shell, uri);
+}
+
+static void
+gs_details_page_translation_infobar_response_cb (GtkInfoBar *infobar,
+ int response,
+ gpointer user_data)
+{
+ GsDetailsPage *self = GS_DETAILS_PAGE (user_data);
+ GtkWindow *window;
+
+ window = GTK_WINDOW (gs_app_translation_dialog_new (self->app));
+ gs_shell_modal_dialog_present (self->shell, window);
+}
+
+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
+sort_by_packaging_format_preference (GsApp *app1,
+ GsApp *app2,
+ gpointer user_data)
+{
+ GHashTable *preference = user_data;
+ const gchar *packaging_format_raw1 = gs_app_get_packaging_format_raw (app1);
+ const gchar *packaging_format_raw2 = gs_app_get_packaging_format_raw (app2);
+ gint index1, index2;
+
+ if (g_strcmp0 (packaging_format_raw1, packaging_format_raw2) == 0)
+ return 0;
+
+ if (packaging_format_raw1 == NULL || packaging_format_raw2 == NULL)
+ return packaging_format_raw1 == NULL ? -1 : 1;
+
+ index1 = GPOINTER_TO_INT (g_hash_table_lookup (preference, packaging_format_raw1));
+ index2 = GPOINTER_TO_INT (g_hash_table_lookup (preference, packaging_format_raw2));
+
+ if (index1 == index2)
+ return 0;
+
+ /* 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 _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_hide (self->origin_box);
+ 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_hide (self->origin_box);
+ 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) {
+ GtkWidget *row = gs_origin_popover_row_new (self->app_local_file);
+ gtk_widget_show (row);
+ 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 */
+ if (g_hash_table_size (self->packaging_format_preference) > 0)
+ gs_app_list_sort (list, sort_by_packaging_format_preference, self->packaging_format_preference);
+
+ 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_show (row);
+ 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)) {
+ /* 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) {
+ const gchar *packaging_format = gs_app_get_packaging_format_raw (app);
+ gint index = GPOINTER_TO_INT (g_hash_table_lookup (self->packaging_format_preference, packaging_format));
+ 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_hide (self->origin_box);
+
+ 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);
+
+ gs_details_page_refresh_all (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;
+
+ 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 application
+ * can be installed */
+ gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Install"));
+ break;
+ case GS_APP_STATE_INSTALLING:
+ 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"));
+ } 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_AVAILABLE_LOCAL:
+ case GS_APP_STATE_AVAILABLE:
+ case GS_APP_STATE_INSTALLING:
+ case GS_APP_STATE_REMOVING:
+ case GS_APP_STATE_UNAVAILABLE:
+ case GS_APP_STATE_UNKNOWN:
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ case GS_APP_STATE_PENDING_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 (app_has_pending_action (self->app)) {
+ 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);
+ }
+
+ /* 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_style_context_remove_class (gtk_widget_get_style_context (buttons_in_order[i]), "suggested-action");
+ gtk_style_context_remove_class (gtk_widget_get_style_context (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)
+ gtk_style_context_add_class (gtk_widget_get_style_context (buttons_in_order[i]), "destructive-action");
+ else
+ gtk_style_context_add_class (gtk_widget_get_style_context (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);
+
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE);
+
+ if (url != NULL)
+ adw_action_row_set_subtitle (row, url);
+#else
+ if (url != NULL) {
+ g_autofree gchar *escaped_url = g_markup_escape_text (url, -1);
+ adw_action_row_set_subtitle (row, escaped_url);
+ }
+#endif
+
+ gtk_widget_set_visible (GTK_WIDGET (row), url != NULL);
+
+ return (url != NULL);
+}
+
+static void
+gs_details_page_app_tile_clicked (GsAppTile *tile,
+ gpointer user_data)
+{
+ GsDetailsPage *self = GS_DETAILS_PAGE (user_data);
+ GsApp *app;
+
+ app = gs_app_tile_get_app (tile);
+ 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);
+ g_signal_connect (tile, "clicked", G_CALLBACK (gs_details_page_app_tile_clicked), self);
+ 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_autofree gchar *origin = NULL;
+ 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') {
+ gtk_label_set_label (GTK_LABEL (self->application_details_title), tmp);
+ gtk_widget_set_visible (self->application_details_title, TRUE);
+ } else {
+ gtk_widget_set_visible (self->application_details_title, FALSE);
+ }
+ tmp = gs_app_get_summary (self->app);
+ if (tmp != NULL && tmp[0] != '\0') {
+ 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);
+ }
+
+ /* 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. */
+ gtk_widget_set_visible (GTK_WIDGET (self->translation_infobar_button),
+ gs_app_translation_dialog_app_has_url (self->app) &&
+ gs_app_get_license_is_free (self->app));
+ gtk_info_bar_set_revealed (self->translation_infobar,
+ 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, "system-component-application" },
+ };
+
+ 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;
+
+ 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_PROVIDES,
+ 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 (GTK_WIDGET (self->developer_verified_image), gs_app_has_quirk (self->app, GS_APP_QUIRK_DEVELOPER_VERIFIED));
+
+ /* 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);
+ } 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->version_history_button, 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 (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 (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;
+ default:
+ 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;
+ }
+
+ /* only show the "select addons" string if the app isn't yet installed */
+ switch (gs_app_get_state (self->app)) {
+ case GS_APP_STATE_INSTALLED:
+ case GS_APP_STATE_UPDATABLE:
+ case GS_APP_STATE_UPDATABLE_LIVE:
+ gtk_widget_set_visible (self->label_addons_uninstalled_app, FALSE);
+ break;
+ default:
+ gtk_widget_set_visible (self->label_addons_uninstalled_app, TRUE);
+ break;
+ }
+
+ /* update progress */
+ gs_details_page_refresh_progress (self);
+
+ gs_details_page_refresh_addons (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)
+{
+ gboolean selected;
+
+ g_return_if_fail (GS_IS_APP_ADDON_ROW (row));
+
+ /* This would be racy if multithreaded but we're in the main thread */
+ selected = gs_app_addon_row_get_selected (GS_APP_ADDON_ROW (row));
+ gs_app_addon_row_set_selected (GS_APP_ADDON_ROW (row), !selected);
+}
+
+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 (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (list_box), GTK_TYPE_WINDOW)),
+ self->app);
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (dialog));
+}
+
+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) {
+ GtkWindow *parent;
+
+ parent = GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (list_box), GTK_TYPE_WINDOW));
+
+ self->app_reviews_dialog =
+ gs_app_reviews_dialog_new (parent, 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);
+ }
+
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (self->app_reviews_dialog));
+}
+
+static void gs_details_page_addon_selected_cb (GsAppAddonRow *row, GParamSpec *pspec, GsDetailsPage *self);
+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;
+ guint i, rows = 0;
+
+ gs_widget_remove_all (self->list_box_addons, (GsRemoveFunc) gtk_list_box_remove);
+
+ 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);
+
+ g_signal_connect (row, "notify::selected",
+ G_CALLBACK (gs_details_page_addon_selected_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_set_network_available (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->button_review, show_review_button);
+ if (gs_app_get_state (self->app) != GS_APP_STATE_INSTALLED) {
+ gtk_widget_set_visible (self->button_review, FALSE);
+ gtk_widget_set_sensitive (self->button_review, FALSE);
+ gtk_widget_set_sensitive (self->star, FALSE);
+ } else if (gs_plugin_loader_get_network_available (self->plugin_loader)) {
+ gtk_widget_set_sensitive (self->button_review, TRUE);
+ gtk_widget_set_sensitive (self->star, TRUE);
+ gtk_widget_set_tooltip_text (self->button_review, NULL);
+ } else {
+ gtk_widget_set_sensitive (self->button_review, FALSE);
+ gtk_widget_set_sensitive (self->star, FALSE);
+ gtk_widget_set_tooltip_text (self->button_review,
+ /* 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->button_review)));
+ 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)) {
+ 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)
+{
+ /* 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);
+ }
+
+ /* 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) {
+ /* switch away from the details view that failed to load */
+ gs_shell_set_mode (self->shell, GS_SHELL_MODE_OVERVIEW);
+ return;
+ }
+ g_set_object (&self->app_cancellable, gs_app_get_cancellable (app));
+ 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);
+}
+
+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;
+ gboolean is_online = gs_plugin_loader_get_network_available (self->plugin_loader);
+ gboolean has_screenshots;
+
+ /* 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_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);
+ 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,
+ 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)) {
+ g_warning ("failed to refine %s: %s",
+ gs_app_get_id (self->app),
+ error->message);
+ }
+ 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 (_("Unable to find “%s”"), id == NULL ? gs_app_get_source_default (self->app) : id);
+ gtk_label_set_text (GTK_LABEL (self->label_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 (_("Unable to find “%s”"), id == NULL ? gs_app_get_source_default (self->app) : id);
+ gtk_label_set_text (GTK_LABEL (self->label_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);
+ g_clear_object (&self->app);
+ self->origin_by_packaging_format = FALSE;
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", GS_DETAILS_PAGE_REFINE_FLAGS,
+ NULL);
+ 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);
+ g_clear_object (&self->app);
+ self->origin_by_packaging_format = FALSE;
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_URL_TO_APP,
+ "search", url,
+ "refine-flags", GS_DETAILS_PAGE_REFINE_FLAGS |
+ GS_PLUGIN_REFINE_FLAGS_ALLOW_PACKAGES,
+ NULL);
+ 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_PURCHASING)
+ return;
+ gs_details_page_load_stage1 (self);
+ }
+}
+
+static gint
+origin_popover_list_sort_func (GtkListBoxRow *a,
+ GtkListBoxRow *b,
+ gpointer user_data)
+{
+ GsApp *a1 = gs_origin_popover_row_get_app (GS_ORIGIN_POPOVER_ROW (a));
+ GsApp *a2 = gs_origin_popover_row_get_app (GS_ORIGIN_POPOVER_ROW (b));
+ g_autofree gchar *a1_origin = gs_app_dup_origin_ui (a1, TRUE);
+ g_autofree gchar *a2_origin = gs_app_dup_origin_ui (a2, TRUE);
+
+ return gs_utils_sort_strcmp (a1_origin, a2_origin);
+}
+
+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;
+
+ if (self->packaging_format_preference == NULL)
+ return;
+
+ g_hash_table_remove_all (self->packaging_format_preference);
+
+ preference = g_settings_get_strv (self->settings, "packaging-format-preference");
+ if (preference == NULL || preference[0] == NULL)
+ return;
+
+ for (gsize ii = 0; preference[ii] != NULL; ii++) {
+ /* Using 'ii + 1' to easily distinguish between "not found" and "the first" index */
+ g_hash_table_insert (self->packaging_format_preference, g_strdup (preference[ii]), GINT_TO_POINTER (ii + 1));
+ }
+}
+
+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)
+{
+ GtkWidget *child;
+
+ switch (gs_app_get_state (self->app)) {
+ case GS_APP_STATE_PENDING_INSTALL:
+ 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;
+ }
+
+ /* Mark ticked addons to be installed together with the app */
+ for (child = gtk_widget_get_first_child (self->list_box_addons);
+ child != NULL;
+ child = gtk_widget_get_next_sibling (child)) {
+ GsAppAddonRow *row = GS_APP_ADDON_ROW (child);
+ if (gs_app_addon_row_get_selected (row)) {
+ GsApp *addon = gs_app_addon_row_get_addon (row);
+
+ if (gs_app_get_state (addon) == GS_APP_STATE_AVAILABLE)
+ gs_app_set_to_be_installed (addon, TRUE);
+ }
+ }
+
+ 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_selected_cb (GsAppAddonRow *row,
+ GParamSpec *pspec,
+ GsDetailsPage *self)
+{
+ GsApp *addon;
+
+ addon = gs_app_addon_row_get_addon (row);
+
+ /* If the main app is already installed, ticking the addon checkbox
+ * triggers an immediate install. Otherwise we'll install the addon
+ * together with the main app. */
+ switch (gs_app_get_state (self->app)) {
+ case GS_APP_STATE_INSTALLED:
+ case GS_APP_STATE_UPDATABLE:
+ case GS_APP_STATE_UPDATABLE_LIVE:
+ if (gs_app_addon_row_get_selected (row)) {
+ g_set_object (&self->app_cancellable, gs_app_get_cancellable (addon));
+ gs_page_install_app (GS_PAGE (self), addon, GS_SHELL_INTERACTION_FULL,
+ self->app_cancellable);
+ } else {
+ g_set_object (&self->app_cancellable, gs_app_get_cancellable (addon));
+ gs_page_remove_app (GS_PAGE (self), addon, self->app_cancellable);
+ gs_details_page_refresh_all (self);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+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);
+}
+
+static void
+gs_details_page_review_response_cb (GtkDialog *dialog,
+ gint response,
+ GsDetailsPage *self)
+{
+ g_autofree gchar *text = NULL;
+ g_autoptr(GDateTime) now = NULL;
+ g_autoptr(AsReview) review = NULL;
+ GsReviewDialog *rdialog = GS_REVIEW_DIALOG (dialog);
+ g_autoptr(GError) local_error = NULL;
+
+ /* not agreed */
+ if (response != GTK_RESPONSE_OK) {
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ return;
+ }
+
+ 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 */
+ /* FIXME: Make this async */
+ g_assert (self->odrs_provider != NULL);
+
+ gs_odrs_provider_submit_review (self->odrs_provider, self->app, review,
+ self->cancellable, &local_error);
+
+ if (local_error != NULL) {
+ g_warning ("failed to set review on %s: %s",
+ gs_app_get_id (self->app), local_error->message);
+ return;
+ }
+
+ gs_details_page_refresh_reviews (self);
+
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (dialog));
+}
+
+static void
+gs_details_page_write_review (GsDetailsPage *self)
+{
+ GtkWidget *dialog;
+ dialog = gs_review_dialog_new ();
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_details_page_review_response_cb), self);
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (dialog));
+}
+
+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);
+
+ gtk_list_box_set_sort_func (GTK_LIST_BOX (self->origin_popover_list_box),
+ origin_popover_list_sort_func,
+ NULL, NULL);
+ return TRUE;
+}
+
+static guint
+gs_details_page_strcase_hash (gconstpointer key)
+{
+ const gchar *ptr;
+ guint hsh = 0, gg;
+
+ for (ptr = (const gchar *) key; *ptr != '\0'; ptr++) {
+ hsh = (hsh << 4) + g_ascii_toupper (*ptr);
+ if ((gg = hsh & 0xf0000000)) {
+ hsh = hsh ^ (gg >> 24);
+ hsh = hsh ^ gg;
+ }
+ }
+
+ return hsh;
+}
+
+static gboolean
+gs_details_page_strcase_equal (gconstpointer key1,
+ gconstpointer key2)
+{
+ return g_ascii_strcasecmp ((const gchar *) key1, (const gchar *) key2) == 0;
+}
+
+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:
+ g_value_set_string (value, gs_app_get_name (self->app));
+ 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);
+
+ 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_clear_object (&self->app);
+ }
+ if (self->packaging_format_preference) {
+ g_hash_table_unref (self->packaging_format_preference);
+ self->packaging_format_preference = NULL;
+ }
+ g_clear_object (&self->origin_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, 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, 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_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, infobar_details_repo);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, label_addons_uninstalled_app);
+ 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, label_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);
+ 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, button_review);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, scrolledwindow_details);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, spinner_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_infobar);
+ gtk_widget_class_bind_template_child (widget_class, GsDetailsPage, translation_infobar_button);
+ 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_infobar_response_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, origin_popover_row_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_FILL);
+
+ return TRUE;
+}
+
+static void
+gs_details_page_init (GsDetailsPage *self)
+{
+ g_type_ensure (GS_TYPE_SCREENSHOT_CAROUSEL);
+
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+ self->packaging_format_preference = g_hash_table_new_full (gs_details_page_strcase_hash, gs_details_page_strcase_equal, g_free, NULL);
+ 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);
+}
+
+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) {
+ gtk_label_set_text (GTK_LABEL (self->label_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)
+{
+ const gchar *const *locales;
+ g_autofree gchar *xml = NULL;
+ 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 ();
+ locales = g_get_language_names ();
+
+ /* add current locales */
+ for (guint i = 0; locales[i] != NULL; i++) {
+ xb_builder_add_locale (builder, locales[i]);
+ }
+
+ 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 'application') 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, &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, &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;
+
+ /* Currently a 160px icon is needed for #GsFeatureTile, at most.
+ * The '2' is to pretend the hiDPI/GDK's scale factor is 2, to
+ * allow larger icons. The 'icons' plugin uses proper scale factor.
+ */
+ maximum_icon_size = 160 * 2;
+
+ soup_session = gs_build_soup_session ();
+ gs_app_ensure_icons_downloaded (app, soup_session, maximum_icon_size, 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);
+ g_clear_object (&self->app);
+ 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..7a8b531
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..d3fad10
--- /dev/null
+++ b/src/gs-details-page.ui
@@ -0,0 +1,1105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsDetailsPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Details page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack_details">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkBox" id="details_spinner_box">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <child>
+ <object class="GtkSpinner" id="spinner_details">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="loading_label">
+ <property name="justify">center</property>
+ <property name="label" translatable="yes">Loading application details…</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="scale" value="1.4"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">ready</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="scrolledwindow_details">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="scroll-to-focus">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkInfoBar" id="translation_infobar">
+ <property name="revealed">False</property>
+ <property name="show-close-button">False</property>
+ <signal name="response" handler="gs_details_page_translation_infobar_response_cb"/>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">horizontal</property>
+ <property name="hexpand">True</property>
+ <child type="center">
+ <object class="GtkLabel" id="translation_infobar_label">
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">This software is not available in your language and will appear in US English.</property>
+ <property name="wrap">True</property>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkButton" id="translation_infobar_button">
+ <property name="label" translatable="yes">Help _Translate</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="GTK_RESPONSE_OK">translation_infobar_button</action-widget>
+ </action-widgets>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkBox" id="box_details">
+ <property name="orientation">vertical</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <property name="spacing">18</property>
+ <property name="hexpand">False</property>
+ <style>
+ <class name="details-page"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox" id="box_details_header">
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkImage" id="application_details_icon">
+ <property name="halign">start</property>
+ <property name="pixel_size">128</property>
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_details_header_not_icon">
+ <property name="orientation">horizontal</property>
+ <property name="margin-top">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box_details_header2">
+ <property name="orientation">vertical</property>
+ <property name="halign">fill</property>
+ <property name="valign">center</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="application_details_title">
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">20</property>
+ <style>
+ <class name="app-title"/>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible" bind-source="developer_name_label" bind-property="visible" bind-flags="sync-create"/>
+ <property name="hexpand">True</property>
+ <property name="spacing">3</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel" id="developer_name_label">
+ <property name="ellipsize">end</property>
+ <!-- This is a placeholder; the real value is set in code -->
+ <property name="label">Yorba</property>
+ <property name="wrap">False</property>
+ <property name="selectable">True</property>
+ <property name="max-width-chars">100</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="hexpand">False</property>
+ <style>
+ <class name="app-developer"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="developer_verified_image">
+ <property name="pixel-size">16</property>
+ <property name="icon-name">emblem-ok-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="star_box">
+ <property name="valign">start</property>
+ <child>
+ <object class="GsStarWidget" id="star">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="icon-size">16</property>
+ <child>
+ <object class="GtkGestureClick">
+ <!-- GDK_BUTTON_PRIMARY -->
+ <property name="button">1</property>
+ <signal name="pressed" handler="gs_details_page_star_pressed_cb" object="GsDetailsPage" swapped="no" />
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_review_count">
+ <property name="margin_start">5</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkBox" id="box_with_source">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <property name="margin-top">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box_install_remove">
+ <property name="orientation">horizontal</property>
+ <property name="halign">center</property>
+ <property name="spacing">9</property>
+ <child>
+ <object class="GtkButton" id="button_install">
+ <property name="visible">False</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Install</property>
+ <property name="width_request">105</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_details_page_app_install_button_cb"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_details_launch">
+ <property name="can_focus">True</property>
+ <!-- TRANSLATORS: A label for a button to execute the selected application. -->
+ <property name="label" translatable="yes">_Open</property>
+ <property name="use_underline">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_details_page_app_launch_button_cb"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_update">
+ <property name="visible">False</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Update</property>
+ <property name="width_request">105</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_details_page_app_update_button_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="visible">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_details_page_app_remove_button_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">user-trash-symbolic</property>
+ </object>
+ </child>
+ <accessibility>
+ <!-- TRANSLATORS: button text in the header when an application can be erased -->
+ <property name="label" translatable="yes">Uninstall</property>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="visible" bind-source="button_cancel" bind-property="visible" bind-flags="sync-create"/>
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child type="center">
+ <object class="GsProgressButton" id="button_cancel">
+ <property name="visible">False</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">3</property>
+ <signal name="clicked" handler="gs_details_page_app_cancel_button_cb"/>
+ <style>
+ <class name="list-button"/>
+ </style>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkBox">
+ <property name="visible" bind-source="label_progress_status" bind-property="visible" bind-flags="sync-create"/>
+ <property name="spacing">3</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ <class name="install-progress-label"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="label_progress_status">
+ <property name="valign">start</property>
+ <property name="label" translatable="yes">Downloading</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_progress_percentage">
+ <property name="valign">start</property>
+ <property name="label">50%</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkBox" id="origin_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="visible" bind-source="button_cancel" bind-property="visible" bind-flags="sync-create|invert-boolean"/>
+ <child>
+ <object class="GtkMenuButton" id="origin_button">
+ <property name="can_focus">True</property>
+ <property name="sensitive">True</property>
+ <property name="always-show-arrow">True</property>
+ <property name="popover">origin_popover</property>
+ <style>
+ <class name="flat"/>
+ <class name="origin-button"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="origin_menu_btn_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkImage" id="origin_packaging_image">
+ <property name="pixel_size">16</property>
+ <property name="icon_name">package-x-generic-symbolic</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="origin_packaging_label">
+ <property name="valign">center</property>
+ <property name="max-width-chars">12</property>
+ <property name="ellipsize">end</property>
+ <attributes>
+ <attribute name="weight" value="normal"/>
+ <attribute name="scale" value="0.85"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GsScreenshotCarousel" id="screenshot_carousel">
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox" id="application_details">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="application_details_summary">
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">60</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GsDescriptionBox" id="box_details_description">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="valign">start</property>
+ <property name="visible">FALSE</property>
+ <property name="margin_bottom">14</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox" id="box_addons">
+ <property name="orientation">vertical</property>
+
+ <child>
+ <object class="GtkBox" id="box_addons_title">
+ <property name="orientation">vertical</property>
+ <property name="margin_bottom">12</property>
+ <child>
+ <object class="GtkLabel" id="label_addons_title">
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Add-ons</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_addons_uninstalled_app">
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">40</property>
+ <property name="label" translatable="yes">Selected add-ons will be installed with the application.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="list_box_addons">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GsAppContextBar" id="context_bar">
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkListBox" id="list_box_version_history">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <child>
+ <object class="GsAppVersionHistoryRow" id="row_latest_version">
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="version_history_button">
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="halign">center</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes">Version History</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-next-symbolic</property>
+ <property name="margin_start">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="label_webapp_warning" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkLabel" id="label_webapp_warning">
+ <property name="visible">False</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="valign">start</property>
+ <property name="xalign">0.0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">This application can only be used when there is an active internet connection.</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="infobar_details_app_repo" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GsInfoBar" id="infobar_details_app_repo">
+ <property name="margin_top">20</property>
+ <property name="title" translatable="yes">Software Repository Included</property>
+ <property name="body" translatable="yes">This application includes a software repository which provides updates, as well as access to other software.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="infobar_details_app_norepo" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GsInfoBar" id="infobar_details_app_norepo">
+ <property name="margin_top">20</property>
+ <property name="title" translatable="yes">No Software Repository Included</property>
+ <property name="body" translatable="yes">This application does not include a software repository. It will not be updated with new versions.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="infobar_details_package_baseos" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GsInfoBar" id="infobar_details_package_baseos">
+ <property name="message_type">warning</property>
+ <property name="margin_top">20</property>
+ <property name="title" translatable="yes">This software is already provided by your distribution and should not be replaced.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="infobar_details_repo" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GsInfoBar" id="infobar_details_repo">
+ <property name="margin_top">20</property>
+ <property name="title" translatable="yes" comments="Translators: a repository file used for installing software has been discovered.">Software Repository Identified</property>
+ <property name="body" translatable="yes">Adding this software repository will give you access to additional software and upgrades.</property>
+ <property name="warning" translatable="yes">Only use software repositories that you trust.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox" id="box_license">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <property name="homogeneous" bind-source="GsDetailsPage" bind-property="is-narrow" bind-flags="sync-create|invert-boolean"/>
+
+ <child>
+ <object class="GsLicenseTile" id="license_tile">
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <signal name="get-involved-activated" handler="gs_details_page_license_tile_get_involved_activated_cb"/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStack" id="links_stack">
+ <property name="hhomogeneous">False</property>
+ <property name="vhomogeneous">False</property>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">empty</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="hexpand-set">True</property>
+ <style>
+ <class name="card"/>
+ </style>
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <property name="margin-top">14</property>
+ <property name="margin-bottom">14</property>
+ <property name="margin-start">14</property>
+ <property name="margin-end">14</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">dialog-question-symbolic</property>
+ <property name="pixel-size">96</property>
+ <property name="margin-bottom">8</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">No Metadata</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="justify">center</property>
+ <property name="label" translatable="yes">This software doesn’t provide any links to a website, code repository or issue tracker.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">links</property>
+ <property name="child">
+ <object class="GtkListBox">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+
+ <child>
+ <object class="AdwActionRow" id="project_website_row">
+ <property name="activatable">True</property>
+ <property name="icon-name">webpage-symbolic</property>
+ <property name="title" translatable="yes">Project _Website</property>
+ <!-- This is a placeholder; the actual URI is set in code -->
+ <property name="subtitle">gnome.org</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="gs_details_page_link_row_activated_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwActionRow" id="donate_row">
+ <property name="activatable">True</property>
+ <property name="icon-name">money-symbolic</property>
+ <property name="title" translatable="yes">_Donate</property>
+ <!-- This is a placeholder; the actual URI is set in code -->
+ <property name="subtitle">gnome.org</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="gs_details_page_link_row_activated_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwActionRow" id="translate_row">
+ <property name="activatable">True</property>
+ <property name="icon-name">flag-outline-thin-symbolic</property>
+ <property name="title" translatable="yes">Contribute _Translations</property>
+ <!-- This is a placeholder; the actual URI is set in code -->
+ <property name="subtitle">gnome.org</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="gs_details_page_link_row_activated_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwActionRow" id="report_an_issue_row">
+ <property name="activatable">True</property>
+ <property name="icon-name">computer-fail-symbolic</property>
+ <property name="title" translatable="yes">_Report an Issue</property>
+ <!-- This is a placeholder; the actual URI is set in code -->
+ <property name="subtitle">gnome.org</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="gs_details_page_link_row_activated_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwActionRow" id="help_row">
+ <property name="activatable">True</property>
+ <property name="icon-name">help-link-symbolic</property>
+ <property name="title" translatable="yes">_Help</property>
+ <!-- This is a placeholder; the actual URI is set in code -->
+ <property name="subtitle">gnome.org</property>
+ <property name="use-underline">True</property>
+ <signal name="activated" handler="gs_details_page_link_row_activated_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="box_reviews" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox" id="box_reviews">
+ <property name="visible">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Translators: Header of the section with other users&apos; opinions about the app.">Reviews</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_reviews_internal">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <property name="homogeneous" bind-source="GsDetailsPage" bind-property="is-narrow" bind-flags="sync-create|invert-boolean"/>
+ <child>
+ <object class="GtkListBox" id="list_box_reviews_summary">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <child>
+ <object class="GtkListBoxRow" id="histogram_row">
+ <property name="activatable">False</property>
+ <property name="visible">False</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="halign">start</property>
+ <property name="maximum-size">500</property>
+ <property name="tightening-threshold">500</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GsReviewHistogram" id="histogram">
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="button_review">
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="halign">center</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes" comments="Translators: Button opening a dialog where the users can write and publish their opinions about the apps.">_Write Review</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-next-symbolic</property>
+ <property name="margin_start">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="list_box_featured_review">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <child>
+ <object class="GtkListBoxRow" id="button_all_reviews">
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="halign">center</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes" comments="Translators: Button opening a dialog showing all reviews for an app.">All Reviews</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-next-symbolic</property>
+ <property name="margin_start">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwClamp">
+ <property name="visible" bind-source="box_developer_apps" bind-property="visible" bind-flags="sync-create"/>
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkBox">
+ <property name="halign">center</property>
+ <property name="hexpand">False</property>
+ <property name="orientation">vertical</property>
+ <property name="valign">start</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="developer_apps_heading">
+ <property name="xalign">0</property>
+ <!-- the label is set in the code -->
+ <property name="label">Other Apps by ...</property>
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="box_developer_apps">
+ <property name="homogeneous">True</property>
+ <property name="column-spacing">14</property>
+ <property name="row-spacing">14</property>
+ <property name="valign">start</property>
+ <accessibility>
+ <relation name="labelled-by">developer_apps_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">failed</property>
+ <property name="child">
+ <object class="GtkBox" id="box_failed">
+ <property name="orientation">vertical</property>
+ <property name="spacing">24</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="image_failed">
+ <property name="pixel_size">128</property>
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_failed">
+ <property name="wrap">True</property>
+ <property name="max-width-chars">60</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="scale" value="1.4"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup" id="sizegroup_install_remove">
+ <widgets>
+ <widget name="button_install"/>
+ <widget name="button_cancel"/>
+ <widget name="button_update"/>
+ <widget name="button_details_launch"/>
+ <widget name="origin_button"/>
+ </widgets>
+ </object>
+
+ <object class="GtkPopover" id="origin_popover">
+ <property name="visible">False</property>
+ <style>
+ <class name="menu"/>
+ </style>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="propagate-natural-height">true</property>
+ <property name="propagate-natural-width">true</property>
+ <property name="max-content-height">600</property>
+ <property name="visible">true</property>
+ <child>
+ <object class="GtkListBox" id="origin_popover_list_box">
+ <property name="selection-mode">none</property>
+ <property name="visible">true</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="origin_popover_row_activated_cb"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="box_details_header"/>
+ <widget name="application_details"/>
+ <widget name="box_addons"/>
+ <widget name="context_bar"/>
+ <widget name="list_box_version_history"/>
+ <widget name="label_webapp_warning"/>
+ <widget name="infobar_details_app_repo"/>
+ <widget name="infobar_details_app_norepo"/>
+ <widget name="infobar_details_package_baseos"/>
+ <widget name="infobar_details_repo"/>
+ <widget name="box_license"/>
+ <widget name="box_reviews"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-extras-page.c b/src/gs-extras-page.c
new file mode 100644
index 0000000..89f1a69
--- /dev/null
+++ b/src/gs-extras-page.c
@@ -0,0 +1,1361 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <glib/gi18n.h>
+
+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;
+
+ GtkWidget *label_failed;
+ GtkWidget *label_no_results;
+ GtkWidget *list_box_results;
+ GtkWidget *scrolledwindow;
+ GtkWidget *spinner;
+ GtkWidget *stack;
+};
+
+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: Application 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: Application 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)
+{
+ g_autofree gchar *title = NULL;
+
+ if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_EXTRAS)
+ return;
+
+ /* main spinner */
+ switch (self->state) {
+ case GS_EXTRAS_PAGE_STATE_LOADING:
+ gtk_spinner_start (GTK_SPINNER (self->spinner));
+ break;
+ case GS_EXTRAS_PAGE_STATE_READY:
+ case GS_EXTRAS_PAGE_STATE_NO_RESULTS:
+ case GS_EXTRAS_PAGE_STATE_FAILED:
+ gtk_spinner_stop (GTK_SPINNER (self->spinner));
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ /* 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 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_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_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_add_app (GsExtrasPage *self, GsApp *app, GsAppList *list, SearchData *search_data)
+{
+ GtkWidget *app_row, *child;
+
+ /* 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) {
+ gtk_list_box_remove (GTK_LIST_BOX (self->list_box_results), child);
+ break;
+ }
+ }
+
+ 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);
+
+ 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_show (app_row);
+}
+
+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 ("<a href=\"%s\">%s</a>", 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 application or
+ * addon, but it can't be listed for some reason */
+ g_string_append_printf (summary_missing, _("No applications 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 applications "
+ "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 application or
+ * addon, but it can't be listed for some reason */
+ g_string_append_printf (summary_missing, _("No applications 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 applications "
+ "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 application 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 applications "
+ "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 application or
+ * addon, but it can't be listed for some reason */
+ g_string_append_printf (summary_missing, _("No applications 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 application 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 application 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 application 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 application 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 application 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 ("<a href=\"%s\">%s</a>",
+ 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 application 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);
+ gtk_label_set_label (GTK_LABEL (self->label_no_results), 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);
+ gtk_label_set_label (GTK_LABEL (self->label_failed), 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);
+ gtk_label_set_label (GTK_LABEL (self->label_failed), 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);
+ gtk_label_set_label (GTK_LABEL (self->label_failed), 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)
+{
+ guint i;
+
+ /* cancel any pending searches */
+ g_cancellable_cancel (self->search_cancellable);
+ g_clear_object (&self->search_cancellable);
+ self->search_cancellable = g_cancellable_new ();
+
+ 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 */
+ gs_widget_remove_all (self->list_box_results, (GsRemoveFunc) gtk_list_box_remove);
+
+ /* 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,
+ 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_newv (GS_PLUGIN_ACTION_FILE_TO_APP,
+ "file", file,
+ "refine-flags", refine_flags,
+ NULL);
+ 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,
+ 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;
+ guint n_fields;
+ 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);
+ n_fields = g_strv_length (fields);
+ mfg = mdl = NULL;
+ for (j = 0; j < n_fields && (!mfg || !mdl); j++) {
+ if (g_str_has_prefix (fields[j], "MFG:"))
+ mfg = g_strdup (fields[j] + 4);
+ else if (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 applications 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);
+
+ 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);
+ 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, label_failed);
+ gtk_widget_class_bind_template_child (widget_class, GsExtrasPage, label_no_results);
+ 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, spinner);
+ 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..25b0688
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..c294352
--- /dev/null
+++ b/src/gs-extras-page.ui
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsExtrasPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Codecs page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkBox" id="box_spinner">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <child>
+ <object class="GtkSpinner" id="spinner">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">results</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <child>
+ <object class="GtkBox" id="box_results">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkListBox" id="list_box_results">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator_results">
+ <property name="orientation">horizontal</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">no-results</property>
+ <property name="child">
+ <object class="GtkBox" id="box_no_results">
+ <property name="orientation">vertical</property>
+ <property name="spacing">24</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkImage" id="image_no_results">
+ <property name="pixel_size">64</property>
+ <property name="icon_name">face-sad-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_no_results">
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">60</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">failed</property>
+ <property name="child">
+ <object class="GtkBox" id="box_failed">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="image_failed">
+ <property name="pixel_size">128</property>
+ <property name="icon_name">action-unavailable-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_failed">
+ <property name="wrap">True</property>
+ <property name="max-width-chars">60</property>
+ <attributes>
+ <attribute name="scale" value="1.4"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-feature-tile.c b/src/gs-feature-tile.c
new file mode 100644
index 0000000..bb8bed4
--- /dev/null
+++ b/src/gs-feature-tile.c
@@ -0,0 +1,621 @@
+/* -*- 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 <mclasen@redhat.com>
+ * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#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 };
+
+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
+{
+ GsAppTile 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;
+ guint refresh_id;
+};
+
+static void gs_feature_tile_refresh (GsAppTile *self);
+
+static gboolean
+gs_feature_tile_refresh_idle_cb (gpointer user_data)
+{
+ GsFeatureTile *tile = user_data;
+
+ tile->refresh_id = 0;
+
+ gs_feature_tile_refresh (GS_APP_TILE (tile));
+
+ return G_SOURCE_REMOVE;
+}
+
+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->refresh_id) {
+ self->narrow_mode = narrow_mode;
+ self->refresh_id = g_idle_add (gs_feature_tile_refresh_idle_cb, 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, GS_TYPE_APP_TILE)
+
+static void
+gs_feature_tile_dispose (GObject *object)
+{
+ GsFeatureTile *tile = GS_FEATURE_TILE (object);
+
+ if (tile->refresh_id) {
+ g_source_remove (tile->refresh_id);
+ tile->refresh_id = 0;
+ }
+
+ 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);
+}
+
+/* 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 (GsAppTile *self)
+{
+ GsFeatureTile *tile = GS_FEATURE_TILE (self);
+ GsApp *app = gs_app_tile_get_app (self);
+ const gchar *markup = NULL;
+ g_autofree gchar *name = NULL;
+ GtkStyleContext *context;
+ 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. */
+ context = gtk_widget_get_style_context (GTK_WIDGET (self));
+ if (tile->narrow_mode)
+ gtk_style_context_add_class (context, "narrow");
+ else
+ gtk_style_context_remove_class (context, "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_show (tile->image);
+ } else {
+ gtk_widget_hide (tile->image);
+ }
+
+ /* 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 (self)) == 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, "feature-tile",
+ gs_css_get_markup_for_id (css, "tile"));
+ gs_utils_widget_set_css (tile->title, &tile->title_provider, "feature-tile-name",
+ gs_css_get_markup_for_id (css, "name"));
+ gs_utils_widget_set_css (tile->subtitle, &tile->subtitle_provider, "feature-tile-subtitle",
+ gs_css_get_markup_for_id (css, "summary"));
+ tile->markup_cache = markup;
+ } else if (markup == NULL) {
+ 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;
+ gboolean fg_rgba_valid;
+ 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.
+ */
+ fg_rgba_valid = gtk_style_context_lookup_color (context, "theme_fg_color", &fg_rgba);
+ g_assert (fg_rgba_valid);
+
+ 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, "feature-tile", css);
+ gs_utils_widget_set_css (tile->title, &tile->title_provider, "feature-tile-name", NULL);
+ gs_utils_widget_set_css (tile->subtitle, &tile->subtitle_provider, "feature-tile-subtitle", 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:
+ 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 (GS_APP_TILE (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 (GS_APP_TILE (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);
+ GsAppTileClass *app_tile_class = GS_APP_TILE_CLASS (klass);
+
+ object_class->dispose = gs_feature_tile_dispose;
+
+ widget_class->css_changed = gs_feature_tile_css_changed;
+ widget_class->direction_changed = gs_feature_tile_direction_changed;
+
+ app_tile_class->refresh = gs_feature_tile_refresh;
+
+ 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);
+}
diff --git a/src/gs-feature-tile.h b/src/gs-feature-tile.h
new file mode 100644
index 0000000..e9b65ea
--- /dev/null
+++ b/src/gs-feature-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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include "gs-app-tile.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, GsAppTile)
+
+GtkWidget *gs_feature_tile_new (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..c9bb956
--- /dev/null
+++ b/src/gs-feature-tile.ui
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsFeatureTile" parent="GsAppTile">
+ <property name="halign">fill</property>
+ <style>
+ <class name="featured-tile"/>
+ </style>
+ <child>
+ <object class="GtkStack" id="stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">waiting</property>
+ <property name="child">
+ <object class="GtkImage" id="waiting">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="pixel-size">16</property>
+ <property name="icon-name">content-loading-symbolic</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">content</property>
+ <property name="child">
+ <object class="GtkBox" id="box">
+ <property name="halign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">50</property>
+ <property name="margin-bottom">50</property>
+ <property name="margin-start">50</property>
+ <property name="margin-end">50</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="xalign">0.5</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">350</property>
+ <property name="tightening-threshold">350</property>
+ <child>
+ <object class="GtkLabel" id="subtitle">
+ <property name="ellipsize">end</property>
+ <property name="xalign">0.5</property>
+ <property name="valign">start</property>
+ <property name="lines">1</property>
+ <property name="justify">center</property>
+ <style>
+ <class name="caption"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-featured-carousel.c b/src/gs-featured-carousel.c
new file mode 100644
index 0000000..4ce5687
--- /dev/null
+++ b/src/gs-featured-carousel.c
@@ -0,0 +1,402 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#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;
+
+ 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
+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
+app_tile_clicked_cb (GsAppTile *app_tile,
+ gpointer user_data)
+{
+ GsFeaturedCarousel *self = GS_FEATURED_CAROUSEL (user_data);
+ GsApp *app;
+
+ app = gs_app_tile_get_app (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 application 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 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;
+
+ /**
+ * 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 (app_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);
+
+ if (self->apps != NULL && gs_app_list_length (self->apps) > 0)
+ 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..9b24f26
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..3348686
--- /dev/null
+++ b/src/gs-featured-carousel.ui
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsFeaturedCarousel" parent="GtkBox">
+ <property name="halign">fill</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkEventControllerKey">
+ <signal name="key-pressed" handler="key_pressed_cb"/>
+ </object>
+ </child>
+ <style>
+ <class name="featured-carousel"/>
+ </style>
+ <child>
+ <object class="GtkOverlay" id="overlay">
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <child>
+ <object class="AdwCarousel" id="carousel">
+ <signal name="notify::position" handler="carousel_notify_position_cb" swapped="yes"/>
+ <style>
+ <class name="card"/>
+ </style>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkButton" id="previous_button">
+ <property name="use-underline">True</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="width-request">64</property>
+ <property name="height-request">64</property>
+ <property name="margin-top">9</property>
+ <property name="margin-bottom">9</property>
+ <property name="margin-start">9</property>
+ <property name="margin-end">9</property>
+ <property name="icon-name">go-previous-symbolic</property>
+ <signal name="clicked" handler="previous_button_clicked_cb"/>
+ <accessibility>
+ <property name="label" translatable="yes">Previous</property>
+ </accessibility>
+ <style>
+ <class name="circular"/>
+ <class name="flat"/>
+ <class name="image-button"/>
+ </style>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkButton" id="next_button">
+ <property name="use-underline">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="width-request">64</property>
+ <property name="height-request">64</property>
+ <property name="margin-top">9</property>
+ <property name="margin-bottom">9</property>
+ <property name="margin-start">9</property>
+ <property name="margin-end">9</property>
+ <property name="icon_name">go-next-symbolic</property>
+ <signal name="clicked" handler="next_button_clicked_cb"/>
+ <accessibility>
+ <property name="label" translatable="yes">Next</property>
+ </accessibility>
+ <style>
+ <class name="circular"/>
+ <class name="flat"/>
+ <class name="image-button"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwCarouselIndicatorDots" id="dots">
+ <property name="carousel">carousel</property>
+ </object>
+ </child>
+ <accessibility>
+ <property name="label" translatable="yes">Featured Apps List</property>
+ </accessibility>
+ </template>
+</interface>
diff --git a/src/gs-hardware-support-context-dialog.c b/src/gs-hardware-support-context-dialog.c
new file mode 100644
index 0000000..589ea78
--- /dev/null
+++ b/src/gs-hardware-support-context-dialog.c
@@ -0,0 +1,920 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 `<requires>`,
+ * `<recommends>` and `<supports>` elements in the app’s appdata.
+ *
+ * Currently, `<supports>` is treated as a synonym of `<recommends>` as it’s
+ * only just been introduced into the appstream standard, and many apps which
+ * should be using `<supports>` are still using `<recommends>`.
+ *
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#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 `<requires><control>keyboard</control></requires>`,
+ * `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, &current_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/application 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;
+
+ /* 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 },
+ };
+
+ 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);
+ 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;
+ 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;
+ GtkStyleContext *context;
+ 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, &current_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,
+ &current_match, &current_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,
+ "desktop-symbolic",
+ _("Desktop Support"),
+ _("Supports being used on a large screen"),
+ "dialog-question-symbolic",
+ _("Desktop Support Unknown"),
+ _("Not enough information to know if large screens are supported"),
+ "desktop-symbolic",
+ _("Desktop Only"),
+ _("Requires a large screen"),
+ "desktop-symbolic",
+ _("Desktop Support"),
+ _("Supports being used on a large screen"),
+ "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,
+ "phone-symbolic",
+ _("Mobile Support"),
+ _("Supports being used on a small screen"),
+ "dialog-question-symbolic",
+ _("Mobile Support Unknown"),
+ _("Not enough information to know if small screens are supported"),
+ "phone-symbolic",
+ _("Mobile Only"),
+ _("Requires a small screen"),
+ "phone-symbolic",
+ _("Mobile Support"),
+ _("Supports being used on a small screen"),
+ "phone-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"),
+ "dialog-question-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"),
+ "dialog-question-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,
+ "phone-symbolic",
+ _("Touchscreen Support"),
+ _("Requires a touchscreen"),
+ "dialog-question-symbolic",
+ _("Touchscreen Support Unknown"),
+ _("Not enough information to know if touchscreens are supported"),
+ "phone-symbolic",
+ _("Touchscreen Required"),
+ _("Requires a touchscreen"),
+ "phone-symbolic",
+ _("Touchscreen Support"),
+ _("Supports touchscreens"),
+ "phone-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 = "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 = "app-installed-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_WARNING:
+ icon_name = "dialog-question-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 = "yellow";
+ 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);
+
+ context = gtk_widget_get_style_context (self->lozenge);
+
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_remove_class (context, "red");
+ gtk_style_context_remove_class (context, "grey");
+
+ gtk_style_context_add_class (context, 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
+gs_hardware_support_context_dialog_init (GsHardwareSupportContextDialog *self)
+{
+ 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);
+}
+
+/**
+ * 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..8983c74
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..a5c0ed8
--- /dev/null
+++ b/src/gs-hardware-support-context-dialog.ui
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsHardwareSupportContextDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes" comments="Translators: This is the title of the dialog which contains information about the hardware support/requirements of an app">Hardware Support</property>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">False</property>
+ <!-- this is a placeholder: the icon is actually set in code -->
+ <property name="icon-name">safety-symbolic</property>
+ <property name="pixel-size">24</property>
+ <style>
+ <class name="large"/>
+ <class name="grey"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="title">
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="justify">center</property>
+ <property name="label">Shortwave works on this device</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBox" id="relations_list">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <!-- Rows are added in code -->
+ <placeholder/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLinkButton">
+ <property name="label" translatable="yes">How to contribute missing information</property>
+ <property name="margin-top">16</property>
+ <property name="uri">https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/software-metadata#hardware-support</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-info-bar.c b/src/gs-info-bar.c
new file mode 100644
index 0000000..e25e5d5
--- /dev/null
+++ b/src/gs-info-bar.c
@@ -0,0 +1,228 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright (C) 2016 Rafał Lużyński <digitalfreak@lingonborough.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-common.h"
+#include "gs-info-bar.h"
+
+struct _GsInfoBar
+{
+ GtkWidget parent_instance;
+
+ GtkInfoBar *info_bar;
+ GtkWidget *label_title;
+ GtkWidget *label_body;
+ GtkWidget *label_warning;
+};
+
+G_DEFINE_TYPE (GsInfoBar, gs_info_bar, GTK_TYPE_WIDGET)
+
+enum {
+ PROP_0,
+ PROP_TITLE,
+ PROP_BODY,
+ PROP_WARNING,
+ PROP_MESSAGE_TYPE,
+};
+
+static void
+gs_info_bar_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GsInfoBar *infobar = GS_INFO_BAR (object);
+
+ switch (prop_id) {
+ case PROP_TITLE:
+ g_value_set_string (value, gs_info_bar_get_title (infobar));
+ break;
+ case PROP_BODY:
+ g_value_set_string (value, gs_info_bar_get_body (infobar));
+ break;
+ case PROP_WARNING:
+ g_value_set_string (value, gs_info_bar_get_warning (infobar));
+ break;
+ case PROP_MESSAGE_TYPE:
+ g_value_set_enum (value, gtk_info_bar_get_message_type (infobar->info_bar));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_info_bar_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GsInfoBar *infobar = GS_INFO_BAR (object);
+
+ switch (prop_id) {
+ case PROP_TITLE:
+ gs_info_bar_set_title (infobar, g_value_get_string (value));
+ break;
+ case PROP_BODY:
+ gs_info_bar_set_body (infobar, g_value_get_string (value));
+ break;
+ case PROP_WARNING:
+ gs_info_bar_set_warning (infobar, g_value_get_string (value));
+ break;
+ case PROP_MESSAGE_TYPE:
+ gtk_info_bar_set_message_type (infobar->info_bar, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_info_bar_dispose (GObject *object)
+{
+ gs_widget_remove_all (GTK_WIDGET (object), NULL);
+
+ G_OBJECT_CLASS (gs_info_bar_parent_class)->dispose (object);
+}
+
+static void
+gs_info_bar_init (GsInfoBar *infobar)
+{
+ gtk_widget_init_template (GTK_WIDGET (infobar));
+}
+
+static void
+gs_info_bar_class_init (GsInfoBarClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->get_property = gs_info_bar_get_property;
+ object_class->set_property = gs_info_bar_set_property;
+ object_class->dispose = gs_info_bar_dispose;
+
+ g_object_class_install_property (object_class, PROP_TITLE,
+ g_param_spec_string ("title",
+ "Title Text",
+ "The title (header) text of the info bar",
+ "",
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_BODY,
+ g_param_spec_string ("body",
+ "Body Text",
+ "The body (main) text of the info bar",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_WARNING,
+ g_param_spec_string ("warning",
+ "Warning Text",
+ "The warning text of the info bar, below the body text",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_MESSAGE_TYPE,
+ g_param_spec_enum ("message-type",
+ "Message Type",
+ "The type of message",
+ GTK_TYPE_MESSAGE_TYPE,
+ GTK_MESSAGE_INFO,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-info-bar.ui");
+ gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+
+ gtk_widget_class_bind_template_child (widget_class,
+ GsInfoBar, info_bar);
+ gtk_widget_class_bind_template_child (widget_class,
+ GsInfoBar, label_title);
+ gtk_widget_class_bind_template_child (widget_class,
+ GsInfoBar, label_body);
+ gtk_widget_class_bind_template_child (widget_class,
+ GsInfoBar, label_warning);
+}
+
+GtkWidget *
+gs_info_bar_new (void)
+{
+ GsInfoBar *infobar;
+
+ infobar = g_object_new (GS_TYPE_INFO_BAR, NULL);
+
+ return GTK_WIDGET (infobar);
+}
+
+static const gchar *
+retrieve_from_label (GtkWidget *label)
+{
+ if (!gtk_widget_get_visible (label))
+ return NULL;
+ else
+ return gtk_label_get_label (GTK_LABEL (label));
+}
+
+static void
+update_label (GtkWidget *label, const gchar *text)
+{
+ gtk_label_set_label (GTK_LABEL (label), text);
+ gtk_widget_set_visible (label,
+ text != NULL && *text != '\0');
+}
+
+const gchar *
+gs_info_bar_get_title (GsInfoBar *bar)
+{
+ g_return_val_if_fail (GS_IS_INFO_BAR (bar), NULL);
+
+ return retrieve_from_label (bar->label_title);
+}
+
+void
+gs_info_bar_set_title (GsInfoBar *bar, const gchar *text)
+{
+ g_return_if_fail (GS_IS_INFO_BAR (bar));
+
+ update_label (bar->label_title, text);
+}
+
+const gchar *
+gs_info_bar_get_body (GsInfoBar *bar)
+{
+ g_return_val_if_fail (GS_IS_INFO_BAR (bar), NULL);
+
+ return retrieve_from_label (bar->label_body);
+}
+
+void
+gs_info_bar_set_body (GsInfoBar *bar, const gchar *text)
+{
+ g_return_if_fail (GS_IS_INFO_BAR (bar));
+
+ update_label (bar->label_body, text);
+}
+
+const gchar *
+gs_info_bar_get_warning (GsInfoBar *bar)
+{
+ g_return_val_if_fail (GS_IS_INFO_BAR (bar), NULL);
+
+ return retrieve_from_label (bar->label_warning);
+}
+
+void
+gs_info_bar_set_warning (GsInfoBar *bar, const gchar *text)
+{
+ g_return_if_fail (GS_IS_INFO_BAR (bar));
+
+ update_label (bar->label_warning, text);
+}
diff --git a/src/gs-info-bar.h b/src/gs-info-bar.h
new file mode 100644
index 0000000..832e692
--- /dev/null
+++ b/src/gs-info-bar.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 Rafał Lużyński <digitalfreak@lingonborough.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_INFO_BAR (gs_info_bar_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsInfoBar, gs_info_bar, GS, INFO_BAR, GtkWidget)
+
+GtkWidget *gs_info_bar_new (void);
+const gchar *gs_info_bar_get_title (GsInfoBar *bar);
+void gs_info_bar_set_title (GsInfoBar *bar,
+ const gchar *text);
+const gchar *gs_info_bar_get_body (GsInfoBar *bar);
+void gs_info_bar_set_body (GsInfoBar *bar,
+ const gchar *text);
+const gchar *gs_info_bar_get_warning (GsInfoBar *bar);
+void gs_info_bar_set_warning (GsInfoBar *bar,
+ const gchar *text);
+G_END_DECLS
diff --git a/src/gs-info-bar.ui b/src/gs-info-bar.ui
new file mode 100644
index 0000000..70e6332
--- /dev/null
+++ b/src/gs-info-bar.ui
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsInfoBar" parent="GtkWidget">
+ <child>
+ <object class="GtkInfoBar" id="info_bar">
+ <property name="message_type">info</property>
+ <style>
+ <class name="application-details-infobar"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="content_area">
+ <property name="spacing">0</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label_title">
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">30</property>
+ <property name="visible">False</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_body">
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">30</property>
+ <property name="visible">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_warning">
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">30</property>
+ <property name="visible">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-info-window.c b/src/gs-info-window.c
new file mode 100644
index 0000000..92b755f
--- /dev/null
+++ b/src/gs-info-window.c
@@ -0,0 +1,124 @@
+/* -*- 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 <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <adwaita.h>
+#include <locale.h>
+
+#include "gs-common.h"
+#include "gs-info-window.h"
+
+typedef struct
+{
+ GtkWidget *overlay;
+} GsInfoWindowPrivate;
+
+static void gs_info_window_buildable_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GsInfoWindow, gs_info_window, ADW_TYPE_WINDOW,
+ 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->overlay)
+ 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, overlay);
+
+ gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL);
+}
+
+/**
+ * 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);
+ gtk_overlay_set_child (GTK_OVERLAY (priv->overlay), widget);
+}
diff --git a/src/gs-info-window.h b/src/gs-info-window.h
new file mode 100644
index 0000000..30c8f4f
--- /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 <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <adwaita.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_INFO_WINDOW (gs_info_window_get_type ())
+
+G_DECLARE_DERIVABLE_TYPE (GsInfoWindow, gs_info_window, GS, INFO_WINDOW, AdwWindow)
+
+struct _GsInfoWindowClass
+{
+ AdwWindowClass 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..f910f82
--- /dev/null
+++ b/src/gs-info-window.ui
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsInfoWindow" parent="AdwWindow">
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="icon_name">dialog-information</property>
+ <property name="default-width">640</property>
+ <property name="default-height">576</property>
+ <style>
+ <class name="info"/>
+ </style>
+ <child>
+ <object class="GtkOverlay" id="overlay">
+ <child type="overlay">
+ <object class="AdwHeaderBar">
+ <property name="show_start_title_buttons">True</property>
+ <property name="show_end_title_buttons">True</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="title-widget">
+ <object class="AdwWindowTitle">
+ <property name="visible">False</property>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-installed-page.c b/src/gs-installed-page.c
new file mode 100644
index 0000000..4b2997d
--- /dev/null
+++ b/src/gs-installed-page.c
@@ -0,0 +1,974 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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 *spinner_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)
+ 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 applications 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_UPDATABLE &&
+ state != GS_APP_STATE_UPDATABLE_LIVE)
+ 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 application */
+ 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_spinner_stop (GTK_SPINNER (self->spinner_install));
+ 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_spinner_start (GTK_SPINNER (self->spinner_install));
+ 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 applications
+ * 2. state: applications queued for installing
+ * 3. state:removing applications
+ * 4. kind:normal applications
+ * 5. kind:system applications
+ *
+ * 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_INSTALLING:
+ g_string_append (key, "1:");
+ break;
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ g_string_append (key, "2:");
+ break;
+ case GS_APP_STATE_REMOVING:
+ g_string_append (key, "3:");
+ break;
+ default:
+ g_string_append (key, "4:");
+ 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)) {
+ 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, 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, spinner_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..f37efa5
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..ff0bfb7
--- /dev/null
+++ b/src/gs-installed-page.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsInstalledPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Installed page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack_install">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkSpinner" id="spinner_install">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">view</property>
+ <property name="child">
+ <object class="GtkBox" id="box_install">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_install">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="list-page"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">600</property>
+ <property name="tightening-threshold">400</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwPreferencesGroup" id="group_install_in_progress">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">In Progress</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list_box_install_in_progress">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_installed_page_app_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwPreferencesGroup" id="group_install_apps">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">Applications</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list_box_install_apps">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_installed_page_app_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwPreferencesGroup" id="group_install_web_apps">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">Web Applications</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list_box_install_web_apps">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_installed_page_app_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwPreferencesGroup" id="group_install_system_apps">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">System Applications</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list_box_install_system_apps">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_installed_page_app_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwPreferencesGroup" id="group_install_addons">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">Add-ons</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="list_box_install_addons">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_installed_page_app_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-language.c b/src/gs-language.c
new file mode 100644
index 0000000..d696b37
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#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; i<len; i++) {
+ if (strcmp (attribute_names[i], "iso_639_1_code") == 0)
+ code1 = attribute_values[i];
+ if (strcmp (attribute_names[i], "iso_639_2B_code") == 0)
+ code2b = attribute_values[i];
+ if (strcmp (attribute_names[i], "name") == 0)
+ name = attribute_values[i];
+ }
+
+ /* not valid entry */
+ if (name == NULL)
+ return;
+
+ /* add both to hash */
+ if (code1 != NULL)
+ g_hash_table_insert (language->hash, 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:
+ *
+ * <iso_639_entry iso_639_2B_code="hun" iso_639_2T_code="hun" iso_639_1_code="hu" name="Hungarian" />
+ **/
+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..04688f8
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+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..37fcf49
--- /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 <georges.stavracas@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..bbb661f
--- /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 <georges.stavracas@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+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..ffac3ba
--- /dev/null
+++ b/src/gs-license-tile.c
@@ -0,0 +1,334 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#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;
+ GtkLabel *get_involved_label;
+};
+
+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)
+{
+ 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 get_involved_visible;
+ const gchar *get_involved_label;
+
+ /* Widget behaviour is undefined if the app is unspecified. */
+ if (self->app == NULL)
+ return;
+
+ if (gs_app_get_license_is_free (self->app)) {
+ const gchar *license_spdx, *license_url;
+
+ title = _("Community Built");
+ css_class = "green";
+ lozenge_icon_names[0] = "heart-filled-symbolic";
+ lozenge_icon_names[1] = "community-symbolic";
+ lozenge_icon_names[2] = "sign-language-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 (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 a community of volunteers, and released under the <a href=\"%s\">%s license</a>."
+ "\n\n"
+ "You can contribute 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 a community of volunteers, and released under the %s license."
+ "\n\n"
+ "You can contribute and help make it even better."),
+ license_spdx);
+ }
+ } else {
+ title = _("Proprietary");
+ css_class = "yellow";
+ lozenge_icon_names[0] = "hand-open-symbolic";
+ lozenge_icon_names[1] = "dialog-warning-symbolic";
+ lozenge_icon_names[2] = "community-none-symbolic";
+ get_involved_visible = TRUE;
+ get_involved_label = _("_Learn More");
+
+ 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."));
+ }
+
+ for (gsize i = 0; i < G_N_ELEMENTS (self->lozenges); i++) {
+ GtkStyleContext *context = gtk_widget_get_style_context (self->lozenges[i]);
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_add_class (context, 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_label), get_involved_visible);
+ gtk_label_set_label (self->get_involved_label, 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)
+ *
+ * Application 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_label);
+
+ 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..11f42e1
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..e69581e
--- /dev/null
+++ b/src/gs-license-tile.ui
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsLicenseTile" parent="GtkWidget">
+ <child>
+ <object class="GtkListBox">
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="gs_license_tile_row_activated_cb"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <property name="margin-top">14</property>
+ <property name="margin-bottom">14</property>
+ <property name="margin-start">14</property>
+ <property name="margin-end">14</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="halign">center</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge0">
+ <property name="circular">True</property>
+ <property name="icon-name">heart-filled-symbolic</property>
+ <style>
+ <class name="green"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GsLozenge" id="lozenge1">
+ <property name="circular">True</property>
+ <property name="icon-name">community-symbolic</property>
+ <style>
+ <class name="green"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GsLozenge" id="lozenge2">
+ <property name="circular">True</property>
+ <property name="icon-name">sign-language-symbolic</property>
+ <style>
+ <class name="green"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="title_label">
+ <!-- This text is a placeholder and will be set dynamically -->
+ <property name="label">Community Built</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description_label">
+ <!-- This text is a placeholder and will be set dynamically -->
+ <property name="label">This software is developed in the open by a community of volunteers, and released under the GNU GPL v3 license.\n\nYou can contribute and help make it even better.</property>
+ <property name="use-markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">True</property>
+ <property name="visible" bind-source="get_involved_label" bind-property="visible" bind-flags="sync-create"/>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="halign">center</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <child>
+ <object class="GtkLabel" id="get_involved_label">
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes">_Get Involved</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">external-link-symbolic</property>
+ <property name="margin-start">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-loading-page.c b/src/gs-loading-page.c
new file mode 100644
index 0000000..517d13a
--- /dev/null
+++ b/src/gs-loading-page.c
@@ -0,0 +1,215 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "gs-shell.h"
+#include "gs-loading-page.h"
+
+typedef struct {
+ GsPluginLoader *plugin_loader;
+ GCancellable *cancellable;
+ GsShell *shell;
+
+ GtkWidget *progressbar;
+ GtkWidget *status_page;
+ 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
+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 */
+ _("Downloading software catalog"));
+
+ /* update progressbar */
+ if (priv->progress_pulse_id != 0) {
+ g_source_remove (priv->progress_pulse_id);
+ priv->progress_pulse_id = 0;
+ }
+
+ if (progress_percent == G_MAXUINT) {
+ priv->progress_pulse_id = g_timeout_add (50, _pulse_cb, self);
+ } else {
+ 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 */
+ if (priv->progress_pulse_id != 0) {
+ g_source_remove (priv->progress_pulse_id);
+ priv->progress_pulse_id = 0;
+ }
+
+ /* 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);
+
+ if (priv->progress_pulse_id != 0) {
+ g_source_remove (priv->progress_pulse_id);
+ priv->progress_pulse_id = 0;
+ }
+
+ 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_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;
+ 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..7add3d9
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..f2ea1cf
--- /dev/null
+++ b/src/gs-loading-page.ui
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsLoadingPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Loading page</property>
+ </accessibility>
+ <child>
+ <object class="AdwStatusPage" id="status_page">
+ <property name="icon_name">org.gnome.Software</property>
+ <property name="title" translatable="yes">Starting up…</property>
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">400</property>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="fraction">0.0</property>
+ <property name="margin_bottom">12</property>
+ <style>
+ <class name="upgrade-progressbar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-lozenge.c b/src/gs-lozenge.c
new file mode 100644
index 0000000..6e7cff2
--- /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+
+ */
+
+#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_hide (self->image);
+ gtk_widget_show (self->label);
+ } else {
+ gtk_image_set_from_icon_name (GTK_IMAGE (self->image), self->icon_name);
+ gtk_widget_hide (self->label);
+ gtk_widget_show (self->image);
+ }
+
+ /* 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_hide (self->label);
+ gtk_widget_show (self->image);
+ } else {
+ gtk_label_set_text (GTK_LABEL (self->label), self->text);
+ gtk_widget_hide (self->image);
+ gtk_widget_show (self->label);
+ }
+
+ /* 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_hide (self->label);
+ gtk_widget_show (self->image);
+ } else {
+ gtk_label_set_markup (GTK_LABEL (self->label), self->markup);
+ gtk_widget_hide (self->image);
+ gtk_widget_show (self->label);
+ }
+
+ /* 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..d331976
--- /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+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+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..545d803
--- /dev/null
+++ b/src/gs-lozenge.ui
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsLozenge" parent="GtkBox">
+ <property name="halign">center</property>
+ <property name="hexpand">False</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="context-tile-lozenge"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <!-- this is a placeholder: the icon is actually set in code -->
+ <property name="icon-name">safety-symbolic</property>
+ <property name="pixel-size">16</property>
+ <property name="visible">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">20 MB</property>
+ <property name="visible">False</property>
+ <property name="xalign">0.5</property>
+ <property name="visible">False</property>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-main.c b/src/gs-main.c
new file mode 100644
index 0000000..03e8c91
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <gio/gdesktopappinfo.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+#include <sys/stat.h>
+
+#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 ();
+
+ g_set_prgname ("org.gnome.Software");
+ 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");
+ 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-metered-data-dialog.c b/src/gs-metered-data-dialog.c
new file mode 100644
index 0000000..7e8a35b
--- /dev/null
+++ b/src/gs-metered-data-dialog.c
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ * vi:set noexpandtab tabstop=8 shiftwidth=8:
+ *
+ * Copyright © 2020 Endless Mobile, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#include "gs-metered-data-dialog.h"
+
+struct _GsMeteredDataDialog
+{
+ GsInfoWindow parent_instance;
+
+ GtkWidget *button_network_settings;
+};
+
+G_DEFINE_TYPE (GsMeteredDataDialog, gs_metered_data_dialog, GS_TYPE_INFO_WINDOW)
+
+static void
+button_network_settings_clicked_cb (GtkButton *button,
+ gpointer user_data)
+{
+ g_autoptr(GError) error_local = NULL;
+
+ if (!g_spawn_command_line_async ("gnome-control-center wifi", &error_local)) {
+ g_warning ("Error opening GNOME Control Center: %s",
+ error_local->message);
+ return;
+ }
+}
+
+static void
+gs_metered_data_dialog_init (GsMeteredDataDialog *dialog)
+{
+ gtk_widget_init_template (GTK_WIDGET (dialog));
+}
+
+static void
+gs_metered_data_dialog_class_init (GsMeteredDataDialogClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Software/gs-metered-data-dialog.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GsMeteredDataDialog, button_network_settings);
+
+ gtk_widget_class_bind_template_callback (widget_class, button_network_settings_clicked_cb);
+}
+
+GtkWidget *
+gs_metered_data_dialog_new (GtkWindow *parent)
+{
+ GsMeteredDataDialog *dialog;
+
+ dialog = g_object_new (GS_TYPE_METERED_DATA_DIALOG,
+ "transient-for", parent,
+ NULL);
+
+ return GTK_WIDGET (dialog);
+}
diff --git a/src/gs-metered-data-dialog.h b/src/gs-metered-data-dialog.h
new file mode 100644
index 0000000..676783d
--- /dev/null
+++ b/src/gs-metered-data-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 © 2020 Endless Mobile, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#include "gs-info-window.h"
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_METERED_DATA_DIALOG (gs_metered_data_dialog_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsMeteredDataDialog, gs_metered_data_dialog, GS, METERED_DATA_DIALOG, GsInfoWindow)
+
+GtkWidget *gs_metered_data_dialog_new (GtkWindow *parent);
+
+G_END_DECLS
diff --git a/src/gs-metered-data-dialog.ui b/src/gs-metered-data-dialog.ui
new file mode 100644
index 0000000..02c2bdb
--- /dev/null
+++ b/src/gs-metered-data-dialog.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsMeteredDataDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes">Automatic Updates Paused</property>
+ <child>
+ <object class="AdwStatusPage">
+ <property name="title" bind-source="GsMeteredDataDialog" bind-property="title" bind-flags="sync-create"/>
+ <property name="description" translatable="yes">The current network is metered. Metered connections have data limits or charges associated with them. To save data, automatic updates have therefore been paused.
+
+Automatic updates will be resumed when an un­metered network becomes available. Until then, it is still possible to manually install updates.
+
+Alternatively, if the current network has been in­correctly identified as being metered, this setting can be changed.</property>
+ <property name="icon-name">network-cellular-signal-excellent-symbolic</property>
+ <child>
+ <object class="GtkButton" id="button_network_settings">
+ <property name="label" translatable="yes">Open Network _Settings</property>
+ <property name="halign">center</property>
+ <property name="receives-default">True</property>
+ <property name="use-underline">True</property>
+ <signal name="clicked" handler="button_network_settings_clicked_cb"/>
+ <style>
+ <class name="pill"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-moderate-page.c b/src/gs-moderate-page.c
new file mode 100644
index 0000000..5461791
--- /dev/null
+++ b/src/gs-moderate-page.c
@@ -0,0 +1,471 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2016-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <string.h>
+
+#include "gs-app-row.h"
+#include "gs-review-row.h"
+#include "gs-shell.h"
+#include "gs-moderate-page.h"
+#include "gs-common.h"
+
+struct _GsModeratePage
+{
+ GsPage parent_instance;
+
+ GsPluginLoader *plugin_loader;
+ GCancellable *cancellable;
+ GtkSizeGroup *sizegroup_name;
+ GtkSizeGroup *sizegroup_button_label;
+ GtkSizeGroup *sizegroup_button_image;
+ GsShell *shell;
+ GsOdrsProvider *odrs_provider;
+
+ GtkWidget *list_box_install;
+ GtkWidget *scrolledwindow_install;
+ GtkWidget *spinner_install;
+ GtkWidget *stack_install;
+};
+
+G_DEFINE_TYPE (GsModeratePage, gs_moderate_page, GS_TYPE_PAGE)
+
+typedef enum {
+ PROP_ODRS_PROVIDER = 1,
+} GsModeratePageProperty;
+
+static GParamSpec *obj_props[PROP_ODRS_PROVIDER + 1] = { NULL, };
+
+static void
+gs_moderate_page_perhaps_hide_app_row (GsModeratePage *self, GsApp *app)
+{
+ GtkWidget *child;
+ GsAppRow *app_row = NULL;
+ gboolean is_visible = FALSE;
+
+ for (child = gtk_widget_get_first_child (self->list_box_install);
+ child != NULL;
+ child = gtk_widget_get_next_sibling (child)) {
+ if (!gtk_widget_get_visible (child))
+ continue;
+ if (GS_IS_APP_ROW (child)) {
+ GsApp *app_tmp = gs_app_row_get_app (GS_APP_ROW (child));
+ if (g_strcmp0 (gs_app_get_id (app),
+ gs_app_get_id (app_tmp)) == 0) {
+ app_row = GS_APP_ROW (child);
+ continue;
+ }
+ }
+ if (GS_IS_REVIEW_ROW (child)) {
+ GsApp *app_tmp = g_object_get_data (G_OBJECT (child), "GsApp");
+ if (g_strcmp0 (gs_app_get_id (app),
+ gs_app_get_id (app_tmp)) == 0) {
+ is_visible = TRUE;
+ break;
+ }
+ }
+ }
+ if (!is_visible && app_row != NULL)
+ gs_app_row_unreveal (app_row);
+}
+
+static void
+gs_moderate_page_review_clicked_cb (GsReviewRow *row,
+ GsReviewAction action,
+ GsModeratePage *self)
+{
+ GsApp *app = g_object_get_data (G_OBJECT (row), "GsApp");
+ AsReview *review = gs_review_row_get_review (row);
+ g_autoptr(GError) local_error = NULL;
+
+ g_assert (self->odrs_provider != NULL);
+
+ /* FIXME: Make this async */
+ switch (action) {
+ case GS_REVIEW_ACTION_UPVOTE:
+ gs_odrs_provider_upvote_review (self->odrs_provider, app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_DOWNVOTE:
+ gs_odrs_provider_downvote_review (self->odrs_provider, app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_REPORT:
+ gs_odrs_provider_report_review (self->odrs_provider, app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_DISMISS:
+ gs_odrs_provider_dismiss_review (self->odrs_provider, app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ case GS_REVIEW_ACTION_REMOVE:
+ gs_odrs_provider_remove_review (self->odrs_provider, app,
+ review, self->cancellable,
+ &local_error);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ gtk_widget_set_visible (GTK_WIDGET (row), FALSE);
+
+ /* if there are no more visible rows, hide the app */
+ gs_moderate_page_perhaps_hide_app_row (self, app);
+
+ if (local_error != NULL) {
+ g_warning ("failed to set review on %s: %s",
+ gs_app_get_id (app), local_error->message);
+ return;
+ }
+}
+
+static void
+gs_moderate_page_selection_changed_cb (GtkListBox *listbox,
+ GsAppRow *app_row,
+ GsModeratePage *self)
+{
+ g_autofree gchar *tmp = NULL;
+ tmp = gs_app_to_string (gs_app_row_get_app (app_row));
+ g_print ("%s", tmp);
+}
+
+static void
+gs_moderate_page_add_app (GsModeratePage *self, GsApp *app)
+{
+ GPtrArray *reviews;
+ GtkWidget *app_row;
+ guint i;
+
+ /* this hides the action button */
+ gs_app_add_quirk (app, GS_APP_QUIRK_COMPULSORY);
+
+ /* add top level app */
+ app_row = gs_app_row_new (app);
+ gs_app_row_set_show_buttons (GS_APP_ROW (app_row), TRUE);
+ gtk_list_box_append (GTK_LIST_BOX (self->list_box_install), app_row);
+ gs_app_row_set_size_groups (GS_APP_ROW (app_row),
+ self->sizegroup_name,
+ self->sizegroup_button_label,
+ self->sizegroup_button_image);
+
+ /* add reviews */
+ reviews = gs_app_get_reviews (app);
+ for (i = 0; i < reviews->len; i++) {
+ AsReview *review = g_ptr_array_index (reviews, i);
+ GtkWidget *row = gs_review_row_new (review);
+ gtk_widget_set_margin_start (row, 250);
+ gtk_widget_set_margin_end (row, 250);
+ gs_review_row_set_actions (GS_REVIEW_ROW (row),
+ 1 << GS_REVIEW_ACTION_UPVOTE |
+ 1 << GS_REVIEW_ACTION_DOWNVOTE |
+ 1 << GS_REVIEW_ACTION_DISMISS |
+ 1 << GS_REVIEW_ACTION_REPORT);
+ g_signal_connect (row, "button-clicked",
+ G_CALLBACK (gs_moderate_page_review_clicked_cb), self);
+ g_object_set_data_full (G_OBJECT (row), "GsApp",
+ g_object_ref (app),
+ (GDestroyNotify) g_object_unref);
+ gtk_list_box_append (GTK_LIST_BOX (self->list_box_install), row);
+ }
+ gtk_widget_show (app_row);
+}
+
+static void
+gs_moderate_page_refine_unvoted_reviews_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ guint i;
+ GsApp *app;
+ GsModeratePage *self = GS_MODERATE_PAGE (user_data);
+ GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object);
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GsAppList) list = NULL;
+
+ gtk_spinner_stop (GTK_SPINNER (self->spinner_install));
+ gtk_stack_set_visible_child_name (GTK_STACK (self->stack_install), "view");
+
+ 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 moderate apps: %s", error->message);
+ return;
+ }
+
+ /* no results */
+ if (gs_app_list_length (list) == 0) {
+ gtk_stack_set_visible_child_name (GTK_STACK (self->stack_install),
+ "uptodate");
+ return;
+ }
+
+ for (i = 0; i < gs_app_list_length (list); i++) {
+ app = gs_app_list_index (list, i);
+ gs_moderate_page_add_app (self, app);
+ }
+}
+
+static void
+gs_moderate_page_load (GsModeratePage *self)
+{
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+ g_autoptr(GsAppList) list = gs_app_list_new ();
+ g_autoptr(GError) local_error = NULL;
+
+ /* remove old entries */
+ gs_widget_remove_all (self->list_box_install, (GsRemoveFunc) gtk_list_box_remove);
+
+ /* get unvoted reviews as apps */
+ if (!gs_odrs_provider_add_unvoted_reviews (self->odrs_provider, list,
+ self->cancellable, &local_error)) {
+ 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 moderate apps: %s", local_error->message);
+ return;
+ }
+
+ plugin_job = gs_plugin_job_refine_new (list,
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_SETUP_ACTION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_REVIEWS);
+ gs_plugin_job_set_interactive (plugin_job, TRUE);
+ gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job,
+ self->cancellable,
+ gs_moderate_page_refine_unvoted_reviews_cb,
+ self);
+ gtk_spinner_start (GTK_SPINNER (self->spinner_install));
+ gtk_stack_set_visible_child_name (GTK_STACK (self->stack_install), "spinner");
+}
+
+static void
+gs_moderate_page_reload (GsPage *page)
+{
+ GsModeratePage *self = GS_MODERATE_PAGE (page);
+ if (gs_shell_get_mode (self->shell) == GS_SHELL_MODE_MODERATE)
+ gs_moderate_page_load (self);
+}
+
+static void
+gs_moderate_page_switch_to (GsPage *page)
+{
+ GsModeratePage *self = GS_MODERATE_PAGE (page);
+
+ if (gs_shell_get_mode (self->shell) != GS_SHELL_MODE_MODERATE) {
+ g_warning ("Called switch_to(moderate) when in mode %s",
+ gs_shell_get_mode_string (self->shell));
+ return;
+ }
+ if (gs_shell_get_mode (self->shell) == GS_SHELL_MODE_MODERATE)
+ gs_grab_focus_when_mapped (self->scrolledwindow_install);
+ gs_moderate_page_load (self);
+}
+
+static void
+gs_moderate_page_list_header_func (GtkListBoxRow *row,
+ GtkListBoxRow *before,
+ gpointer user_data)
+{
+ GtkWidget *header;
+ gtk_list_box_row_set_header (row, NULL);
+ if (before == NULL)
+ return;
+ if (GS_IS_REVIEW_ROW (before) && GS_IS_APP_ROW (row)) {
+ header = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_list_box_row_set_header (row, header);
+ }
+}
+
+static gboolean
+gs_moderate_page_setup (GsPage *page,
+ GsShell *shell,
+ GsPluginLoader *plugin_loader,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GsModeratePage *self = GS_MODERATE_PAGE (page);
+
+ g_return_val_if_fail (GS_IS_MODERATE_PAGE (self), TRUE);
+
+ self->shell = shell;
+ self->plugin_loader = g_object_ref (plugin_loader);
+ self->cancellable = g_object_ref (cancellable);
+
+ gtk_list_box_set_header_func (GTK_LIST_BOX (self->list_box_install),
+ gs_moderate_page_list_header_func,
+ self, NULL);
+
+ return TRUE;
+}
+
+static void
+gs_moderate_page_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GsModeratePage *self = GS_MODERATE_PAGE (object);
+
+ switch ((GsModeratePageProperty) prop_id) {
+ case PROP_ODRS_PROVIDER:
+ g_value_set_object (value, gs_moderate_page_get_odrs_provider (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_moderate_page_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GsModeratePage *self = GS_MODERATE_PAGE (object);
+
+ switch ((GsModeratePageProperty) prop_id) {
+ case PROP_ODRS_PROVIDER:
+ gs_moderate_page_set_odrs_provider (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_moderate_page_dispose (GObject *object)
+{
+ GsModeratePage *self = GS_MODERATE_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->odrs_provider);
+
+ G_OBJECT_CLASS (gs_moderate_page_parent_class)->dispose (object);
+}
+
+static void
+gs_moderate_page_class_init (GsModeratePageClass *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_moderate_page_get_property;
+ object_class->set_property = gs_moderate_page_set_property;
+ object_class->dispose = gs_moderate_page_dispose;
+ page_class->switch_to = gs_moderate_page_switch_to;
+ page_class->reload = gs_moderate_page_reload;
+ page_class->setup = gs_moderate_page_setup;
+
+ /**
+ * GsModeratePage:odrs-provider: (nullable)
+ *
+ * An ODRS provider to give access to ratings and reviews information
+ * for the apps being displayed.
+ *
+ * If this is %NULL, ratings and reviews will be disabled and the page
+ * will be effectively useless.
+ *
+ * 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);
+
+ 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-moderate-page.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GsModeratePage, list_box_install);
+ gtk_widget_class_bind_template_child (widget_class, GsModeratePage, scrolledwindow_install);
+ gtk_widget_class_bind_template_child (widget_class, GsModeratePage, spinner_install);
+ gtk_widget_class_bind_template_child (widget_class, GsModeratePage, stack_install);
+}
+
+static void
+gs_moderate_page_init (GsModeratePage *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+ g_signal_connect (self->list_box_install, "row-activated",
+ G_CALLBACK (gs_moderate_page_selection_changed_cb), 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);
+}
+
+GsModeratePage *
+gs_moderate_page_new (void)
+{
+ GsModeratePage *self;
+ self = g_object_new (GS_TYPE_MODERATE_PAGE, NULL);
+ return GS_MODERATE_PAGE (self);
+}
+
+/**
+ * gs_moderate_page_get_odrs_provider:
+ * @self: a #GsModeratePage
+ *
+ * Get the value of #GsModeratePage:odrs-provider.
+ *
+ * Returns: (nullable) (transfer none): a #GsOdrsProvider, or %NULL if unset
+ * Since: 41
+ */
+GsOdrsProvider *
+gs_moderate_page_get_odrs_provider (GsModeratePage *self)
+{
+ g_return_val_if_fail (GS_IS_MODERATE_PAGE (self), NULL);
+
+ return self->odrs_provider;
+}
+
+/**
+ * gs_moderate_page_set_odrs_provider:
+ * @self: a #GsModeratePage
+ * @odrs_provider: (nullable) (transfer none): new #GsOdrsProvider or %NULL
+ *
+ * Set the value of #GsModeratePage:odrs-provider.
+ *
+ * Since: 41
+ */
+void
+gs_moderate_page_set_odrs_provider (GsModeratePage *self,
+ GsOdrsProvider *odrs_provider)
+{
+ g_return_if_fail (GS_IS_MODERATE_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_moderate_page_reload (GS_PAGE (self));
+ g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_ODRS_PROVIDER]);
+ }
+}
diff --git a/src/gs-moderate-page.h b/src/gs-moderate-page.h
new file mode 100644
index 0000000..12a11af
--- /dev/null
+++ b/src/gs-moderate-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 <richard@hughsie.com>
+ * Copyright (C) 2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include "gs-page.h"
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_MODERATE_PAGE (gs_moderate_page_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsModeratePage, gs_moderate_page, GS, MODERATE_PAGE, GsPage)
+
+GsModeratePage *gs_moderate_page_new (void);
+
+GsOdrsProvider *gs_moderate_page_get_odrs_provider (GsModeratePage *self);
+void gs_moderate_page_set_odrs_provider (GsModeratePage *self,
+ GsOdrsProvider *odrs_provider);
+
+G_END_DECLS
diff --git a/src/gs-moderate-page.ui b/src/gs-moderate-page.ui
new file mode 100644
index 0000000..0f8bd22
--- /dev/null
+++ b/src/gs-moderate-page.ui
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsModeratePage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Moderate page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack_install">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkSpinner" id="spinner_install">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">view</property>
+ <property name="child">
+ <object class="GtkBox" id="box_install">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_install">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">860</property>
+ <!-- ~⅔ of the maximum size. -->
+ <property name="tightening-threshold">576</property>
+ <child>
+ <object class="GtkListBox" id="list_box_install">
+ <property name="can_focus">True</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">uptodate</property>
+ <property name="child">
+ <object class="AdwStatusPage" id="updates_uptodate_box">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="icon_name">object-select-symbolic</property>
+ <property name="title" translatable="yes">There are no reviews to moderate</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-origin-popover-row.c b/src/gs-origin-popover-row.c
new file mode 100644
index 0000000..adfb539
--- /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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-common.h"
+
+#include "gs-origin-popover-row.h"
+
+#include <glib/gi18n.h>
+
+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_hide (priv->user_scope_box);
+ }
+
+ 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, "packaging-color", 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..be928ee
--- /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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include "gnome-software-private.h"
+#include <gtk/gtk.h>
+
+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..bee4d80
--- /dev/null
+++ b/src/gs-origin-popover-row.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GsOriginPopoverRow" parent="GtkListBoxRow">
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="width-request">200</property>
+ <child>
+ <object class="GtkBox" id="row_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="top_hbox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">0</property>
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="info_label">
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="installed_image">
+ <property name="visible">False</property>
+ <property name="pixel_size">16</property>
+ <property name="icon_name">app-installed-symbolic</property>
+ <property name="margin-start">6</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="success"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="bottom_hbox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="packaging_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="origin-rounded-box"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="packaging_image">
+ <property name="pixel_size">16</property>
+ <property name="icon_name">package-x-generic-symbolic</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="packaging_label">
+ <property name="halign">start</property>
+ <property name="ellipsize">none</property>
+ <property name="margin-top">1</property>
+ <property name="margin-end">2</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="variant" value="all-small-caps"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="beta_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="origin-rounded-box"/>
+ <class name="origin-beta"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="beta_image">
+ <property name="pixel_size">16</property>
+ <property name="icon_name">test-symbolic</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="beta_label">
+ <property name="halign">start</property>
+ <property name="ellipsize">none</property>
+ <property name="label" translatable="yes" comments="Translators: It's like a beta version of the software, a test version">Beta</property>
+ <property name="margin-top">1</property>
+ <property name="margin-end">2</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="variant" value="all-small-caps"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="user_scope_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="origin-rounded-box"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="user_scope_image">
+ <property name="pixel_size">16</property>
+ <property name="icon_name">avatar-default-symbolic</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="user_scope_label">
+ <property name="halign">start</property>
+ <property name="ellipsize">none</property>
+ <property name="label" translatable="yes" comments="Translators: It's an origin scope, 'User' or 'System' installation">User</property>
+ <property name="margin-top">1</property>
+ <property name="margin-end">2</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="variant" value="all-small-caps"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="selected_image">
+ <property name="visible">False</property>
+ <property name="margin-start">18</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="pixel_size">16</property>
+ <property name="icon_name">object-select-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-os-update-page.c b/src/gs-os-update-page.c
new file mode 100644
index 0000000..3b5b979
--- /dev/null
+++ b/src/gs-os-update-page.c
@@ -0,0 +1,613 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2021 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib/gi18n.h>
+
+#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,
+ PROP_SHOW_BACK_BUTTON,
+ PROP_TITLE,
+} GsOsUpdatePageProperty;
+
+enum {
+ SIGNAL_APP_ACTIVATED,
+ SIGNAL_BACK_CLICKED,
+ SIGNAL_LAST
+};
+
+static GParamSpec *obj_props[PROP_TITLE + 1] = { NULL, };
+
+static guint signals[SIGNAL_LAST] = { 0 };
+
+struct _GsOsUpdatePage
+{
+ GtkBox parent_instance;
+
+ GtkWidget *back_button;
+ GtkWidget *box;
+ GtkWidget *group;
+ GtkWidget *header_bar;
+ AdwWindowTitle *window_title;
+
+ GsApp *app; /* (owned) (nullable) */
+ GtkWidget *list_boxes[GS_OS_UPDATE_PAGE_SECTION_LAST];
+};
+
+G_DEFINE_TYPE (GsOsUpdatePage, gs_os_update_page, GTK_TYPE_BOX)
+
+static void
+row_activated_cb (GtkListBox *list_box,
+ GtkListBoxRow *row,
+ GsOsUpdatePage *page)
+{
+ GsApp *app;
+
+ app = GS_APP (g_object_get_data (G_OBJECT (gtk_list_box_row_get_child (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 */
+ return g_strdup_printf ("%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, *label;
+
+ row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ g_object_set_data_full (G_OBJECT (row),
+ "app",
+ g_object_ref (app),
+ g_object_unref);
+ label = gtk_label_new (gs_app_get_source_default (app));
+ g_object_set (label,
+ "margin-start", 20,
+ "margin-end", 0,
+ "margin-top", 6,
+ "margin-bottom", 6,
+ "xalign", 0.0,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL);
+ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
+ gtk_box_append (GTK_BOX (row), label);
+ 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));
+ label = gtk_label_new (verstr);
+ } else {
+ label = gtk_label_new (gs_app_get_version (app));
+ }
+ g_object_set (label,
+ "margin-start", 0,
+ "margin-end", 20,
+ "margin-top", 6,
+ "margin-bottom", 6,
+ "xalign", 1.0,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL);
+ gtk_widget_set_halign (label, GTK_ALIGN_END);
+ gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
+ gtk_box_append (GTK_BOX (row), label);
+
+ return row;
+}
+
+static gboolean
+is_downgrade (const gchar *evr1,
+ const gchar *evr2)
+{
+ gint rc;
+
+ if (evr1 == NULL || evr2 == NULL)
+ return FALSE;
+
+ rc = as_vercmp (evr1, evr2, AS_VERCMP_FLAG_IGNORE_EPOCH);
+ 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 (gtk_list_box_row_get_child (a));
+ GObject *o2 = G_OBJECT (gtk_list_box_row_get_child (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 GtkWidget *
+get_section_header (GsOsUpdatePage *page, GsOsUpdatePageSection section)
+{
+ GtkWidget *header;
+ GtkWidget *label;
+
+ /* get labels and buttons for everything */
+ if (section == GS_OS_UPDATE_PAGE_SECTION_ADDITIONS) {
+ /* TRANSLATORS: This is the header for package additions during
+ * a system update */
+ label = gtk_label_new (_("Additions"));
+ } else if (section == GS_OS_UPDATE_PAGE_SECTION_REMOVALS) {
+ /* TRANSLATORS: This is the header for package removals during
+ * a system update */
+ label = gtk_label_new (_("Removals"));
+ } else if (section == GS_OS_UPDATE_PAGE_SECTION_UPDATES) {
+ /* TRANSLATORS: This is the header for package updates during
+ * a system update */
+ label = gtk_label_new (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 */
+ label = gtk_label_new (_("Downgrades"));
+ } else {
+ g_assert_not_reached ();
+ }
+
+ /* create header */
+ header = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+ gtk_widget_add_css_class (header, "app-listbox-header");
+
+ /* put label into the header */
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_box_append (GTK_BOX (header), label);
+ gtk_widget_set_margin_start (label, 16);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_widget_add_css_class (label, "heading");
+
+ /* success */
+ return header;
+}
+
+static void
+list_header_func (GtkListBoxRow *row,
+ GtkListBoxRow *before,
+ gpointer user_data)
+{
+ GsOsUpdatePage *page = (GsOsUpdatePage *) user_data;
+ GObject *o = G_OBJECT (gtk_list_box_row_get_child (row));
+ GsApp *app = g_object_get_data (o, "app");
+ GtkWidget *header = NULL;
+
+ if (before == NULL)
+ header = get_section_header (page, get_app_section (app));
+ else
+ header = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_list_box_row_set_header (row, header);
+}
+
+static void
+create_section (GsOsUpdatePage *page, GsOsUpdatePageSection section)
+{
+ GtkWidget *previous = NULL;
+
+ 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);
+ gtk_list_box_set_header_func (GTK_LIST_BOX (page->list_boxes[section]),
+ list_header_func,
+ page, NULL);
+ g_signal_connect (GTK_LIST_BOX (page->list_boxes[section]), "row-activated",
+ G_CALLBACK (row_activated_cb), page);
+ gtk_box_append (GTK_BOX (page->box), page->list_boxes[section]);
+ gtk_widget_set_margin_top (page->list_boxes[section], 24);
+
+ /* reorder the children */
+ for (guint i = 0; i < GS_OS_UPDATE_PAGE_SECTION_LAST; i++) {
+ if (page->list_boxes[i] == NULL)
+ continue;
+ gtk_box_reorder_child_after (GTK_BOX (page->box),
+ page->list_boxes[i],
+ previous);
+ previous = page->list_boxes[i];
+ }
+
+ /* make rounded edges */
+ gtk_widget_set_overflow (page->list_boxes[section], GTK_OVERFLOW_HIDDEN);
+ gtk_widget_add_css_class (page->list_boxes[section], "card");
+}
+
+/**
+ * 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++) {
+ if (page->list_boxes[i] == NULL)
+ continue;
+ gs_widget_remove_all (page->list_boxes[i], (GsRemoveFunc) gtk_list_box_remove);
+ }
+
+ if (app) {
+ adw_window_title_set_title (page->window_title, gs_app_get_name (app));
+ adw_preferences_group_set_description (ADW_PREFERENCES_GROUP (page->group),
+ 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_window_title_set_title (page->window_title, NULL);
+ adw_preferences_group_set_description (ADW_PREFERENCES_GROUP (page->group), NULL);
+ }
+
+ g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_APP]);
+ g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_TITLE]);
+}
+
+/**
+ * gs_os_update_page_get_show_back_button:
+ * @page: a #GsOsUpdatePage
+ *
+ * Get the value of #GsOsUpdatePage:show-back-button.
+ *
+ * Returns: whether to show the back button
+ *
+ * Since: 42.1
+ */
+gboolean
+gs_os_update_page_get_show_back_button (GsOsUpdatePage *page)
+{
+ g_return_val_if_fail (GS_IS_OS_UPDATE_PAGE (page), FALSE);
+ return gtk_widget_get_visible (page->back_button);
+}
+
+/**
+ * gs_os_update_page_set_show_back_button:
+ * @page: a #GsOsUpdatePage
+ * @show_back_button: whether to show the back button
+ *
+ * Set the value of #GsOsUpdatePage:show-back-button.
+ *
+ * Since: 42.1
+ */
+void
+gs_os_update_page_set_show_back_button (GsOsUpdatePage *page,
+ gboolean show_back_button)
+{
+ g_return_if_fail (GS_IS_OS_UPDATE_PAGE (page));
+
+ show_back_button = !!show_back_button;
+
+ if (gtk_widget_get_visible (page->back_button) == show_back_button)
+ return;
+
+ gtk_widget_set_visible (page->back_button, show_back_button);
+
+ g_object_notify_by_pspec (G_OBJECT (page), obj_props[PROP_SHOW_BACK_BUTTON]);
+}
+
+static void
+back_clicked_cb (GtkWidget *widget,
+ GsOsUpdatePage *page)
+{
+ g_signal_emit (page, signals[SIGNAL_BACK_CLICKED], 0);
+}
+
+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;
+ case PROP_SHOW_BACK_BUTTON:
+ g_value_set_boolean (value, gs_os_update_page_get_show_back_button (page));
+ break;
+ case PROP_TITLE:
+ g_value_set_string (value, adw_window_title_get_title (page->window_title));
+ 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;
+ case PROP_SHOW_BACK_BUTTON:
+ gs_os_update_page_set_show_back_button (page, g_value_get_boolean (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));
+}
+
+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);
+
+ /**
+ * GsOsUpdatePage:show-back-button
+ *
+ * Whether to show the back button.
+ *
+ * Since: 42.1
+ */
+ obj_props[PROP_SHOW_BACK_BUTTON] =
+ g_param_spec_boolean ("show-back-button", NULL, NULL,
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
+ /**
+ * GsOsUpdatePage:title
+ *
+ * Read-only window title.
+ *
+ * Since: 42
+ */
+ obj_props[PROP_TITLE] =
+ g_param_spec_string ("title", NULL, NULL,
+ NULL,
+ 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);
+
+ /**
+ * 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);
+
+ /**
+ * GsOsUpdatePage::back-clicked:
+ * @self: a #GsOsUpdatePage
+ *
+ * Emitted when the back button got activated and the #GsUpdateDialog
+ * containing this page is expected to go back.
+ *
+ * Since: 42.1
+ */
+ signals[SIGNAL_BACK_CLICKED] =
+ g_signal_new ("back-clicked",
+ 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-os-update-page.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, back_button);
+ gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, box);
+ gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, group);
+ gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, header_bar);
+ gtk_widget_class_bind_template_child (widget_class, GsOsUpdatePage, window_title);
+ gtk_widget_class_bind_template_callback (widget_class, back_clicked_cb);
+}
+
+/**
+ * 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..dbe4ce3
--- /dev/null
+++ b/src/gs-os-update-page.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 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkBox)
+
+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);
+gboolean gs_os_update_page_get_show_back_button
+ (GsOsUpdatePage *page);
+void gs_os_update_page_set_show_back_button
+ (GsOsUpdatePage *page,
+ gboolean show_back_button);
+
+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..a0ec36e
--- /dev/null
+++ b/src/gs-os-update-page.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsOsUpdatePage" parent="GtkBox">
+ <property name="orientation">vertical</property>
+
+ <child>
+ <object class="AdwHeaderBar" id="header_bar">
+ <property name="show_start_title_buttons">True</property>
+ <property name="show_end_title_buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle" id="window_title" />
+ </property>
+ <child type="start">
+ <object class="GtkButton" id="back_button">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="visible">False</property>
+ <signal name="clicked" handler="back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <accessibility>
+ <property name="label" translatable="yes">Go back</property>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup" id="group">
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="orientation">vertical</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-overview-page.c b/src/gs-overview-page.c
new file mode 100644
index 0000000..7a3d766
--- /dev/null
+++ b/src/gs-overview-page.c
@@ -0,0 +1,1050 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <adwaita.h>
+#include <glib/gi18n.h>
+#include <math.h>
+
+#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
+
+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;
+
+ GtkWidget *infobar_third_party;
+ GtkWidget *label_third_party;
+ GtkWidget *featured_carousel;
+ GtkWidget *box_overview;
+ GtkWidget *box_curated;
+ GtkWidget *box_recent;
+ GtkWidget *box_deployment_featured;
+ 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
+gs_overview_page_invalidate (GsOverviewPage *self)
+{
+ self->cache_valid = FALSE;
+}
+
+static void
+app_tile_clicked (GsAppTile *tile, gpointer data)
+{
+ GsOverviewPage *self = GS_OVERVIEW_PAGE (data);
+ GsApp *app;
+
+ app = gs_app_tile_get_app (tile);
+ 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) < N_TILES) {
+ 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) == N_TILES);
+
+ 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);
+ g_signal_connect (tile, "clicked",
+ G_CALLBACK (app_tile_clicked), self);
+ 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;
+ GtkWidget *child;
+ 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++) {
+ app = gs_app_list_index (list, i);
+ tile = gs_summary_tile_new (app);
+ g_signal_connect (tile, "clicked",
+ G_CALLBACK (app_tile_clicked), self);
+ child = gtk_flow_box_child_new ();
+ /* Manually creating the child is needed to avoid having it be
+ * focusable but non activatable, and then have the child
+ * focusable and activatable, which is annoying and confusing.
+ */
+ gtk_widget_set_can_focus (child, FALSE);
+ gtk_widget_show (child);
+ gtk_flow_box_child_set_child (GTK_FLOW_BOX_CHILD (child), tile);
+ gtk_flow_box_insert (GTK_FLOW_BOX (self->box_recent), child, -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);
+ g_signal_connect (tile, "clicked",
+ G_CALLBACK (app_tile_clicked), self);
+ 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);
+}
+
+static void
+category_tile_clicked (GsCategoryTile *tile, gpointer data)
+{
+ GsOverviewPage *self = GS_OVERVIEW_PAGE (data);
+ GsCategory *category;
+
+ category = gs_category_tile_get_category (tile);
+ gs_shell_show_category (self->shell, category);
+}
+
+typedef struct {
+ GsOverviewPage *page; /* (unowned) */
+ GsPluginJobListCategories *job; /* (owned) */
+} 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 void
+gs_overview_page_get_categories_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);
+ guint i;
+ GsCategory *cat;
+ GtkFlowBox *flowbox;
+ GtkWidget *tile;
+ guint added_cnt = 0;
+ g_autoptr(GError) error = NULL;
+ GPtrArray *list = NULL; /* (element-type GsCategory) */
+
+ 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);
+ goto out;
+ }
+
+ list = gs_plugin_job_list_categories_get_result_list (data->job);
+
+ 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);
+
+ /* 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 (i = 0; 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);
+ g_signal_connect (tile, "clicked",
+ G_CALLBACK (category_tile_clicked), self);
+
+ if (gs_category_get_icon_name (cat) != NULL)
+ flowbox = GTK_FLOW_BOX (self->flowbox_categories);
+ else
+ flowbox = GTK_FLOW_BOX (self->flowbox_iconless_categories);
+
+ gtk_flow_box_insert (flowbox, tile, -1);
+ gtk_widget_set_can_focus (gtk_widget_get_parent (tile), FALSE);
+ 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));
+ }
+
+out:
+ /* 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;
+
+ gs_overview_page_decrement_action_cnt (self);
+}
+
+static void
+refresh_third_party_repo (GsOverviewPage *self)
+{
+ gtk_widget_set_visible (self->infobar_third_party, self->third_party_needs_question);
+}
+
+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;
+ }
+
+ *out_label = g_key_file_get_locale_string (key_file, "Deployment Featured Apps", "Title", NULL, NULL);
+
+ if (*out_label == NULL || **out_label == '\0') {
+ g_clear_pointer (out_label, g_free);
+ return FALSE;
+ }
+
+ selector = g_key_file_get_string_list (key_file, "Deployment Featured Apps", "Selector", NULL, NULL);
+
+ /* Sanitize the content */
+ if (selector == NULL) {
+ g_clear_pointer (out_label, g_free);
+ 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) {
+ g_clear_pointer (out_label, g_free);
+ return FALSE;
+ }
+
+ g_ptr_array_add (array, NULL);
+
+ *out_deployment_featured = (gchar **) g_ptr_array_free (g_steal_pointer (&array), FALSE);
+
+ 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,
+ 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,
+ 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,
+ 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,
+ 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_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 (GtkInfoBar *info_bar,
+ gint response_id,
+ GsOverviewPage *self)
+{
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ if (response_id == GTK_RESPONSE_YES)
+ fedora_third_party_enable (self);
+ else
+ fedora_third_party_disable (self);
+
+ self->third_party_needs_question = FALSE;
+ refresh_third_party_repo (self);
+
+ 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_autofree gchar *text = NULL;
+ g_autofree gchar *link = NULL;
+
+ 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 ();
+ 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);
+
+ link = g_strdup_printf ("<a href=\"%s\">%s</a>",
+ "https://docs.fedoraproject.org/en-US/workstation-working-group/third-party-repos/",
+ /* 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." */
+ _("selected external sources"));
+ /* Translators: This is the third party repositories info bar. The %s is replaced with "selected external sources" link. */
+ text = g_strdup_printf (_("Provides access to additional software from %s. Some proprietary software is included."),
+ link);
+ gtk_label_set_markup (GTK_LABEL (self->label_third_party), text);
+
+ /* create info bar if not already dismissed in initial-setup */
+ refresh_third_party_repo (self);
+ reload_third_party_repo (self);
+ gtk_info_bar_add_button (GTK_INFO_BAR (self->infobar_third_party),
+ /* TRANSLATORS: button to turn on third party software repositories */
+ _("Enable"), GTK_RESPONSE_YES);
+ g_signal_connect (self->infobar_third_party, "response",
+ G_CALLBACK (third_party_response_cb), 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)
+{
+ 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;
+
+ 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);
+
+ 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, infobar_third_party);
+ gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, label_third_party);
+ gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, featured_carousel);
+ gtk_widget_class_bind_template_child (widget_class, GsOverviewPage, box_overview);
+ 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, 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);
+}
+
+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..717502b
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..54c9fe8
--- /dev/null
+++ b/src/gs-overview-page.ui
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsOverviewPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Overview page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack_overview">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">overview</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+
+ <child>
+ <object class="GtkInfoBar" id="infobar_third_party">
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="label_third_party_title">
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Enable Third Party Software Repositories?</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_third_party">
+ <property name="halign">start</property>
+ <property name="label">Provides access to additional software.</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_overview">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkViewport" id="viewport_overview">
+ <property name="scroll-to-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="AdwClamp">
+ <!-- We use the same sizes as the category page. -->
+ <property name="maximum-size">1000</property>
+ <property name="tightening-threshold">600</property>
+ <child>
+ <object class="GtkBox" id="box_overview">
+ <property name="halign">center</property>
+ <property name="hexpand">False</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">24</property>
+ <property name="margin-bottom">36</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="valign">start</property>
+ <property name="spacing">6</property>
+
+ <child>
+ <object class="GsFeaturedCarousel" id="featured_carousel">
+ <property name="height-request">318</property>
+ <property name="valign">start</property>
+ <signal name="app-clicked" handler="featured_carousel_app_clicked_cb"/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkFlowBox" id="flowbox_categories">
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <property name="row_spacing">14</property>
+ <property name="column_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="min_children_per_line">2</property>
+ <property name="max_children_per_line">3</property>
+ <property name="selection_mode">none</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="curated_heading">
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Translators: This is a heading for software which has been featured (&apos;picked&apos;) by the distribution.">Editor’s Choice</property>
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="box_curated">
+ <property name="homogeneous">True</property>
+ <property name="column-spacing">14</property>
+ <property name="row-spacing">14</property>
+ <property name="valign">start</property>
+ <accessibility>
+ <relation name="labelled-by">curated_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="recent_heading">
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Translators: This is a heading for software which has been recently released upstream.">New &amp; Updated</property>
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="box_recent">
+ <property name="homogeneous">True</property>
+ <property name="column-spacing">14</property>
+ <property name="row-spacing">14</property>
+ <property name="valign">start</property>
+ <property name="selection-mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">recent_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="deployment_featured_heading">
+ <property name="visible">False</property>
+ <property name="xalign">0</property>
+ <property name="label">Available for Deployment</property> <!-- placeholder, set in the code -->
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="box_deployment_featured">
+ <property name="visible">False</property>
+ <property name="row_spacing">14</property>
+ <property name="column_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="min_children_per_line">2</property>
+ <property name="max_children_per_line">3</property>
+ <property name="selection_mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">deployment_featured_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="iconless_categories_heading">
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="Translators: This is a heading for a list of categories.">Other Categories</property>
+ <property name="margin-top">21</property>
+ <property name="margin-bottom">6</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFlowBox" id="flowbox_iconless_categories">
+ <property name="row_spacing">14</property>
+ <property name="column_spacing">14</property>
+ <property name="homogeneous">True</property>
+ <property name="min_children_per_line">2</property>
+ <property name="max_children_per_line">3</property>
+ <property name="selection_mode">none</property>
+ <accessibility>
+ <relation name="labelled-by">iconless_categories_heading</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">no-results</property>
+ <property name="child">
+ <object class="AdwStatusPage" id="noresults_grid_overview">
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ <property name="title" translatable="yes">No Application Data Found</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-page.c b/src/gs-page.c
new file mode 100644
index 0000000..7a465be
--- /dev/null
+++ b/src/gs-page.c
@@ -0,0 +1,857 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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;
+ GtkWidget *button_install;
+ GsPluginAction action;
+ GsShellInteraction interaction;
+ gboolean propagate_error;
+} 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 != 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_update_app_response_close_cb (GtkDialog *dialog, gint response, gpointer user_data)
+{
+ gtk_window_destroy (GTK_WINDOW (dialog));
+}
+
+static void
+gs_page_show_update_message (GsPageHelper *helper, AsScreenshot *ss)
+{
+ GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
+ GPtrArray *images;
+ GtkWidget *dialog;
+ g_autofree gchar *escaped = NULL;
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (helper->page), GTK_TYPE_WINDOW)),
+ GTK_DIALOG_MODAL |
+ GTK_DIALOG_USE_HEADER_BAR,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ "%s", gs_app_get_name (helper->app));
+ escaped = g_markup_escape_text (as_screenshot_get_caption (ss), -1);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", escaped);
+
+ /* image is optional */
+ images = as_screenshot_get_images (ss);
+ if (images->len) {
+ GtkWidget *content_area;
+ 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);
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_box_append (GTK_BOX (content_area), ssimg);
+ }
+
+ /* handle this async */
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_page_update_app_response_close_cb), helper);
+ gs_shell_modal_dialog_present (priv->shell, GTK_WINDOW (dialog));
+}
+
+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_error (plugin_loader,
+ NULL,
+ helper->action,
+ helper->app,
+ helper->interaction == GS_SHELL_INTERACTION_FULL,
+ 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) &&
+ helper->action == GS_PLUGIN_ACTION_INSTALL &&
+ !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) {
+ g_warning ("failed to uninstall: %s", error->message);
+ return;
+ }
+
+ /* 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_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (page), GTK_TYPE_WINDOW)));
+ 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);
+ helper->interaction = interaction;
+ helper->propagate_error = TRUE;
+
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_REPOSITORY) {
+ helper->action = GS_PLUGIN_ACTION_INSTALL_REPO;
+ 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));
+ gs_plugin_job_set_propagate_error (plugin_job, helper->propagate_error);
+ } else {
+ helper->action = GS_PLUGIN_ACTION_INSTALL;
+ plugin_job = gs_plugin_job_newv (helper->action,
+ "interactive", (interaction == GS_SHELL_INTERACTION_FULL),
+ "propagate-error", helper->propagate_error,
+ "app", helper->app,
+ NULL);
+ }
+
+ gs_plugin_loader_job_process_async (priv->plugin_loader,
+ plugin_job,
+ helper->cancellable,
+ gs_page_app_installed_cb,
+ helper);
+}
+
+static void
+gs_page_update_app_response_cb (GtkDialog *dialog,
+ gint 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;
+
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (dialog));
+
+ /* not agreed */
+ if (response != GTK_RESPONSE_OK)
+ return;
+
+ g_debug ("update %s", gs_app_get_id (helper->app));
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
+ "interactive", TRUE,
+ "propagate-error", helper->propagate_error,
+ "app", helper->app,
+ NULL);
+ 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)
+{
+ gtk_widget_set_sensitive (helper->button_install,
+ !gs_app_has_quirk (helper->app,
+ GS_APP_QUIRK_NEEDS_USER_ACTION));
+}
+
+static void
+gs_page_needs_user_action (GsPageHelper *helper, AsScreenshot *ss)
+{
+ GtkWidget *content_area;
+ GtkWidget *dialog;
+ g_autoptr(SoupSession) soup_session = NULL;
+ GtkWidget *ssimg;
+ g_autofree gchar *escaped = NULL;
+ GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (helper->page), GTK_TYPE_WINDOW)),
+ GTK_DIALOG_MODAL |
+ GTK_DIALOG_USE_HEADER_BAR,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_CANCEL,
+ /* TRANSLATORS: this is a prompt message, and
+ * '%s' is an application summary, e.g. 'GNOME Clocks' */
+ _("Prepare %s"),
+ gs_app_get_name (helper->app));
+ escaped = g_markup_escape_text (as_screenshot_get_caption (ss), -1);
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ "%s", escaped);
+
+ /* this will be enabled when the device is in the right mode */
+ helper->button_install = gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: update the fw */
+ _("Install"),
+ GTK_RESPONSE_OK);
+ helper->notify_quirk_id =
+ g_signal_connect (helper->app, "notify::quirk",
+ G_CALLBACK (gs_page_notify_quirk_cb),
+ helper);
+ gtk_widget_set_sensitive (helper->button_install, FALSE);
+
+ /* 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);
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_box_append (GTK_BOX (content_area), ssimg);
+
+ /* handle this async */
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_page_update_app_response_cb), helper);
+ gs_shell_modal_dialog_present (priv->shell, GTK_WINDOW (dialog));
+}
+
+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;
+
+ /* non-firmware applications do not have to be prepared */
+ helper = g_slice_new0 (GsPageHelper);
+ helper->action = GS_PLUGIN_ACTION_UPDATE;
+ helper->app = g_object_ref (app);
+ helper->page = g_object_ref (page);
+ helper->cancellable = g_object_ref (cancellable);
+ helper->propagate_error = TRUE;
+
+ /* tell the user what they have to do */
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_FIRMWARE &&
+ gs_app_has_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION)) {
+ AsScreenshot *ss = gs_app_get_action_screenshot (app);
+ if (ss != NULL && as_screenshot_get_caption (ss) != NULL) {
+ gs_page_needs_user_action (helper, ss);
+ return;
+ }
+ }
+
+ /* generic fallback */
+ plugin_job = gs_plugin_job_newv (helper->action,
+ "interactive", TRUE,
+ "propagate-error", helper->propagate_error,
+ "app", app,
+ NULL);
+ gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job,
+ helper->cancellable,
+ gs_page_app_installed_cb,
+ helper);
+}
+
+static void
+gs_page_remove_app_response_cb (GtkDialog *dialog,
+ gint 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;
+
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (dialog));
+
+ /* not agreed */
+ if (response != GTK_RESPONSE_OK)
+ return;
+
+ g_debug ("uninstall %s", gs_app_get_id (helper->app));
+ if (gs_app_get_kind (helper->app) == AS_COMPONENT_KIND_REPOSITORY) {
+ helper->action = GS_PLUGIN_ACTION_REMOVE_REPO;
+ plugin_job = gs_plugin_job_manage_repository_new (helper->app,
+ GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_REMOVE |
+ GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_INTERACTIVE);
+ } else {
+ plugin_job = gs_plugin_job_newv (helper->action,
+ "interactive", TRUE,
+ "app", helper->app,
+ NULL);
+ }
+ gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job,
+ helper->cancellable,
+ gs_page_app_removed_cb,
+ helper);
+ g_steal_pointer (&helper);
+}
+
+void
+gs_page_remove_app (GsPage *page, GsApp *app, GCancellable *cancellable)
+{
+ GsPagePrivate *priv = gs_page_get_instance_private (page);
+ GsPageHelper *helper;
+ GtkWidget *dialog;
+ g_autofree gchar *message = NULL;
+ g_autofree gchar *title = NULL;
+ GtkWidget *remove_button;
+ GtkStyleContext *context;
+
+ /* Is the app actually removable? */
+ if (gs_app_has_quirk (app, GS_APP_QUIRK_COMPULSORY))
+ return;
+
+ /* pending install */
+ helper = g_slice_new0 (GsPageHelper);
+ helper->action = GS_PLUGIN_ACTION_REMOVE;
+ helper->app = g_object_ref (app);
+ helper->page = g_object_ref (page);
+ helper->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL;
+ if (gs_app_get_state (app) == GS_APP_STATE_QUEUED_FOR_INSTALL) {
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ /* 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));
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
+ "interactive", TRUE,
+ "app", app,
+ NULL);
+ 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);
+ 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 */
+ message = g_strdup_printf (_("All applications from %s will be "
+ "uninstalled, and you will have to "
+ "re-install the repository to use them again."),
+ gs_app_get_name (app));
+ break;
+ default:
+ /* TRANSLATORS: this is a prompt message, and '%s' is an
+ * application summary, e.g. 'GNOME Clocks' */
+ title = g_strdup_printf (_("Are you sure you want to uninstall %s?"),
+ gs_app_get_name (app));
+ /* TRANSLATORS: longer dialog text */
+ message = g_strdup_printf (_("%s will be uninstalled, and you will "
+ "have to install it to use it again."),
+ gs_app_get_name (app));
+ break;
+ }
+
+ /* ask for confirmation */
+ dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (page), GTK_TYPE_WINDOW)),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ "%s", title);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", message);
+
+ /* TRANSLATORS: this is button text to remove the application */
+ remove_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Uninstall"), GTK_RESPONSE_OK);
+ context = gtk_widget_get_style_context (remove_button);
+ gtk_style_context_add_class (context, "destructive-action");
+
+ /* handle this async */
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_page_remove_app_response_cb), helper);
+ gs_shell_modal_dialog_present (priv->shell, GTK_WINDOW (dialog));
+}
+
+static void
+gs_page_app_launched_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source);
+ g_autoptr(GError) error = NULL;
+ if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error)) {
+ g_warning ("failed to launch GsApp: %s", error->message);
+ 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_newv (GS_PLUGIN_ACTION_LAUNCH,
+ "interactive", TRUE,
+ "app", app,
+ NULL);
+ gs_plugin_loader_job_process_async (priv->plugin_loader, plugin_job,
+ cancellable,
+ gs_page_app_launched_cb,
+ NULL);
+}
+
+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_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));
+}
diff --git a/src/gs-page.h b/src/gs-page.h
new file mode 100644
index 0000000..a42034b
--- /dev/null
+++ b/src/gs-page.h
@@ -0,0 +1,74 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015-2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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);
+
+const gchar *gs_page_get_title (GsPage *page);
+guint gs_page_get_counter (GsPage *page);
+GtkAdjustment *gs_page_get_vadjustment (GsPage *page);
+
+G_END_DECLS
diff --git a/src/gs-prefs-dialog.c b/src/gs-prefs-dialog.c
new file mode 100644
index 0000000..df49aa0
--- /dev/null
+++ b/src/gs-prefs-dialog.c
@@ -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) 2018 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <glib/gi18n.h>
+
+struct _GsPrefsDialog
+{
+ AdwPreferencesWindow parent_instance;
+ GSettings *settings;
+
+ GCancellable *cancellable;
+ GsPluginLoader *plugin_loader;
+ GtkWidget *switch_updates;
+ GtkWidget *switch_updates_notify;
+ AdwActionRow *automatic_updates_row;
+ AdwActionRow *automatic_update_notifications_row;
+};
+
+G_DEFINE_TYPE (GsPrefsDialog, gs_prefs_dialog, ADW_TYPE_PREFERENCES_WINDOW)
+
+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->switch_updates_notify,
+ "active",
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (dialog->settings,
+ "download-updates",
+ dialog->switch_updates,
+ "active",
+ G_SETTINGS_BIND_DEFAULT);
+
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (dialog->automatic_updates_row), FALSE);
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (dialog->automatic_update_notifications_row), FALSE);
+#endif
+}
+
+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, switch_updates);
+ gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, switch_updates_notify);
+ gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, automatic_updates_row);
+ gtk_widget_class_bind_template_child (widget_class, GsPrefsDialog, automatic_update_notifications_row);
+}
+
+GtkWidget *
+gs_prefs_dialog_new (GtkWindow *parent, GsPluginLoader *plugin_loader)
+{
+ GsPrefsDialog *dialog;
+ dialog = g_object_new (GS_TYPE_PREFS_DIALOG,
+ "transient-for", parent,
+ 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..207ba26
--- /dev/null
+++ b/src/gs-prefs-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) 2018 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <gtk/gtk.h>
+
+#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, AdwPreferencesWindow)
+
+GtkWidget *gs_prefs_dialog_new (GtkWindow *parent,
+ 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..3fcb8c1
--- /dev/null
+++ b/src/gs-prefs-dialog.ui
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsPrefsDialog" parent="AdwPreferencesWindow">
+ <property name="title" translatable="yes">Update Preferences</property>
+ <property name="default_width">610</property>
+ <property name="default_height">300</property>
+ <property name="search_enabled">False</property>
+ <style>
+ <class name="update-preferences"/>
+ </style>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+ <property name="description" translatable="yes">To avoid charges and network caps, software updates are not automatically downloaded on mobile or metered connections.</property>
+ <child>
+ <object class="AdwActionRow" id="automatic_updates_row">
+ <property name="title" translatable="yes">Automatic Updates</property>
+ <property name="subtitle" translatable="yes">Downloads and installs software updates in the background, when possible.</property>
+ <property name="subtitle_lines">0</property>
+ <property name="activatable_widget">switch_updates</property>
+ <child>
+ <object class="GtkSwitch" id="switch_updates">
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwActionRow" id="automatic_update_notifications_row">
+ <property name="title" translatable="yes">Automatic Update Notifications</property>
+ <property name="subtitle" translatable="yes">Show notifications when updates have been automatically installed.</property>
+ <property name="subtitle_lines">0</property>
+ <property name="activatable_widget">switch_updates_notify</property>
+ <child>
+ <object class="GtkSwitch" id="switch_updates_notify">
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-progress-button.c b/src/gs-progress-button.c
new file mode 100644
index 0000000..13fb782
--- /dev/null
+++ b/src/gs-progress-button.c
@@ -0,0 +1,361 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-app.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 = ".install-progress {\n"
+ " background-size: 25%;\n"
+ " animation: install-progress-unknown-move infinite linear 2s;\n"
+ "}\n";
+ } else {
+ percentage = MIN (percentage, 100); /* No need to clamp an unsigned to 0, it produces errors. */
+ g_assert ((gsize) g_snprintf (tmp, sizeof (tmp), ".install-progress { background-size: %u%%; }", percentage) < sizeof (tmp));
+ css = tmp;
+ }
+
+ gtk_css_provider_load_from_data (button->css_provider, css, -1);
+}
+
+void
+gs_progress_button_set_show_progress (GsProgressButton *button, gboolean show_progress)
+{
+ GtkStyleContext *context;
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (button));
+ if (show_progress)
+ gtk_style_context_add_class (context, "install-progress");
+ else
+ gtk_style_context_remove_class (context, "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)
+{
+ GtkStyleContext *style;
+
+ 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;
+
+ style = gtk_widget_get_style_context (GTK_WIDGET (button));
+ if (show_icon) {
+ gtk_stack_set_visible_child (GTK_STACK (button->stack), button->image);
+ gtk_style_context_remove_class (style, "text-button");
+ gtk_style_context_add_class (style, "image-button");
+ } else {
+ gtk_stack_set_visible_child (GTK_STACK (button->stack), button->label);
+ gtk_style_context_remove_class (style, "image-button");
+ gtk_style_context_add_class (style, "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));
+
+ button->css_provider = gtk_css_provider_new ();
+ gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (button)),
+ GTK_STYLE_PROVIDER (button->css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+}
+
+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..a2d89cb
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+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..bd344d0
--- /dev/null
+++ b/src/gs-progress-button.ui
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GsProgressButton" parent="GtkButton">
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="hhomogeneous">False</property>
+ <property name="vhomogeneous">False</property>
+ <property name="interpolate-size">True</property>
+ <property name="transition-type">crossfade</property>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="child">
+ <object class="GtkLabel" id="label">
+ <property name="label" bind-source="GsProgressButton" bind-property="label" bind-flags="sync-create"/>
+ <property name="use-underline" bind-source="GsProgressButton" bind-property="use-underline" bind-flags="sync-create"/>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="child">
+ <object class="GtkImage" id="image">
+ <property name="icon-name" bind-source="GsProgressButton" bind-property="icon-name" bind-flags="sync-create"/>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-removal-dialog.c b/src/gs-removal-dialog.c
new file mode 100644
index 0000000..e26b702
--- /dev/null
+++ b/src/gs-removal-dialog.c
@@ -0,0 +1,154 @@
+/* -*- 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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gs-removal-dialog.h"
+#include "gs-utils.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+struct _GsRemovalDialog
+{
+ GtkDialog parent_instance;
+ GtkLabel *label;
+ GtkWidget *listbox;
+ GtkLabel *secondary_label;
+};
+
+G_DEFINE_TYPE (GsRemovalDialog, gs_removal_dialog, GTK_TYPE_DIALOG)
+
+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_show (widget);
+ gtk_widget_show (box);
+
+ 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 *secondary_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'. */
+ secondary_text = g_strdup_printf (_("Some of the currently installed software is not compatible with %s. "
+ "If you continue, the following will be automatically removed during the upgrade:"),
+ name_version);
+
+ gtk_widget_add_css_class (GTK_WIDGET (self->label), "title");
+ gtk_widget_show (GTK_WIDGET (self->secondary_label));
+ gtk_label_set_text (self->secondary_label, secondary_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
+gs_removal_dialog_init (GsRemovalDialog *self)
+{
+ GtkWidget *action_area;
+ GtkSettings *settings;
+ gboolean use_caret;
+
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+ action_area = gtk_dialog_get_content_area (GTK_DIALOG (self));
+ action_area = gtk_widget_get_next_sibling (action_area);
+ gtk_widget_set_halign (action_area, GTK_ALIGN_FILL);
+ gtk_box_set_homogeneous (GTK_BOX (action_area), TRUE);
+
+ settings = gtk_widget_get_settings (GTK_WIDGET (self));
+ g_object_get (settings, "gtk-keynav-use-caret", &use_caret, NULL);
+ gtk_label_set_selectable (self->label, use_caret);
+ gtk_label_set_selectable (self->secondary_label, use_caret);
+
+ 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, label);
+ gtk_widget_class_bind_template_child (widget_class, GsRemovalDialog, listbox);
+ gtk_widget_class_bind_template_child (widget_class, GsRemovalDialog, secondary_label);
+}
+
+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..b603ace
--- /dev/null
+++ b/src/gs-removal-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) 2016 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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, GtkDialog)
+
+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..0cff132
--- /dev/null
+++ b/src/gs-removal-dialog.ui
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GsRemovalDialog" parent="GtkDialog">
+ <property name="title" translatable="yes">Incompatible Software</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <child internal-child="headerbar">
+ <object class="GtkHeaderBar">
+ <property name="show-title-buttons">False</property>
+ </object>
+ </child>
+ <style>
+ <class name="message" />
+ </style>
+ <child type="action">
+ <object class="GtkButton" id="button_cancel">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child type="action">
+ <object class="GtkButton" id="button_continue">
+ <property name="label" translatable="yes">_Continue</property>
+ <property name="use_underline">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="accept" default="true">button_continue</action-widget>
+ <action-widget response="cancel">button_cancel</action-widget>
+ </action-widgets>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="orientation">vertical</property>
+ <property name="spacing">20</property>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="spacing">30</property>
+ <child>
+ <object class="GtkBox" id="message_area">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="hexpand">1</property>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="wrap">1</property>
+ <property name="width-chars">40</property>
+ <property name="max-width-chars">40</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="secondary_label">
+ <property name="visible">False</property>
+ <property name="margin-bottom">2</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="vexpand">1</property>
+ <property name="wrap">1</property>
+ <property name="width-chars">40</property>
+ <property name="max-width-chars">40</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can_focus">True</property>
+ <property name="min_content_height">160</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkListBox" id="listbox">
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list" />
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-repo-row.c b/src/gs-repo-row.c
new file mode 100644
index 0000000..0a3a3b9
--- /dev/null
+++ b/src/gs-repo-row.c
@@ -0,0 +1,463 @@
+/* -*- 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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <libsoup/soup.h>
+
+#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;
+} GsRepoRowPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsRepoRow, gs_repo_row, GTK_TYPE_LIST_BOX_ROW)
+
+enum {
+ SIGNAL_REMOVE_CLICKED,
+ SIGNAL_SWITCH_CLICKED,
+ SIGNAL_LAST
+};
+
+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:
+ 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_autoptr(GsRepoRow) row = (GsRepoRow *) user_data;
+ GsRepoRowPrivate *priv = gs_repo_row_get_instance_private (row);
+
+ priv->refresh_idle_id = 0;
+
+ refresh_ui (row);
+
+ 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);
+
+ if (priv->refresh_idle_id > 0)
+ return;
+ priv->refresh_idle_id = g_idle_add (refresh_idle, g_object_ref (row));
+}
+
+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 is used to construct the 'X applications
+ installed' sentence, describing a software repository. */
+ return g_strdup_printf (ngettext ("%u application installed",
+ "%u applications installed",
+ cnt_apps), cnt_apps);
+ }
+ if (cnt_apps == 0) {
+ /* TRANSLATORS: This string is used to construct the 'X add-ons
+ installed' sentence, describing a software repository. */
+ 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 applications
+ and y add-ons installed' sentence, describing a software repository.
+ The correct form here depends on the number of applications. */
+ apps_text = g_strdup_printf (ngettext ("%u application",
+ "%u applications",
+ cnt_apps), cnt_apps);
+ /* 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. */
+ 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 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. */
+ return g_strdup_printf (ngettext ("%s and %s installed",
+ "%s and %s installed",
+ cnt_apps + cnt_addon),
+ apps_text, addons_text);
+}
+
+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;
+ g_autofree gchar *comment = 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);
+ }
+ }
+
+ comment = get_repo_installed_text (repo);
+ tmp = gs_app_get_metadata_item (priv->repo, "GnomeSoftware::InstallationKind");
+ if (tmp != NULL && *tmp != '\0') {
+ gchar *cnt;
+
+ /* 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'. */
+ cnt = g_strdup_printf (C_("repo-row", "%s • %s"), comment, tmp);
+ g_clear_pointer (&comment, g_free);
+ comment = cnt;
+ }
+
+ gtk_label_set_label (GTK_LABEL (priv->comment_label), comment);
+
+ 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_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);
+ 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->dispose = gs_repo_row_dispose;
+
+ 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);
+}
diff --git a/src/gs-repo-row.h b/src/gs-repo-row.h
new file mode 100644
index 0000000..0cbbdc6
--- /dev/null
+++ b/src/gs-repo-row.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) 2015-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include "gnome-software-private.h"
+#include <gtk/gtk.h>
+
+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);
+
+G_END_DECLS
diff --git a/src/gs-repo-row.ui b/src/gs-repo-row.ui
new file mode 100644
index 0000000..cffd586
--- /dev/null
+++ b/src/gs-repo-row.ui
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsRepoRow" parent="GtkListBoxRow">
+ <child>
+ <object class="GtkGrid">
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hostname_label">
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="comment_label">
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="lines">2</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="remove_button">
+ <property name="visible">False</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">False</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSwitch" id="disable_switch">
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">False</property>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">3</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-repos-dialog.c b/src/gs-repos-dialog.c
new file mode 100644
index 0000000..81a1471
--- /dev/null
+++ b/src/gs-repos-dialog.c
@@ -0,0 +1,766 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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 <glib/gi18n.h>
+
+struct _GsReposDialog
+{
+ AdwWindow 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 *spinner;
+ GtkWidget *stack;
+};
+
+G_DEFINE_TYPE (GsReposDialog, gs_repos_dialog, ADW_TYPE_WINDOW)
+
+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_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,
+ dialog->cancellable,
+ repo_enabled_cb,
+ install_data);
+}
+
+static void
+enable_repo_response_cb (GtkDialog *confirm_dialog,
+ gint response,
+ gpointer user_data)
+{
+ g_autoptr(InstallRemoveData) install_data = (InstallRemoveData *) user_data;
+
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (confirm_dialog));
+
+ /* not agreed */
+ if (response != GTK_RESPONSE_OK) {
+ 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) {
+ GtkWidget *confirm_dialog;
+ g_autofree gchar *message = NULL;
+ g_autoptr(GError) error = NULL;
+
+ /* convert from AppStream markup */
+ message = as_markup_convert_simple (gs_app_get_agreement (repo), &error);
+ 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 */
+ confirm_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ /* TRANSLATORS: window title */
+ "%s", _("Enable Third-Party Software Repository?"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (confirm_dialog),
+ "%s", message);
+
+ /* TRANSLATORS: button to accept the agreement */
+ gtk_dialog_add_button (GTK_DIALOG (confirm_dialog), _("Enable"),
+ GTK_RESPONSE_OK);
+
+ /* handle this async */
+ g_signal_connect (confirm_dialog, "response",
+ G_CALLBACK (enable_repo_response_cb),
+ g_steal_pointer (&install_data));
+
+ gtk_window_set_modal (GTK_WINDOW (confirm_dialog), TRUE);
+ gtk_window_present (GTK_WINDOW (confirm_dialog));
+ return;
+ }
+
+ /* no prompt required */
+ _enable_repo (g_steal_pointer (&install_data));
+}
+
+static void
+remove_repo_response_cb (GtkDialog *confirm_dialog,
+ gint response,
+ gpointer user_data)
+{
+ g_autoptr(InstallRemoveData) remove_data = (InstallRemoveData *) user_data;
+ GsReposDialog *dialog = remove_data->dialog;
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (confirm_dialog));
+
+ /* not agreed */
+ if (response != GTK_RESPONSE_OK) {
+ g_autoptr(GsRepoRow) row = g_weak_ref_get (&remove_data->row_weakref);
+ if (row)
+ gs_repo_row_unmark_busy (row);
+ return;
+ }
+
+ 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,
+ dialog->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;
+ GtkWidget *confirm_dialog;
+ g_autofree gchar *message = NULL;
+ GtkWidget *button;
+ GtkStyleContext *context;
+
+ 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 = gtk_message_dialog_new (GTK_WINDOW (dialog),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ "%s",
+ operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE ? _("Disable Repository?") : _("Remove Repository?"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (confirm_dialog),
+ "%s", message);
+
+ if (operation == GS_PLUGIN_MANAGE_REPOSITORY_FLAGS_DISABLE) {
+ /* TRANSLATORS: this is button text to disable a repo */
+ button = gtk_dialog_add_button (GTK_DIALOG (confirm_dialog), _("_Disable"), GTK_RESPONSE_OK);
+ } else {
+ /* TRANSLATORS: this is button text to remove a repo */
+ button = gtk_dialog_add_button (GTK_DIALOG (confirm_dialog), _("_Remove"), GTK_RESPONSE_OK);
+ }
+ context = gtk_widget_get_style_context (button);
+ gtk_style_context_add_class (context, "destructive-action");
+
+ /* handle this async */
+ g_signal_connect (confirm_dialog, "response",
+ G_CALLBACK (remove_repo_response_cb), remove_data);
+
+ gtk_window_set_modal (GTK_WINDOW (confirm_dialog), TRUE);
+ gtk_window_present (GTK_WINDOW (confirm_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,
+ gtk_switch_get_active (GTK_SWITCH (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_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);
+ gtk_widget_show (section);
+ }
+
+ 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);
+}
+
+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(GSList) other_repos = NULL;
+ g_autoptr(GList) sections = NULL;
+ 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);
+ }
+
+ /* stop the spinner */
+ gtk_spinner_stop (GTK_SPINNER (dialog->spinner));
+
+ /* 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;
+ }
+
+ /* 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);
+ }
+
+ 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;
+
+ widget = gtk_switch_new ();
+ gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
+ gtk_switch_set_active (GTK_SWITCH (widget), dialog->third_party_enabled);
+ g_signal_connect_object (widget, "notify::active",
+ G_CALLBACK (fedora_third_party_repos_switch_notify_cb), dialog, 0);
+ gtk_widget_show (widget);
+
+ row = adw_action_row_new ();
+#if ADW_CHECK_VERSION(1,2,0)
+ adw_preferences_row_set_use_markup (ADW_PREFERENCES_ROW (row), FALSE);
+#endif
+ 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."));
+ adw_action_row_set_activatable_widget (ADW_ACTION_ROW (row), widget);
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row), widget);
+ gtk_widget_show (row);
+
+ anchor = g_strdup_printf ("<a href=\"%s\">%s</a>",
+ "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_show (widget);
+ 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 (&section_id), widget);
+
+ section = GS_REPOS_SECTION (gs_repos_section_new (TRUE));
+ gs_repos_section_set_sort_key (section, "900");
+ g_signal_connect_object (section, "switch-clicked",
+ G_CALLBACK (repo_section_switch_clicked_cb), dialog, 0);
+ gtk_widget_show (GTK_WIDGET (section));
+
+ for (GSList *link = other_repos; link; link = g_slist_next (link)) {
+ GsApp *repo = link->data;
+ gs_repos_section_add_repo (section, 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 (&section_id), section);
+
+ adw_preferences_page_add (ADW_PREFERENCES_PAGE (dialog->content_page),
+ ADW_PREFERENCES_GROUP (section));
+ }
+}
+
+static void
+reload_sources (GsReposDialog *dialog)
+{
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ /* get the list of non-core software repositories */
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_SOURCES,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_RELATED |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_HOSTNAME |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE,
+ "dedupe-flags", GS_APP_LIST_FILTER_FLAG_NONE,
+ NULL);
+ 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;
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ gtk_widget_init_template (GTK_WIDGET (dialog));
+
+ dialog->third_party = gs_fedora_third_party_new ();
+ 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_strdup_printf (_("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, spinner);
+ gtk_widget_class_bind_template_child (widget_class, GsReposDialog, stack);
+
+ gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL);
+}
+
+GtkWidget *
+gs_repos_dialog_new (GtkWindow *parent, GsPluginLoader *plugin_loader)
+{
+ GsReposDialog *dialog;
+
+ dialog = g_object_new (GS_TYPE_REPOS_DIALOG,
+ "transient-for", parent,
+ "modal", TRUE,
+ NULL);
+ set_plugin_loader (dialog, plugin_loader);
+ gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "waiting");
+ gtk_spinner_start (GTK_SPINNER (dialog->spinner));
+ 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..c7b4e75
--- /dev/null
+++ b/src/gs-repos-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) 2013 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <gtk/gtk.h>
+
+#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, AdwWindow)
+
+GtkWidget *gs_repos_dialog_new (GtkWindow *parent,
+ 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..c28fca0
--- /dev/null
+++ b/src/gs-repos-dialog.ui
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsReposDialog" parent="AdwWindow">
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="icon_name">dialog-information</property>
+ <property name="title" translatable="yes">Software Repositories</property>
+ <property name="default-width">640</property>
+ <property name="default-height">576</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="width-request">360</property>
+ <child>
+ <object class="AdwHeaderBar">
+ <property name="show_start_title_buttons">True</property>
+ <property name="show_end_title_buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle">
+ <property name="title" bind-source="GsReposDialog" bind-property="title" bind-flags="sync-create"/>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="vexpand">True</property>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">waiting</property>
+ <property name="child">
+ <object class="GtkSpinner" id="spinner">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">empty</property>
+ <property name="child">
+ <object class="AdwStatusPage" id="status_empty">
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ <property name="title" translatable="yes">No Repositories</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">sources</property>
+ <property name="child">
+ <object class="AdwPreferencesPage" id="content_page">
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-repos-section.c b/src/gs-repos-section.c
new file mode 100644
index 0000000..3e5d684
--- /dev/null
+++ b/src/gs-repos-section.c
@@ -0,0 +1,201 @@
+/* -*- 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 <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <gio/gio.h>
+
+#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;
+};
+
+G_DEFINE_TYPE (GsReposSection, gs_repos_section, ADW_TYPE_PREFERENCES_GROUP)
+
+enum {
+ SIGNAL_REMOVE_CLICKED,
+ SIGNAL_SWITCH_CLICKED,
+ SIGNAL_LAST
+};
+
+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_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->finalize = gs_repos_section_finalize;
+
+ 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)
+{
+ GtkStyleContext *style_context;
+
+ 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);
+
+ style_context = gtk_widget_get_style_context (GTK_WIDGET (self->list));
+ gtk_style_context_add_class (style_context, "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_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_show (row);
+}
+
+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);
+ }
+}
diff --git a/src/gs-repos-section.h b/src/gs-repos-section.h
new file mode 100644
index 0000000..e26189f
--- /dev/null
+++ b/src/gs-repos-section.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 Red Hat <www.redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <gtk/gtk.h>
+
+#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);
+
+G_END_DECLS
diff --git a/src/gs-restarter.c b/src/gs-restarter.c
new file mode 100644
index 0000000..f4c0b47
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <gio/gio.h>
+#include <stdlib.h>
+
+#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..8e65449
--- /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+
+ */
+
+#include "config.h"
+
+#include <math.h>
+
+#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_style_context_get_color (gtk_widget_get_style_context (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..7fab0b3
--- /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+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+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..178bef5
--- /dev/null
+++ b/src/gs-review-dialog.c
@@ -0,0 +1,215 @@
+/* -*- 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+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#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
+{
+ GtkDialog parent_instance;
+
+ GtkWidget *star;
+ GtkWidget *label_rating_desc;
+ GtkWidget *summary_entry;
+ GtkWidget *post_button;
+ GtkWidget *text_view;
+ guint timer_id;
+};
+
+G_DEFINE_TYPE (GsReviewDialog, gs_review_dialog, GTK_TYPE_DIALOG)
+
+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 application */
+ msg = _("Hate it");
+ } else if (perc == 40) {
+ /* TRANSLATORS: lighthearted star rating description;
+ * Not a great application */
+ msg = _("Don’t like it");
+ } else if (perc == 60) {
+ /* TRANSLATORS: lighthearted star rating description;
+ * A fairly-good application */
+ msg = _("It’s OK");
+ } else if (perc == 80) {
+ /* TRANSLATORS: lighthearted star rating description;
+ * A good application */
+ msg = _("Like it");
+ } else if (perc == 100) {
+ /* TRANSLATORS: lighthearted star rating description;
+ * A really awesome application */
+ msg = _("Love it");
+ } else {
+ /* just reserve space */
+ msg = "";
+ }
+ gtk_label_set_label (GTK_LABEL (dialog->label_rating_desc), msg);
+}
+
+static void
+gs_review_dialog_changed_cb (GsReviewDialog *dialog)
+{
+ GtkTextBuffer *buffer;
+ gboolean all_okay = TRUE;
+ const gchar *msg = NULL;
+ glong summary_length;
+
+ /* update review text */
+ gs_review_dialog_update_review_comment (dialog);
+
+ /* 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");
+ all_okay = FALSE;
+ } 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");
+ all_okay = FALSE;
+ } else if (summary_length < SUMMARY_LENGTH_MIN) {
+ /* TRANSLATORS: the review is not acceptable */
+ msg = _("The summary is too short");
+ all_okay = FALSE;
+ } else if (summary_length > SUMMARY_LENGTH_MAX) {
+ /* TRANSLATORS: the review is not acceptable */
+ msg = _("The summary is too long");
+ all_okay = FALSE;
+ } else if (gtk_text_buffer_get_char_count (buffer) < DESCRIPTION_LENGTH_MIN) {
+ /* TRANSLATORS: the review is not acceptable */
+ msg = _("The description is too short");
+ all_okay = FALSE;
+ } else if (gtk_text_buffer_get_char_count (buffer) > DESCRIPTION_LENGTH_MAX) {
+ /* TRANSLATORS: the review is not acceptable */
+ msg = _("The description is too long");
+ all_okay = FALSE;
+ }
+
+ /* tell the user what's happening */
+ gtk_widget_set_tooltip_text (dialog->post_button, msg);
+
+ /* can the user submit this? */
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, all_okay);
+}
+
+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_init (GsReviewDialog *dialog)
+{
+ GtkTextBuffer *buffer;
+ gtk_widget_init_template (GTK_WIDGET (dialog));
+
+ /* require the user to spend at least 30 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);
+
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
+}
+
+static void
+gs_review_row_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_row_dispose;
+
+ 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, 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, text_view);
+ 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,
+ "use-header-bar", TRUE,
+ NULL));
+}
diff --git a/src/gs-review-dialog.h b/src/gs-review-dialog.h
new file mode 100644
index 0000000..33d9992
--- /dev/null
+++ b/src/gs-review-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 Canonical Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_REVIEW_DIALOG (gs_review_dialog_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsReviewDialog, gs_review_dialog, GS, REVIEW_DIALOG, GtkDialog)
+
+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);
+
+G_END_DECLS
diff --git a/src/gs-review-dialog.ui b/src/gs-review-dialog.ui
new file mode 100644
index 0000000..4ca28fa
--- /dev/null
+++ b/src/gs-review-dialog.ui
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsReviewDialog" parent="GtkDialog">
+ <action-widgets>
+ <action-widget response="cancel">cancel_button</action-widget>
+ <action-widget response="ok" default="true">post_button</action-widget>
+ </action-widgets>
+ <property name="title" translatable="yes" comments="Translators: Title of the dialog box where the users can write and publish their opinions about the apps.">Post Review</property>
+ <property name="modal">True</property>
+ <property name="default_width">600</property>
+ <property name="default_height">300</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="use_header_bar">1</property>
+ <child type="action">
+ <object class="GtkButton" id="cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child type="action">
+ <object class="GtkButton" id="post_button">
+ <property name="label" translatable="yes" comments="Translators: A button to publish the user&apos;s opinion about the app.">_Post</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <property name="sensitive">False</property>
+ </object>
+ </child>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="dialog-vbox">
+ <property name="margin_start">40</property>
+ <property name="margin_end">40</property>
+ <property name="margin_top">25</property>
+ <property name="margin_bottom">25</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">9</property>
+ <child internal-child="action_area">
+ <object class="GtkBox" id="dialog-action_area1">
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="orientation">vertical</property>
+ <property name="spacing">20</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="label" translatable="yes">Rating</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarWidget" id="star">
+ <property name="halign">center</property>
+ <property name="icon-size">32</property>
+ <property name="interactive">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_rating_desc">
+ <property name="height_request">30</property>
+ <property name="label"></property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="label" translatable="yes">Summary</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="label" translatable="yes">Give a short summary of your review, for example: “Great app, would recommend”.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="summary_entry">
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="label" translatable="yes" context="app review" comments="Translators: This is where the users enter their opinions about the apps.">Review</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="label" translatable="yes">What do you think of the app? Try to give reasons for your views.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="text_view_scroll">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkTextView" id="text_view">
+ <property name="can_focus">True</property>
+ <property name="height-request">120</property>
+ <property name="wrap-mode">word-char</property>
+ <style>
+ <class name="review-textbox"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="label" translatable="yes">Find what data is sent in our &lt;a href="https://odrs.gnome.org/privacy"&gt;privacy policy&lt;/a&gt;. The full name attached to your account will be shown publicly.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <property name="use-markup">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup" id="sizegroup_folder_buttons">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="cancel_button"/>
+ <widget name="post_button"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-review-histogram.c b/src/gs-review-histogram.c
new file mode 100644
index 0000000..0b74034
--- /dev/null
+++ b/src/gs-review-histogram.c
@@ -0,0 +1,135 @@
+/* -*- 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+
+ */
+
+#include "config.h"
+
+#include <math.h>
+
+#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)
+{
+ 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..0e9dafc
--- /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+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+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..b6dda39
--- /dev/null
+++ b/src/gs-review-histogram.ui
@@ -0,0 +1,410 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsReviewHistogram" parent="GtkWidget">
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">6</property>
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkLabel" id="label_value">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">0</property>
+ <attributes>
+ <attribute name="scale" value="5.0"/>
+ <attribute name="weight" value="light"/>
+ <attribute name="line-height" value="0.75"/>
+ </attributes>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="value_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="margin-start">6</property>
+ <property name="margin-top">8</property>
+ <child>
+ <object class="GtkBox" id="star_value_box">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="reviewstarvalue"/>
+ </style>
+ <child>
+ <object class="GsStarImage" id="star_value_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">24</property>
+ <property name="width-request">24</property>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star_value_2">
+ <property name="sensitive">False</property>
+ <property name="height-request">24</property>
+ <property name="width-request">24</property>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star_value_3">
+ <property name="sensitive">False</property>
+ <property name="height-request">24</property>
+ <property name="width-request">24</property>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star_value_4">
+ <property name="sensitive">False</property>
+ <property name="height-request">24</property>
+ <property name="width-request">24</property>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star_value_5">
+ <property name="sensitive">False</property>
+ <property name="height-request">24</property>
+ <property name="width-request">24</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_n_stars">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label" translatable="yes">out of 5 stars</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid2">
+ <property name="row-spacing">2</property>
+ <property name="column-spacing">2</property>
+ <style>
+ <class name="review-histogram"/>
+ </style>
+ <child>
+ <object class="GsReviewBar" id="bar5">
+ <property name="margin-end">5</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">true</property>
+ <property name="valign">center</property>
+ <property name="height-request">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star5_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star5_2">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star5_3">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">3</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star5_4">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">4</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star5_5">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">5</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsReviewBar" id="bar4">
+ <property name="margin-end">5</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">true</property>
+ <property name="valign">center</property>
+ <property name="height-request">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star4_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star4_2">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star4_3">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">3</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star4_4">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">4</property>
+ <property name="row">1</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsReviewBar" id="bar3">
+ <property name="margin-end">5</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">true</property>
+ <property name="valign">center</property>
+ <property name="height-request">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star3_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star3_2">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star3_3">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">3</property>
+ <property name="row">2</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsReviewBar" id="bar2">
+ <property name="margin-end">5</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">true</property>
+ <property name="valign">center</property>
+ <property name="height-request">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star2_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star2_2">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">3</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsReviewBar" id="bar1">
+ <property name="margin-end">5</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">true</property>
+ <property name="valign">center</property>
+ <property name="height-request">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GsStarImage" id="star1_1">
+ <property name="sensitive">False</property>
+ <property name="height-request">10</property>
+ <property name="width-request">10</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">4</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ <property name="column-span">2</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_total">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="label">0</property>
+ <property name="margin-top">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ <property name="column-span">2</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-review-row.c b/src/gs-review-row.c
new file mode 100644
index 0000000..9afb484
--- /dev/null
+++ b/src/gs-review-row.c
@@ -0,0 +1,323 @@
+/* -*- 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+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "gs-review-row.h"
+#include "gs-star-widget.h"
+
+typedef struct
+{
+ AsReview *review;
+ gboolean network_available;
+ guint64 actions;
+ GtkWidget *stars;
+ GtkWidget *summary_label;
+ GtkWidget *author_label;
+ GtkWidget *date_label;
+ GtkWidget *text_label;
+ GtkWidget *button_yes;
+ GtkWidget *button_no;
+ GtkWidget *button_dismiss;
+ 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_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 |
+ 1 << GS_REVIEW_ACTION_DISMISS)) == 0) {
+ gtk_widget_set_visible (priv->box_voting, FALSE);
+ } else {
+ gtk_widget_set_visible (priv->box_voting, TRUE);
+ gtk_widget_set_visible (priv->button_yes,
+ priv->actions & 1 << GS_REVIEW_ACTION_UPVOTE);
+ gtk_widget_set_visible (priv->button_no,
+ priv->actions & 1 << GS_REVIEW_ACTION_DOWNVOTE);
+ gtk_widget_set_visible (priv->button_dismiss,
+ priv->actions & 1 << GS_REVIEW_ACTION_DISMISS);
+ }
+ 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);
+
+ /* mark insensitive if no network */
+ if (priv->network_available) {
+ gtk_widget_set_sensitive (priv->button_yes, TRUE);
+ gtk_widget_set_sensitive (priv->button_no, TRUE);
+ gtk_widget_set_sensitive (priv->button_remove, TRUE);
+ gtk_widget_set_sensitive (priv->button_report, TRUE);
+ } else {
+ gtk_widget_set_sensitive (priv->button_yes, FALSE);
+ gtk_widget_set_sensitive (priv->button_no, FALSE);
+ gtk_widget_set_sensitive (priv->button_remove, FALSE);
+ gtk_widget_set_sensitive (priv->button_report, FALSE);
+ }
+}
+
+void
+gs_review_row_set_network_available (GsReviewRow *review_row, gboolean network_available)
+{
+ GsReviewRowPrivate *priv = gs_review_row_get_instance_private (review_row);
+ priv->network_available = network_available;
+ 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->network_available = TRUE;
+ 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_yes);
+ gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_no);
+ gtk_widget_class_bind_template_child_private (widget_class, GsReviewRow, button_dismiss);
+ 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 (GtkDialog *dialog, gint response_id, GsReviewRow *row)
+{
+ if (response_id == GTK_RESPONSE_YES) {
+ g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0,
+ GS_REVIEW_ACTION_REPORT);
+ }
+ gtk_window_destroy (GTK_WINDOW (dialog));
+}
+
+static void
+gs_review_row_button_clicked_report_cb (GtkButton *button, GsReviewRow *row)
+{
+ GtkWidget *dialog;
+ GtkRoot *root;
+ GtkWidget *widget;
+ 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."));
+
+ root = gtk_widget_get_root (GTK_WIDGET (button));
+ dialog = gtk_message_dialog_new (GTK_WINDOW (root),
+ GTK_DIALOG_MODAL |
+ GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_USE_HEADER_BAR,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ "%s",
+ /* TRANSLATORS: window title when
+ * reporting a user-submitted review
+ * for moderation */
+ _("Report Review?"));
+ widget = gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: button text when
+ * sending a review for moderation */
+ _("Report"),
+ GTK_RESPONSE_YES);
+ gtk_style_context_add_class (gtk_widget_get_style_context (widget),
+ "destructive-action");
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", str->str);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_review_row_confirm_cb), row);
+ gtk_window_present (GTK_WINDOW (dialog));
+}
+
+static void
+gs_review_row_button_clicked_dismiss_cb (GtkButton *button, GsReviewRow *row)
+{
+ g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0,
+ GS_REVIEW_ACTION_DISMISS);
+}
+
+static void
+gs_review_row_button_clicked_remove_cb (GtkButton *button, GsReviewRow *row)
+{
+ g_signal_emit (row, signals[SIGNAL_BUTTON_CLICKED], 0,
+ GS_REVIEW_ACTION_REMOVE);
+}
+
+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);
+}
+
+/**
+ * gs_review_row_new:
+ * @review: The review to show
+ *
+ * Create a widget suitable for showing an application 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::state",
+ G_CALLBACK (gs_review_row_notify_props_changed_cb),
+ row, 0);
+ g_signal_connect_object (priv->button_yes, "clicked",
+ G_CALLBACK (gs_review_row_button_clicked_upvote_cb),
+ row, 0);
+ g_signal_connect_object (priv->button_no, "clicked",
+ G_CALLBACK (gs_review_row_button_clicked_downvote_cb),
+ row, 0);
+ g_signal_connect_object (priv->button_dismiss, "clicked",
+ G_CALLBACK (gs_review_row_button_clicked_dismiss_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..48139ce
--- /dev/null
+++ b/src/gs-review-row.h
@@ -0,0 +1,56 @@
+/* -*- 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+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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_DISMISS: Dismiss (ignore) the review when moderating.
+ * @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_DISMISS,
+ 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_set_network_available (GsReviewRow *review_row,
+ gboolean network_available);
+
+G_END_DECLS
diff --git a/src/gs-review-row.ui b/src/gs-review-row.ui
new file mode 100644
index 0000000..e0d1aca
--- /dev/null
+++ b/src/gs-review-row.ui
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsReviewRow" parent="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <style>
+ <class name="review-row"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="spacing">10</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GsStarWidget" id="stars">
+ <property name="halign">start</property>
+ <property name="sensitive">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary_label">
+ <property name="halign">start</property>
+ <property name="label">Steep learning curve, but worth it</property>
+ <property name="ellipsize">end</property>
+ <property name="hexpand">True</property>
+ <property name="selectable">True</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="date_label">
+ <property name="halign">end</property>
+ <property name="label">3 January 2016</property>
+ <property name="hexpand">True</property>
+ <property name="selectable">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="author_label">
+ <property name="halign">start</property>
+ <property name="label">Angela Avery</property>
+ <property name="ellipsize">end</property>
+ <property name="selectable">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="text_label">
+ <property name="halign">start</property>
+ <property name="margin_top">10</property>
+ <property name="margin_bottom">8</property>
+ <property name="label">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.</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">80</property>
+ <property name="xalign">0</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="selectable">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="spacing">9</property>
+ <child>
+ <object class="GtkBox" id="box_voting">
+ <property name="visible">False</property>
+ <property name="spacing">9</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes" comments="Translators: Users can express their opinions about other users&apos; opinions about the apps.">Was this review useful to you?</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_vote_buttons">
+ <property name="spacing">0</property>
+ <style>
+ <class name="vote-buttons"/>
+ </style>
+ <child>
+ <object class="GtkButton" id="button_yes">
+ <property name="label" translatable="yes">Yes</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="has-frame">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_no">
+ <property name="label" translatable="yes">No</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="has-frame">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_dismiss">
+ <property name="label" translatable="yes" comments="Translators: Button text for indifference, only used when moderating">Meh</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="has-frame">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_report">
+ <property name="label" translatable="yes">Report…</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="has-frame">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove">
+ <property name="label" translatable="yes">Remove…</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="has-frame">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ </template>
+
+ <object class="GtkSizeGroup" id="action_sizegroup">
+ <widgets>
+ <widget name="button_report"/>
+ <widget name="button_remove"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="useful_sizegroup">
+ <widgets>
+ <widget name="button_yes"/>
+ <widget name="button_no"/>
+ </widgets>
+ </object>
+
+</interface>
diff --git a/src/gs-safety-context-dialog.c b/src/gs-safety-context-dialog.c
new file mode 100644
index 0000000..ef6c054
--- /dev/null
+++ b/src/gs-safety-context-dialog.c
@@ -0,0 +1,651 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#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;
+
+ GtkLabel *license_label;
+ GBinding *license_label_binding; /* (owned) (nullable) */
+ GtkLabel *source_label;
+ GBinding *source_label_binding; /* (owned) (nullable) */
+ GtkLabel *sdk_label;
+ GtkImage *sdk_eol_image;
+ GtkWidget *sdk_row;
+};
+
+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_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_UNKNOWN;
+ GtkStyleContext *context;
+ GsContextDialogRowImportance chosen_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 application 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 (perm_flags == GS_APP_PERMISSIONS_FLAGS_UNKNOWN) {
+ add_permission_row (self->permissions_list, &chosen_rating,
+ !gs_app_has_quirk (self->app, GS_APP_QUIRK_PROVENANCE),
+ GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING,
+ "channel-insecure-symbolic",
+ _("Provided by a third party"),
+ _("Check that you trust the vendor, as the application isn’t sandboxed"),
+ "channel-secure-symbolic",
+ _("Reviewed by your distribution"),
+ _("Application isn’t sandboxed but the distribution has checked that it is not malicious"));
+ } 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,
+ (perm_flags & GS_APP_PERMISSIONS_FLAGS_NONE) != 0 &&
+ filesystem_read == NULL && filesystem_full == NULL,
+ GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT,
+ "folder-documents-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_NEUTRAL,
+ "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_IMPORTANT,
+ "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. */
+ _("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 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_X11) != 0,
+ GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT,
+ "desktop-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_IMPORTANT,
+ "dialog-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,
+ "preferences-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_IMPORTANT,
+ "folder-documents-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_IMPORTANT,
+ "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_IMPORTANT,
+ "folder-documents-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_IMPORTANT,
+ "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-documents-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-documents-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-documents-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);
+ }
+
+ /* 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. */
+ add_permission_row (self->permissions_list, &chosen_rating,
+ !gs_app_get_license_is_free (self->app),
+ GS_CONTEXT_DIALOG_ROW_IMPORTANCE_WARNING,
+ "dialog-warning-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"),
+ "app-installed-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"));
+
+ 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-installed-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_IMPORTANT,
+ "dialog-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);
+
+ /* Update the UI. */
+ switch (chosen_rating) {
+ case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_UNIMPORTANT:
+ icon_name = "safety-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_WARNING:
+ icon_name = "dialog-question-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 = "yellow";
+ break;
+ case GS_CONTEXT_DIALOG_ROW_IMPORTANCE_IMPORTANT:
+ icon_name = "dialog-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);
+
+ context = gtk_widget_get_style_context (self->lozenge);
+
+ gtk_style_context_remove_class (context, "green");
+ gtk_style_context_remove_class (context, "yellow");
+ gtk_style_context_remove_class (context, "red");
+
+ gtk_style_context_add_class (context, 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) {
+ GtkStyleContext *context;
+ 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));
+ }
+
+ gtk_label_set_label (self->sdk_label, label);
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (self->sdk_label));
+
+ if (is_eol) {
+ gtk_style_context_add_class (context, "eol-red");
+ gtk_style_context_remove_class (context, "dim-label");
+ } else {
+ gtk_style_context_add_class (context, "dim-label");
+ gtk_style_context_remove_class (context, "eol-red");
+ }
+
+ gtk_widget_set_visible (GTK_WIDGET (self->sdk_eol_image), 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 void
+gs_safety_context_dialog_init (GsSafetyContextDialog *self)
+{
+ 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_label);
+ gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, source_label);
+ gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, sdk_label);
+ gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, sdk_eol_image);
+ gtk_widget_class_bind_template_child (widget_class, GsSafetyContextDialog, sdk_row);
+}
+
+/**
+ * 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) {
+ 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 (self->app, "license", self->license_label, "label", G_BINDING_SYNC_CREATE);
+ self->source_label_binding = g_object_bind_property (self->app, "origin-ui", self->source_label, "label", G_BINDING_SYNC_CREATE);
+ }
+
+ /* 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..f37e277
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..4e129ca
--- /dev/null
+++ b/src/gs-safety-context-dialog.ui
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsSafetyContextDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes" comments="Translators: This is the title of the dialog which contains information about the permissions of an app">Safety</property>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">True</property>
+ <!-- this is a placeholder: the icon is actually set in code -->
+ <property name="icon-name">safety-symbolic</property>
+ <property name="pixel-size">24</property>
+ <style>
+ <class name="large"/>
+ <class name="grey"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="title">
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="justify">center</property>
+ <property name="label">Shortwave is safe</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBox" id="permissions_list">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <!-- Rows are added in code -->
+ <placeholder/>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwPreferencesGroup">
+ <property name="margin-top">20</property>
+ <property name="title" translatable="yes">Details</property>
+
+ <child>
+ <object class="GtkListBox" id="details_list">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="license_title">
+ <property name="ellipsize">end</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes">License</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="license_label">
+ <property name="ellipsize">end</property>
+ <property name="valign">center</property>
+ <!-- This is a placeholder. The label is set in code. -->
+ <property name="label">GNU GPL v3+</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">license_title</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="source_title">
+ <property name="ellipsize">end</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes" comments="Translators: This is a heading for a row showing the origin/source of an app (such as ‘flathub’).">Source</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="source_label">
+ <property name="ellipsize">end</property>
+ <property name="valign">center</property>
+ <!-- This is a placeholder. The label is set in code. -->
+ <property name="label">flathub.org</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">source_title</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBoxRow" id="sdk_row">
+ <property name="activatable">False</property>
+ <property name="focusable">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">12</property>
+ <property name="margin-bottom">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="sdk_title">
+ <property name="ellipsize">end</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="label" translatable="yes">SDK</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="sdk_label">
+ <property name="ellipsize">end</property>
+ <property name="valign">center</property>
+ <!-- This is a placeholder. The label is set in code. -->
+ <property name="label">GNOME 3.36.12</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">sdk_title</relation>
+ </accessibility>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="sdk_eol_image">
+ <property name="icon-name">dialog-warning-symbolic</property>
+ <style>
+ <class name="eol-red"/>
+ </style>
+ <accessibility>
+ <property name="label" translatable="yes">Outdated SDK version</property>
+ <relation name="labelled-by">sdk_title</relation>
+ </accessibility>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLinkButton">
+ <property name="label" translatable="yes">How to contribute missing information</property>
+ <property name="margin-top">16</property>
+ <property name="uri">https://gitlab.gnome.org/GNOME/gnome-software/-/wikis/software-metadata#safety</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+
+ <object class="GtkSizeGroup" id="details_size_group">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="license_title"/>
+ <widget name="source_title"/>
+ <widget name="sdk_title"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-screenshot-carousel.c b/src/gs-screenshot-carousel.c
new file mode 100644
index 0000000..d3111af
--- /dev/null
+++ b/src/gs-screenshot-carousel.c
@@ -0,0 +1,365 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2015-2019 Kalev Lember <klember@redhat.com>
+ * Copyright (C) 2019 Joaquim Rocha <jrocha@endlessm.com>
+ * Copyright (C) 2021 Adrien Plazas <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib/gi18n.h>
+#include <locale.h>
+#include <math.h>
+#include <string.h>
+
+#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),
+ AS_IMAGE_NORMAL_WIDTH,
+ AS_IMAGE_NORMAL_HEIGHT);
+ gtk_style_context_add_class (gtk_widget_get_style_context (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_show (ssimg);
+ 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 application 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..460d88d
--- /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 <adrien.plazas@puri.sm>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+#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..acffc91
--- /dev/null
+++ b/src/gs-screenshot-carousel.ui
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <template class="GsScreenshotCarousel" parent="GtkWidget">
+ <property name="visible">False</property>
+ <child>
+ <object class="GtkStack" id="stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">carousel</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <style>
+ <class name="frame"/>
+ <class name="view"/>
+ </style>
+ <child>
+ <object class="GtkOverlay">
+ <child>
+ <object class="AdwCarousel" id="carousel">
+ <property name="vexpand">True</property>
+ <signal name="notify::n-pages" handler="gs_screenshot_carousel_notify_n_pages_cb" swapped="yes"/>
+ <signal name="notify::position" handler="gs_screenshot_carousel_notify_position_cb" swapped="yes"/>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkRevealer" id="button_previous_revealer">
+ <property name="halign">start</property>
+ <property name="transition-type">crossfade</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkButton" id="button_previous">
+ <property name="width-request">64</property>
+ <property name="height-request">64</property>
+ <property name="margin-top">9</property>
+ <property name="margin-bottom">9</property>
+ <property name="margin-start">9</property>
+ <property name="margin-end">9</property>
+ <property name="icon-name">go-previous-symbolic</property>
+ <signal name="clicked" handler="gs_screenshot_carousel_button_previous_clicked_cb" swapped="yes"/>
+ <accessibility>
+ <!-- Translators: This is the accessible description for a button to go to the previous screenshot in the screenshot carousel. -->
+ <property name="label" translatable="yes">Previous Screenshot</property>
+ </accessibility>
+ <style>
+ <class name="circular"/>
+ <class name="image-button"/>
+ <class name="osd"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkRevealer" id="button_next_revealer">
+ <property name="halign">end</property>
+ <property name="transition-type">crossfade</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkButton" id="button_next">
+ <property name="width-request">64</property>
+ <property name="height-request">64</property>
+ <property name="margin-top">9</property>
+ <property name="margin-bottom">9</property>
+ <property name="margin-start">9</property>
+ <property name="margin-end">9</property>
+ <property name="icon-name">go-next-symbolic</property>
+ <signal name="clicked" handler="gs_screenshot_carousel_button_next_clicked_cb" swapped="yes"/>
+ <accessibility>
+ <!-- Translators: This is the accessible description for a button to go to the next screenshot in the screenshot carousel. -->
+ <property name="label" translatable="yes">Next Screenshot</property>
+ </accessibility>
+ <style>
+ <class name="circular"/>
+ <class name="image-button"/>
+ <class name="osd"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwCarouselIndicatorDots" id="carousel_indicator">
+ <property name="carousel">carousel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">fallback</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <!-- Arbitrary size chosen to tile together at 16:9;
+ see https://blogs.gnome.org/hughsie/2014/07/02/blurry-screenshots-in-gnome-software/ -->
+ <property name="height_request">423</property>
+ <property name="hexpand">True</property>
+ <property name="halign">fill</property>
+ <style>
+ <class name="screenshot-image"/>
+ <class name="frame"/>
+ <class name="view"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="pixel_size">64</property>
+ <property name="icon_name">camera-photo-symbolic</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="vexpand">True</property>
+ <property name="label" translatable="yes">No screenshot provided</property>
+ </object>
+ </child>
+ </object>
+
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
new file mode 100644
index 0000000..a2e3bb9
--- /dev/null
+++ b/src/gs-screenshot-image.c
@@ -0,0 +1,952 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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_show (ssimg->spinner);
+ gtk_spinner_start (GTK_SPINNER (ssimg->spinner));
+}
+
+static void
+gs_screenshot_image_stop_spinner (GsScreenshotImage *ssimg)
+{
+ gtk_spinner_stop (GTK_SPINNER (ssimg->spinner));
+ gtk_widget_hide (ssimg->spinner);
+}
+
+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);
+ if (width < 200)
+ gtk_widget_hide (ssimg->label_error);
+ else
+ gtk_widget_show (ssimg->label_error);
+ 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;
+
+ /* 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);
+ }
+
+ /* show icon */
+ if (g_strcmp0 (ssimg->current_image, "image1") == 0) {
+ if (pixbuf != NULL)
+ gtk_picture_set_pixbuf (GTK_PICTURE (ssimg->image2), pixbuf);
+ ssimg->current_image = "image2";
+ } else {
+ if (pixbuf != NULL)
+ gtk_picture_set_pixbuf (GTK_PICTURE (ssimg->image1), pixbuf);
+ ssimg->current_image = "image1";
+ }
+ }
+
+ gtk_stack_set_visible_child_name (GTK_STACK (ssimg->stack), ssimg->current_image);
+
+ gtk_widget_show (GTK_WIDGET (ssimg));
+ 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;
+
+ 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;
+
+ 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_pixbuf (GTK_PICTURE (ssimg->image1), pb);
+ } else {
+ gtk_picture_set_pixbuf (GTK_PICTURE (ssimg->image2), pb);
+ }
+}
+
+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 == AS_IMAGE_THUMBNAIL_WIDTH &&
+ height == AS_IMAGE_THUMBNAIL_HEIGHT) {
+ width = AS_IMAGE_NORMAL_WIDTH;
+ height = AS_IMAGE_NORMAL_HEIGHT;
+ } else {
+ width = AS_IMAGE_THUMBNAIL_WIDTH;
+ height = AS_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
+#if SOUP_CHECK_VERSION(3, 0, 0)
+gs_screenshot_image_complete_cb (GObject *source_object,
+ GAsyncResult *result,
+ gpointer user_data)
+#else
+gs_screenshot_image_complete_cb (SoupSession *session,
+ SoupMessage *msg,
+ gpointer user_data)
+#endif
+{
+ 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;
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ SoupMessage *msg;
+
+ stream = soup_session_send_finish (SOUP_SESSION (source_object), result, &error);
+ if (stream == NULL) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warning ("Failed to download screenshot: %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"));
+ }
+ return;
+ }
+
+ msg = soup_session_get_async_result_message (SOUP_SESSION (source_object), result);
+ status_code = soup_message_get_status (msg);
+#else
+ status_code = msg->status_code;
+#endif
+ 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 SOUP_CHECK_VERSION(3, 0, 0)
+ if (ssimg->session == NULL)
+#else
+ if (status_code == SOUP_STATUS_CANCELLED || ssimg->session == NULL)
+#endif
+ 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 SOUP_CHECK_VERSION(3, 0, 0)
+ 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)) {
+#else
+ if (status_code != SOUP_STATUS_CANT_RESOLVE) {
+#endif
+ const gchar *reason_phrase;
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ reason_phrase = soup_message_get_reason_phrase (msg);
+#else
+ reason_phrase = msg->reason_phrase;
+#endif
+ g_warning ("Result of screenshot downloading attempt with "
+ "status code '%u': %s", 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;
+ }
+
+#if !SOUP_CHECK_VERSION(3, 0, 0)
+ /* create a buffer with the data */
+ stream = g_memory_input_stream_new_from_data (msg->response_body->data,
+ msg->response_body->length,
+ NULL);
+ if (stream == NULL) {
+ gs_screenshot_image_stop_spinner (ssimg);
+ return;
+ }
+#endif
+
+ /* 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 (
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ soup_message_get_request_headers (msg),
+#else
+ msg->request_headers,
+#endif
+ "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;
+
+ im = as_screenshot_get_image (ssimg->screenshot,
+ ssimg->width * ssimg->scale,
+ ssimg->height * ssimg->scale);
+
+ /* if we've failed to load a HiDPI image, fallback to LoDPI */
+ if (im == NULL && ssimg->scale > 1) {
+ ssimg->scale = 1;
+ im = as_screenshot_get_image (ssimg->screenshot,
+ ssimg->width,
+ ssimg->height);
+ }
+
+ 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 > AS_IMAGE_THUMBNAIL_WIDTH &&
+ ssimg->height > AS_IMAGE_THUMBNAIL_HEIGHT) {
+ const gchar *url_thumb;
+ g_autofree gchar *basename_thumb = NULL;
+ g_autofree gchar *cache_kind_thumb = NULL;
+ AsImage *im;
+ im = as_screenshot_get_image (ssimg->screenshot,
+ AS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
+ AS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
+ 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) {
+#if !SOUP_CHECK_VERSION(3, 0, 0)
+ soup_session_cancel_message (ssimg->session,
+ ssimg->message,
+ SOUP_STATUS_CANCELLED);
+#endif
+ 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;
+ }
+
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ ssimg->message = soup_message_new_from_uri (SOUP_METHOD_GET, base_uri);
+#else
+ {
+ g_autofree gchar *uri_str = g_uri_to_string (base_uri);
+ ssimg->message = soup_message_new (SOUP_METHOD_GET, uri_str);
+ }
+#endif
+ 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 */
+#if SOUP_CHECK_VERSION(3, 0, 0)
+ ssimg->cancellable = g_cancellable_new ();
+ soup_session_send_async (ssimg->session, ssimg->message, G_PRIORITY_DEFAULT, ssimg->cancellable,
+ gs_screenshot_image_complete_cb, g_object_ref (ssimg));
+#else
+ soup_session_queue_message (ssimg->session,
+ g_object_ref (ssimg->message) /* transfer full */,
+ gs_screenshot_image_complete_cb,
+ g_object_ref (ssimg));
+#endif
+}
+
+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) {
+#if !SOUP_CHECK_VERSION(3, 0, 0)
+ soup_session_cancel_message (ssimg->session,
+ ssimg->message,
+ SOUP_STATUS_CANCELLED);
+#endif
+ 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_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ GtkStyleContext *context;
+
+ context = gtk_widget_get_style_context (widget);
+ gtk_snapshot_render_frame (snapshot,
+ context,
+ 0.0, 0.0,
+ gtk_widget_get_width (widget),
+ gtk_widget_get_height (widget));
+
+ GTK_WIDGET_CLASS (gs_screenshot_image_parent_class)->snapshot (widget, snapshot);
+}
+
+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;
+
+ widget_class->snapshot = gs_screenshot_image_snapshot;
+
+ 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..418db4c
--- /dev/null
+++ b/src/gs-screenshot-image.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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+#include <libsoup/soup.h>
+
+#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)
+
+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..a108ba7
--- /dev/null
+++ b/src/gs-screenshot-image.ui
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsScreenshotImage" parent="GtkWidget">
+ <accessibility>
+ <property name="label" translatable="yes">Screenshot</property>
+ </accessibility>
+ <style>
+ <class name="screenshot-image"/>
+ </style>
+ <child>
+ <object class="GtkOverlay" id="overlay">
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <child type="overlay">
+ <object class="GtkSpinner" id="spinner">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="transition-type">crossfade</property>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">image1</property>
+ <property name="child">
+ <object class="GtkPicture" id="image1">
+ <style>
+ <class name="image1"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">image2</property>
+ <property name="child">
+ <object class="GtkPicture" id="image2">
+ <style>
+ <class name="image2"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">video</property>
+ <property name="child">
+ <object class="GtkVideo" id="video">
+ <style>
+ <class name="video"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">error</property>
+ <property name="child">
+ <object class="GtkBox" id="box_error">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkImage" id="image_error">
+ <property name="icon-name">dialog-error-symbolic</property>
+ <property name="pixel-size">48</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_error"/>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-search-page.c b/src/gs-search-page.c
new file mode 100644
index 0000000..3b54c2c
--- /dev/null
+++ b/src/gs-search-page.c
@@ -0,0 +1,566 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#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 *spinner_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);
+ gtk_spinner_stop (GTK_SPINNER (self->spinner_search));
+ 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_spinner_stop (GTK_SPINNER (self->spinner_search));
+ 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_show (app_row);
+ }
+
+ /* too many results */
+ if (gs_app_list_has_flag (list, GS_APP_LIST_FLAG_IS_TRUNCATED)) {
+ GtkStyleContext *context;
+ 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);
+ context = gtk_widget_get_style_context (w);
+ gtk_style_context_add_class (context, "dim-label");
+ gtk_list_box_append (GTK_LIST_BOX (self->list_box_search), w);
+ gtk_widget_show (w);
+ } 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");
+ gtk_spinner_start (GTK_SPINNER (self->spinner_search));
+ 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 applications */
+ 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++;
+
+ /* search for apps */
+ gs_search_page_waiting_cancel (self);
+ self->waiting_id = g_timeout_add (250, gs_search_page_waiting_show_cb, self);
+
+ 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,
+ 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;
+}
+
+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, spinner_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..f955a21
--- /dev/null
+++ b/src/gs-search-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) 2013 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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);
+
+G_END_DECLS
diff --git a/src/gs-search-page.ui b/src/gs-search-page.ui
new file mode 100644
index 0000000..7d2768e
--- /dev/null
+++ b/src/gs-search-page.ui
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsSearchPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Search page</property>
+ </accessibility>
+ <child>
+ <object class="GtkStack" id="stack_search">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">no-search</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ <property name="title" translatable="yes">Search for Apps</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkSpinner" id="spinner_search">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">no-results</property>
+ <property name="child">
+ <object class="AdwStatusPage" id="noresults_grid_search">
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ <property name="title" translatable="yes">No Application Found</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">results</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="scrolledwindow_search">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <style>
+ <class name="list-page"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <child>
+ <object class="GtkListBox" id="list_box_search">
+ <property name="can_focus">True</property>
+ <property name="valign">start</property>
+ <property name="selection_mode">none</property>
+ <property name="margin-top">24</property>
+ <property name="margin-bottom">36</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ <class name="section"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-self-test.c b/src/gs-self-test.c
new file mode 100644
index 0000000..83fce99
--- /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 <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..5003a5b
--- /dev/null
+++ b/src/gs-shell-search-provider.c
@@ -0,0 +1,409 @@
+/* -*- 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+
+ */
+
+#include <config.h>
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+#include <string.h>
+
+#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_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 ();
+
+ 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,
+ 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..f3bbbd1
--- /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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..91946ee
--- /dev/null
+++ b/src/gs-shell.c
@@ -0,0 +1,2725 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2020 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <adwaita.h>
+#include <malloc.h>
+#include <string.h>
+#include <glib/gi18n.h>
+
+#ifdef HAVE_MOGWAI
+#include <libmogwai-schedule-client/scheduler.h>
+#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-metered-data-dialog.h"
+#include "gs-moderate-page.h"
+#include "gs-loading-page.h"
+#include "gs-search-page.h"
+#include "gs-overview-page.h"
+#include "gs-updates-page.h"
+#include "gs-category-page.h"
+#include "gs-extras-page.h"
+#include "gs-repos-dialog.h"
+#include "gs-prefs-dialog.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",
+ "moderate",
+ "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;
+ GQueue *back_entry_stack;
+ GPtrArray *modal_dialogs;
+ gchar *events_info_uri;
+ 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 *metered_updates_bar;
+ GtkWidget *search_button;
+ GtkWidget *entry_search;
+ GtkWidget *search_bar;
+ GtkWidget *button_back;
+ GtkWidget *button_back2;
+ GtkWidget *notification_event;
+ GtkWidget *button_events_sources;
+ GtkWidget *button_events_no_space;
+ GtkWidget *button_events_network_settings;
+ GtkWidget *button_events_restart_required;
+ GtkWidget *button_events_more_info;
+ GtkWidget *button_events_dismiss;
+ GtkWidget *label_events;
+ GtkWidget *primary_menu;
+ 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 };
+
+static void
+modal_dialog_unmapped_cb (GtkWidget *dialog,
+ GsShell *shell)
+{
+ g_debug ("modal dialog %p unmapped", dialog);
+ g_ptr_array_remove (shell->modal_dialogs, dialog);
+}
+
+void
+gs_shell_modal_dialog_present (GsShell *shell, GtkWindow *window)
+{
+ GtkWindow *parent;
+
+ /* show new modal on top of old modal */
+ if (shell->modal_dialogs->len > 0) {
+ parent = g_ptr_array_index (shell->modal_dialogs,
+ shell->modal_dialogs->len - 1);
+ g_debug ("using old modal %p as parent", parent);
+ } else {
+ parent = GTK_WINDOW (shell);
+ g_debug ("using main window");
+ }
+ gtk_window_set_transient_for (window, parent);
+
+ /* add to stack, transfer ownership to here */
+ g_ptr_array_add (shell->modal_dialogs, window);
+ g_signal_connect (GTK_WIDGET (window), "unmap",
+ G_CALLBACK (modal_dialog_unmapped_cb), shell);
+
+ /* present the new one */
+ gtk_window_set_modal (window, TRUE);
+ gtk_window_present (window);
+}
+
+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_show (GTK_WIDGET (shell));
+ 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_refresh_auto_updates_ui (GsShell *shell)
+{
+ gboolean automatic_updates_paused;
+ gboolean automatic_updates_enabled;
+
+ automatic_updates_enabled = g_settings_get_boolean (shell->settings, "download-updates");
+
+#ifdef HAVE_MOGWAI
+ automatic_updates_paused = (shell->scheduler == NULL || !mwsc_scheduler_get_allow_downloads (shell->scheduler));
+#else
+ automatic_updates_paused = gs_plugin_loader_get_network_metered (shell->plugin_loader);
+#endif
+
+ gtk_info_bar_set_revealed (GTK_INFO_BAR (shell->metered_updates_bar),
+ gs_shell_get_mode (shell) != GS_SHELL_MODE_LOADING &&
+ automatic_updates_enabled &&
+ automatic_updates_paused);
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (shell->metered_updates_bar), GTK_RESPONSE_OK);
+}
+
+static void
+gs_shell_metered_updates_bar_response_cb (GtkInfoBar *info_bar,
+ gint response_id,
+ gpointer user_data)
+{
+ GsShell *shell = GS_SHELL (user_data);
+ GtkWidget *dialog;
+
+ dialog = gs_metered_data_dialog_new (GTK_WINDOW (shell));
+ gs_shell_modal_dialog_present (shell, GTK_WINDOW (dialog));
+}
+
+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 (GTK_WINDOW (shell), remote, realm, callback, callback_data);
+ gs_shell_modal_dialog_present (shell, GTK_WINDOW (dialog));
+
+ /* just destroy */
+ g_signal_connect_swapped (dialog, "response",
+ G_CALLBACK (gtk_window_destroy), dialog);
+}
+
+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_WINDOW (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:
+ case GS_SHELL_MODE_MODERATE:
+ 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);
+ gsize i;
+
+ 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_show (shell->search_button);
+ break;
+ case GS_SHELL_MODE_UPDATES:
+ gtk_widget_hide (shell->search_button);
+ 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;
+ 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);
+
+ /* destroy any existing modals */
+ if (shell->modal_dialogs != NULL) {
+ /* block signal emission of 'unmapped' since that will
+ * call g_ptr_array_remove_index. The unmapped signal may
+ * be emitted whilst running unref handlers for
+ * g_ptr_array_set_size */
+ for (i = 0; i < shell->modal_dialogs->len; ++i) {
+ GtkWidget *dialog = g_ptr_array_index (shell->modal_dialogs, i);
+ g_signal_handlers_disconnect_by_func (dialog,
+ modal_dialog_unmapped_cb,
+ shell);
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ }
+ g_ptr_array_set_size (shell->modal_dialogs, 0);
+ }
+}
+
+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");
+ 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");
+ }
+
+ /* do any mode-specific actions */
+ page = shell->pages[mode];
+
+ if (mode == GS_SHELL_MODE_SEARCH) {
+ 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 gboolean
+overlay_get_child_position_cb (GtkOverlay *overlay,
+ GtkWidget *widget,
+ GdkRectangle *allocation,
+ gpointer user_data)
+{
+ GsShell *self = GS_SHELL (user_data);
+ GtkRequisition overlay_natural_size;
+
+ /* Override the default position of the in-app notification overlay
+ * to position it below the header bar. The overlay can’t easily be
+ * moved in the widget hierarchy so it doesn’t have the header bar as
+ * a child, since there are several header bars in different pages of
+ * a AdwLeaflet. */
+ g_assert (gtk_widget_is_ancestor (self->main_header, GTK_WIDGET (overlay)));
+
+ gtk_widget_get_preferred_size (widget, NULL, &overlay_natural_size);
+
+ allocation->width = overlay_natural_size.width;
+ allocation->height = overlay_natural_size.height;
+
+ allocation->x = gtk_widget_get_allocated_width (GTK_WIDGET (overlay)) / 2 - overlay_natural_size.width / 2;
+ allocation->y = gtk_widget_get_allocated_height (GTK_WIDGET (self->main_header));
+
+ return TRUE;
+}
+
+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_sources_cb (GtkWidget *widget, GsShell *shell)
+{
+ gs_shell_show_sources (shell);
+}
+
+static void
+gs_shell_plugin_events_no_space_cb (GtkWidget *widget, 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_network_settings_cb (GtkWidget *widget, GsShell *shell)
+{
+ g_autoptr(GError) error = NULL;
+ if (!g_spawn_command_line_async ("gnome-control-center network", &error))
+ g_warning ("failed to exec gnome-control-center: %s", error->message);
+}
+
+static void
+gs_shell_plugin_events_more_info_cb (GtkWidget *widget, GsShell *shell)
+{
+ g_autoptr(GError) error = NULL;
+ if (!g_app_info_launch_default_for_uri (shell->events_info_uri, NULL, &error)) {
+ g_warning ("failed to launch URI %s: %s",
+ shell->events_info_uri, error->message);
+ }
+}
+
+static void
+gs_shell_plugin_events_restart_required_cb (GtkWidget *widget, 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);
+}
+
+/* this is basically a workaround for GtkSearchEntry. Due to delayed emission of the search-changed
+ * signal it can't be blocked during insertion of text into the entry. Therefore we block the
+ * precursor of that signal to be able to add text to the entry without firing the handlers
+ * connected to "search-changed"
+ */
+static void
+block_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ g_signal_stop_emission_by_name (editable, "changed");
+}
+
+static void
+block_changed_signal (GtkSearchEntry *entry)
+{
+ g_signal_connect (entry, "changed", G_CALLBACK (block_changed), NULL);
+}
+
+static void
+unblock_changed_signal (GtkSearchEntry *entry)
+{
+ g_signal_handlers_disconnect_by_func (entry, G_CALLBACK (block_changed), NULL);
+}
+
+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 text in the entry and move cursor to the end */
+ block_changed_signal (GTK_SEARCH_ENTRY (shell->entry_search));
+ gtk_editable_set_text (GTK_EDITABLE (shell->entry_search), entry->search);
+ gtk_editable_set_position (GTK_EDITABLE (shell->entry_search), -1);
+ unblock_changed_signal (GTK_SEARCH_ENTRY (shell->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)
+{
+ /* handle ctrl+f shortcut */
+ if ((state & GDK_CONTROL_MASK) > 0 && 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_search_bar_set_search_mode (GTK_SEARCH_BAR (shell->search_bar), FALSE);
+ }
+ 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]);
+ gs_page_scroll_up (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)
+{
+ 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);
+ }
+}
+
+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");
+
+ /* clear any in-app notification */
+ gtk_revealer_set_reveal_child (GTK_REVEALER (shell->notification_event), FALSE);
+
+ /* 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_hide (dialog);
+
+#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);
+ }
+ }
+}
+
+typedef enum {
+ GS_SHELL_EVENT_BUTTON_NONE = 0,
+ GS_SHELL_EVENT_BUTTON_SOURCES = 1 << 0,
+ GS_SHELL_EVENT_BUTTON_NO_SPACE = 1 << 1,
+ GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS = 1 << 2,
+ GS_SHELL_EVENT_BUTTON_MORE_INFO = 1 << 3,
+ GS_SHELL_EVENT_BUTTON_RESTART_REQUIRED = 1 << 4,
+ GS_SHELL_EVENT_BUTTON_LAST
+} GsShellEventButtons;
+
+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,
+ GsShellEventButtons buttons)
+{
+ /* set visible */
+ gtk_revealer_set_reveal_child (GTK_REVEALER (shell->notification_event), TRUE);
+
+ /* sources button */
+ gtk_widget_set_visible (shell->button_events_sources,
+ (buttons & GS_SHELL_EVENT_BUTTON_SOURCES) > 0);
+
+ /* no-space button */
+ gtk_widget_set_visible (shell->button_events_no_space,
+ (buttons & GS_SHELL_EVENT_BUTTON_NO_SPACE) > 0 &&
+ gs_shell_has_disk_examination_app());
+
+ /* network settings button */
+ gtk_widget_set_visible (shell->button_events_network_settings,
+ (buttons & GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS) > 0);
+
+ /* restart button */
+ gtk_widget_set_visible (shell->button_events_restart_required,
+ (buttons & GS_SHELL_EVENT_BUTTON_RESTART_REQUIRED) > 0);
+
+ /* more-info button */
+ gtk_widget_set_visible (shell->button_events_more_info,
+ (buttons & GS_SHELL_EVENT_BUTTON_MORE_INFO) > 0);
+
+ /* dismiss button */
+ gtk_widget_set_visible (shell->button_events_dismiss,
+ (buttons & GS_SHELL_EVENT_BUTTON_RESTART_REQUIRED) == 0);
+
+ /* set title */
+ gtk_label_set_markup (GTK_LABEL (shell->label_events), title);
+ gtk_widget_set_visible (shell->label_events, title != NULL);
+}
+
+void
+gs_shell_show_notification (GsShell *shell, const gchar *title)
+{
+ gs_shell_show_event_app_notify (shell, title, GS_SHELL_EVENT_BUTTON_NONE);
+}
+
+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));
+}
+
+static gchar *
+get_first_lines (const gchar *str)
+{
+ const gchar *end = str;
+ /* Some errors can have an "introduction", thus pick few initial lines, not only the first. */
+ for (guint lines = 0; end != NULL && lines < 7; lines++) {
+ end = strchr (end, '\n');
+ if (end != NULL)
+ end++;
+ }
+ if (end != NULL) {
+ g_autofree gchar *tmp = g_strndup (str, end - str);
+ /* 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. */
+ return g_strdup_printf (_("%s…"), tmp);
+ }
+ return g_strdup (str);
+}
+
+static void
+gs_shell_append_detailed_error (GsShell *shell, GString *str, const GError *error)
+{
+ g_autofree gchar *text = get_first_lines (error->message);
+ if (text != NULL) {
+ g_autofree gchar *escaped = g_markup_escape_text (text, -1);
+ g_string_append_printf (str, ":\n%s", escaped);
+ }
+}
+
+static gboolean
+gs_shell_show_event_refresh (GsShell *shell, GsPluginEvent *event)
+{
+ GsApp *origin = gs_plugin_event_get_origin (event);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ GsPluginAction action = gs_plugin_event_get_action (event);
+ g_autofree gchar *str_origin = NULL;
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ /* ignore any errors from background downloads */
+ if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE))
+ return FALSE;
+
+ 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);
+ if (gs_app_get_bundle_kind (origin) == AS_BUNDLE_KIND_CABINET) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the source (e.g. "alt.fedoraproject.org") */
+ g_string_append_printf (str, _("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") */
+ g_string_append_printf (str, _("Unable to download updates from %s"),
+ str_origin);
+ if (!gs_app_has_management_plugin (origin, NULL))
+ buttons |= GS_SHELL_EVENT_BUTTON_SOURCES;
+ }
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates"));
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates: "
+ "internet access was required but wasn’t available"));
+ buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_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") */
+ g_string_append_printf (str, _("Unable to download updates "
+ "from %s: not enough disk space"),
+ str_origin);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates: "
+ "not enough disk space"));
+ }
+ buttons |= GS_SHELL_EVENT_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 */
+ g_string_append (str, _("Unable to download updates: "
+ "authentication was required"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates: "
+ "authentication was invalid"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates: you do not have"
+ " permission to install software"));
+ } 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 (action == GS_PLUGIN_ACTION_DOWNLOAD) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to download updates"));
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to get list of updates"));
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autofree gchar *str_app = NULL;
+ g_autofree gchar *str_origin = NULL;
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ str_app = gs_shell_get_title_from_app (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,
+ * where the first %s is the application name (e.g. "GIMP") and
+ * the second %s is the origin, e.g. "Fedora Project [fedoraproject.org]" */
+ g_string_append_printf (str, _("Unable to install %s as "
+ "download failed from %s"),
+ str_app, str_origin);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s "
+ "as download failed"),
+ str_app);
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) {
+ 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 application name (e.g. "GIMP")
+ * and the second %s is the name of the runtime, e.g.
+ * "GNOME SDK [flatpak.gnome.org]" */
+ g_string_append_printf (str, _("Unable to install %s as "
+ "runtime %s not available"),
+ str_app, str_origin);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s "
+ "as not supported"),
+ str_app);
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to install: internet access was "
+ "required but wasn’t available"));
+ buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to install: the application has an invalid format"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "not enough disk space"),
+ str_app);
+ buttons |= GS_SHELL_EVENT_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 */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "authentication was required"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "authentication was invalid"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "you do not have permission to "
+ "install software"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "AC power is required"),
+ 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,
+ * where the %s is the application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to install %s: "
+ "The battery level is too low"),
+ 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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to install %s"), str_app);
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autofree gchar *str_app = NULL;
+ g_autofree gchar *str_origin = NULL;
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ /* ignore any errors from background downloads */
+ if (!gs_plugin_event_has_flag (event, GS_PLUGIN_EVENT_FLAG_INTERACTIVE))
+ return FALSE;
+
+ 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]" */
+ g_string_append_printf (str, _("Unable to update %s from %s as download failed"),
+ str_app, str_origin);
+ buttons = TRUE;
+ } 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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s as 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]" */
+ g_string_append_printf (str, _("Unable to install updates from %s as download failed"),
+ str_origin);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates as download failed"));
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Unable to update: "
+ "internet access was required but "
+ "wasn’t available"));
+ buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "not enough disk space"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "not enough disk space"));
+ }
+ buttons |= GS_SHELL_EVENT_BUTTON_NO_SPACE;
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "authentication was required"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "authentication was required"));
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) {
+ 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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "authentication was invalid"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "authentication was invalid"));
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ 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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "you do not have permission to "
+ "update software"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "you do not have permission to "
+ "update software"));
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_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 application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "AC power is required"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "AC power is required"));
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) {
+ 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 application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to update %s: "
+ "The battery level is too low"),
+ str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "Dell XPS 13") */
+ g_string_append_printf (str, _("Unable to install updates: "
+ "The 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 {
+ 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 application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to update %s"), str_app);
+ } else {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append_printf (str, _("Unable to install updates"));
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (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,
+ * 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]" */
+ g_string_append_printf (str, _("Unable to upgrade to %s 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") */
+ g_string_append_printf (str, _("Unable to upgrade to %s "
+ "as download failed"),
+ str_app);
+ }
+ gs_shell_append_detailed_error (shell, str, error);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_NETWORK)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "internet access was required but "
+ "wasn’t available"),
+ str_app);
+ buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "not enough disk space"),
+ str_app);
+ buttons |= GS_SHELL_EVENT_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,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "authentication was required"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "authentication was invalid"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "you do not have permission to upgrade"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "AC power is required"),
+ 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,
+ * where the %s is the distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
+ "The battery level is too low"),
+ 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 distro name (e.g. "Fedora 25") */
+ g_string_append_printf (str, _("Unable to upgrade to %s"), str_app);
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (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,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s: authentication was required"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AUTH_INVALID)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s: authentication was invalid"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s: you do not have"
+ " permission to remove software"),
+ str_app);
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_AC_POWER_REQUIRED)) {
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s: "
+ "AC power is required"),
+ 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,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s: "
+ "The battery level is too low"),
+ 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 FALSE;
+ /* TRANSLATORS: failure text for the in-app notification,
+ * where the %s is the application name (e.g. "GIMP") */
+ g_string_append_printf (str, _("Unable to remove %s"), str_app);
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (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 && 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 application name (e.g. "GIMP")
+ * and the second %s is the name of the runtime, e.g.
+ * "GNOME SDK [flatpak.gnome.org]" */
+ g_string_append_printf (str, _("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;
+ /* TRANSLATORS: we failed to get a proper error code */
+ g_string_append (str, _("Sorry, something went wrong"));
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Not enough disk space — free up some space "
+ "and try again"));
+ buttons |= GS_SHELL_EVENT_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 FALSE;
+ /* TRANSLATORS: we failed to get a proper error code */
+ g_string_append (str, _("Sorry, something went wrong"));
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ return TRUE;
+}
+
+static gboolean
+gs_shell_show_event_file_to_app (GsShell *shell, GsPluginEvent *event)
+{
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Failed to install file: not supported"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Failed to install file: authentication failed"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Not enough disk space — free up some space "
+ "and try again"));
+ buttons |= GS_SHELL_EVENT_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 FALSE;
+ /* TRANSLATORS: we failed to get a proper error code */
+ g_string_append (str, _("Sorry, something went wrong"));
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ return TRUE;
+}
+
+static gboolean
+gs_shell_show_event_url_to_app (GsShell *shell, GsPluginEvent *event)
+{
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (NULL);
+
+ if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NOT_SUPPORTED)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Failed to install: not supported"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SECURITY)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Failed to install: authentication failed"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Not enough disk space — free up some space "
+ "and try again"));
+ buttons |= GS_SHELL_EVENT_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 FALSE;
+ /* TRANSLATORS: we failed to get a proper error code */
+ g_string_append (str, _("Sorry, something went wrong"));
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ return TRUE;
+}
+
+static gboolean
+gs_shell_show_event_fallback (GsShell *shell, GsPluginEvent *event)
+{
+ GsApp *origin = gs_plugin_event_get_origin (event);
+ GsShellEventButtons buttons = GS_SHELL_EVENT_BUTTON_NONE;
+ const GError *error = gs_plugin_event_get_error (event);
+ g_autoptr(GString) str = g_string_new (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]" */
+ g_string_append_printf (str, _("Unable to contact %s"),
+ str_origin);
+ }
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_NO_SPACE)) {
+ /* TRANSLATORS: failure text for the in-app notification */
+ g_string_append (str, _("Not enough disk space — free up some space "
+ "and try again"));
+ buttons |= GS_SHELL_EVENT_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 application, aka 'GNOME Software'. */
+ g_string_append (str, _("Software needs to be restarted to use new plugins."));
+ buttons |= GS_SHELL_EVENT_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 */
+ g_string_append (str, _("AC power is required"));
+ } else if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_BATTERY_LEVEL_TOO_LOW)) {
+ /* TRANSLATORS: not enough juice to do this safely */
+ g_string_append (str, _("The 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 FALSE;
+ /* TRANSLATORS: we failed to get a proper error code */
+ g_string_append (str, _("Sorry, something went wrong"));
+ gs_shell_append_detailed_error (shell, str, error);
+ }
+
+ if (str->len == 0)
+ return FALSE;
+
+ /* add more-info button */
+ if (origin != NULL) {
+ const gchar *uri = gs_app_get_url (origin, AS_URL_KIND_HELP);
+ if (uri != NULL) {
+ g_free (shell->events_info_uri);
+ shell->events_info_uri = g_strdup (uri);
+ buttons |= GS_SHELL_EVENT_BUTTON_MORE_INFO;
+ }
+ }
+
+ /* show in-app notification */
+ gs_shell_show_event_app_notify (shell, str->str, buttons);
+ 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_SHELL_EVENT_BUTTON_NONE);
+ 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);
+
+ /* split up the events by action */
+ action = gs_plugin_event_get_action (event);
+ switch (action) {
+ case GS_PLUGIN_ACTION_DOWNLOAD:
+ return gs_shell_show_event_refresh (shell, event);
+ case GS_PLUGIN_ACTION_INSTALL:
+ case GS_PLUGIN_ACTION_INSTALL_REPO:
+ case GS_PLUGIN_ACTION_ENABLE_REPO:
+ return gs_shell_show_event_install (shell, event);
+ case GS_PLUGIN_ACTION_UPDATE:
+ return gs_shell_show_event_update (shell, event);
+ case GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD:
+ return gs_shell_show_event_upgrade (shell, event);
+ case GS_PLUGIN_ACTION_REMOVE:
+ 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) {
+ if (!gs_shell_show_event (shell, event)) {
+ 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)) {
+ g_warning ("not handling error %s for action %s: %s",
+ gs_plugin_error_to_string (error->code),
+ gs_plugin_action_to_string (action),
+ error->message);
+ }
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_INVALID);
+ return;
+ }
+ gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_VISIBLE);
+ return;
+ }
+
+ /* nothing to show */
+ gtk_revealer_set_reveal_child (GTK_REVEALER (shell->notification_event), FALSE);
+}
+
+static void
+gs_shell_events_notify_cb (GsPluginLoader *plugin_loader,
+ GParamSpec *pspec,
+ GsShell *shell)
+{
+ gs_shell_rescan_events (shell);
+}
+
+static void
+gs_shell_plugin_event_dismissed_cb (GtkButton *button, 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_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
+gs_shell_add_about_menu_item (GsShell *shell)
+{
+ g_autoptr(GMenuItem) menu_item = NULL;
+
+ /* TRANSLATORS: this is the menu item that opens the about window */
+ menu_item = g_menu_item_new (_("About Software"), "app.about");
+ g_menu_append_item (G_MENU (shell->primary_menu), menu_item);
+}
+
+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);
+}
+
+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);
+ gs_moderate_page_set_odrs_provider (GS_MODERATE_PAGE (shell->pages[GS_SHELL_MODE_MODERATE]), odrs_provider);
+
+ /* coldplug */
+ gs_shell_rescan_events (shell);
+
+ /* primary menu */
+ gs_shell_add_about_menu_item (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;
+
+ 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);
+
+ 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);
+
+ gs_shell_modal_dialog_present (shell, GTK_WINDOW (dialog));
+}
+
+void
+gs_shell_show_sources (GsShell *shell)
+{
+ GtkWidget *dialog;
+
+ /* use if available */
+ if (g_spawn_command_line_async ("software-properties-gtk", NULL))
+ return;
+
+ dialog = gs_repos_dialog_new (GTK_WINDOW (shell), shell->plugin_loader);
+ gs_shell_modal_dialog_present (shell, GTK_WINDOW (dialog));
+}
+
+void
+gs_shell_show_prefs (GsShell *shell)
+{
+ GtkWidget *dialog;
+
+ dialog = gs_prefs_dialog_new (GTK_WINDOW (shell), shell->plugin_loader);
+ gs_shell_modal_dialog_present (shell, GTK_WINDOW (dialog));
+}
+
+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)
+{
+ gtk_show_uri (GTK_WINDOW (shell), url, GDK_CURRENT_TIME);
+}
+
+/**
+ * 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->page);
+ g_clear_pointer (&shell->events_info_uri, g_free);
+ g_clear_pointer (&shell->modal_dialogs, g_ptr_array_unref);
+ 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);
+ GtkAllocation allocation;
+ gboolean is_narrow;
+ GtkStyleContext *context;
+
+ gtk_widget_get_allocation (GTK_WIDGET (shell), &allocation);
+
+ is_narrow = allocation.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 != allocation.width) {
+ shell->allocation_width = allocation.width;
+ g_object_notify_by_pspec (G_OBJECT (shell), obj_props[PROP_ALLOCATION_WIDTH]);
+ }
+
+ shell->allocation_changed_cb_id = 0;
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (shell));
+
+ if (is_narrow)
+ gtk_style_context_add_class (context, "narrow");
+ else
+ gtk_style_context_remove_class (context, "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, metered_updates_bar);
+ 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, notification_event);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_sources);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_no_space);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_network_settings);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_restart_required);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_more_info);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, button_events_dismiss);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, label_events);
+ gtk_widget_class_bind_template_child (widget_class, GsShell, primary_menu);
+ 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, "moderate_page", FALSE, G_STRUCT_OFFSET (GsShell, pages[GS_SHELL_MODE_MODERATE]));
+ 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, gs_shell_plugin_events_sources_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_plugin_events_no_space_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_plugin_events_network_settings_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_plugin_events_restart_required_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_plugin_events_more_info_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_plugin_event_dismissed_cb);
+ gtk_widget_class_bind_template_callback (widget_class, gs_shell_metered_updates_bar_response_cb);
+ 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, overlay_get_child_position_cb);
+ 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)
+{
+ 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 ();
+ shell->modal_dialogs = g_ptr_array_new ();
+}
+
+GsShell *
+gs_shell_new (void)
+{
+ return GS_SHELL (g_object_new (GS_TYPE_SHELL, NULL));
+}
diff --git a/src/gs-shell.h b/src/gs-shell.h
new file mode 100644
index 0000000..7689777
--- /dev/null
+++ b/src/gs-shell.h
@@ -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) 2013 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <gtk/gtk.h>
+
+#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_MODERATE,
+ 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);
+void gs_shell_modal_dialog_present (GsShell *shell,
+ GtkWindow *window);
+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);
+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);
+
+G_END_DECLS
diff --git a/src/gs-shell.ui b/src/gs-shell.ui
new file mode 100644
index 0000000..52e4a43
--- /dev/null
+++ b/src/gs-shell.ui
@@ -0,0 +1,521 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="handy" version="1.0"/>
+ <menu id="primary_menu">
+ <item>
+ <attribute name="label" translatable="yes">_Software Repositories</attribute>
+ <attribute name="action">app.sources</attribute>
+ <attribute name="hidden-when">action-disabled</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Update Preferences</attribute>
+ <attribute name="action">app.prefs</attribute>
+ </item>
+ </menu>
+
+ <template class="GsShell" parent="AdwApplicationWindow">
+ <property name="visible">False</property>
+ <property name="default-width">1200</property>
+ <property name="default-height">800</property>
+ <property name="title" translatable="yes">Software</property>
+ <property name="icon_name">org.gnome.Software</property>
+ <signal name="map" handler="gs_shell_main_window_mapped_cb"/>
+ <signal name="realize" handler="gs_shell_main_window_realized_cb"/>
+ <signal name="close-request" handler="main_window_closed_cb"/>
+ <child>
+ <object class="GtkEventControllerKey">
+ <property name="propagation-phase">capture</property>
+ <signal name="key-pressed" handler="window_keypress_handler"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEventControllerKey">
+ <signal name="key-pressed" handler="window_key_pressed_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <!-- Mouse hardware back button -->
+ <property name="button">8</property>
+ <signal name="pressed" handler="window_button_pressed_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStack" id="stack_loading">
+ <property name="width-request">360</property>
+ <signal name="notify::visible-child" handler="stack_notify_visible_child_cb"/>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">main</property>
+ <property name="child">
+ <object class="GtkOverlay" id="overlay">
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="vexpand">True</property>
+ <signal name="get-child-position" handler="overlay_get_child_position_cb"/>
+ <child type="overlay">
+ <object class="GtkRevealer" id="notification_event">
+ <property name="halign">GTK_ALIGN_CENTER</property>
+ <property name="valign">GTK_ALIGN_START</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="spacing">6</property>
+ <style>
+ <class name="app-notification"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="label_events">
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="label">Some Title</property>
+ <property name="wrap">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="max_width_chars">60</property>
+ <property name="margin_start">9</property>
+ <property name="margin_end">9</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <child>
+ <object class="GtkButton" id="button_events_sources">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes" comments="button in the info bar">Software Repositories</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_shell_plugin_events_sources_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_events_no_space">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes" comments="button in the info bar">Examine Disk</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_shell_plugin_events_no_space_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_events_network_settings">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes" comments="button in the info bar">Network Settings</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_shell_plugin_events_network_settings_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_events_restart_required">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes" comments="button in the info bar">Restart Now</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_shell_plugin_events_restart_required_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_events_more_info">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes" comments="button in the info bar">More Information</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="gs_shell_plugin_events_more_info_cb"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_events_dismiss">
+ <property name="halign">end</property>
+ <property name="valign">start</property>
+ <signal name="clicked" handler="gs_shell_plugin_event_dismissed_cb"/>
+ <style>
+ <class name="flat"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="icon_name">window-close-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwLeaflet" id="details_leaflet">
+ <property name="can-navigate-back">True</property>
+ <property name="can-unfold">False</property>
+ <signal name="notify::visible-child" handler="stack_notify_visible_child_cb"/>
+
+
+ <child>
+ <object class="AdwLeafletPage">
+ <property name="name">main</property>
+ <property name="child">
+ <object class="AdwLeaflet" id="main_leaflet">
+ <property name="can-navigate-back">True</property>
+ <property name="can-unfold">False</property>
+ <signal name="notify::visible-child" handler="stack_notify_visible_child_cb"/>
+
+ <child>
+ <object class="AdwLeafletPage">
+ <property name="name">main</property>
+ <property name="child">
+ <object class="GtkBox" id="main_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwHeaderBar" id="main_header">
+ <property name="hexpand">True</property>
+ <property name="show-end-title-buttons">True</property>
+ <property name="centering-policy">strict</property>
+ <child type="start">
+ <object class="GtkToggleButton" id="search_button">
+ <property name="can_focus">True</property>
+ <property name="icon_name">edit-find-symbolic</property>
+ <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" bind-flags="sync-create|bidirectional"/>
+ <accessibility>
+ <property name="label" translatable="yes">Search</property>
+ </accessibility>
+ <style>
+ <class name="image-button"/>
+ </style>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkMenuButton" id="menu_button">
+ <property name="can_focus">True</property>
+ <property name="sensitive">True</property>
+ <property name="primary">True</property>
+ <property name="icon_name">open-menu-symbolic</property>
+ <property name="menu_model">primary_menu</property>
+ <accessibility>
+ <property name="label" translatable="yes">Primary Menu</property>
+ </accessibility>
+ <style>
+ <class name="image-button"/>
+ </style>
+ </object>
+ </child>
+ <child type="title">
+ <object class="AdwViewSwitcherTitle" id="title_switcher">
+ <property name="stack">stack_main</property>
+ <property name="title" bind-source="GsShell" bind-property="title" bind-flags="sync-create"/>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkSearchBar" id="search_bar">
+ <property name="key-capture-widget">GsShell</property>
+ <signal name="notify::search-mode-enabled" handler="search_bar_search_mode_enabled_changed_cb"/>
+ <child>
+ <object class="AdwClamp">
+ <property name="hexpand">True</property>
+ <property name="maximum_size">500</property>
+ <property name="tightening_threshold">500</property>
+ <child>
+ <object class="GtkSearchEntry" id="entry_search">
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <signal name="search-changed" handler="search_changed_handler"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkInfoBar" id="metered_updates_bar">
+ <property name="message-type">GTK_MESSAGE_INFO</property>
+ <property name="show-close-button">False</property>
+ <property name="revealed">False</property>
+ <signal name="response" handler="gs_shell_metered_updates_bar_response_cb"/>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_start">6</property>
+ <property name="margin_bottom">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Automatic Updates Paused</property>
+ <property name="vexpand">True</property>
+ <property name="xalign">0.0</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="action">
+ <object class="GtkBox">
+ <property name="margin_end">6</property>
+ <child>
+ <object class="GtkButton" id="metered_updates_button">
+ <property name="can_focus">True</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Find Out _More</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="GTK_RESPONSE_OK">metered_updates_button</action-widget>
+ </action-widgets>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStack" id="stack_main">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hhomogeneous">False</property>
+ <property name="vhomogeneous">False</property>
+ <signal name="notify::visible-child" handler="stack_notify_visible_child_cb"/>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">overview</property>
+ <property name="title" translatable="yes" comments="Translators: A label for a button to show all available software.">Explore</property>
+ <property name="icon-name">explore-symbolic</property>
+ <property name="child">
+ <object class="GsOverviewPage" id="overview_page">
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">installed</property>
+ <!-- FIXME: Add mnemonics support when it’s supported in GTK (same for the other pages).
+ See https://gitlab.gnome.org/GNOME/gtk/-/issues/3134 -->
+ <property name="title" translatable="yes" comments="Translators: A label for a button to show only software which is already installed." context="List of installed apps">Installed</property>
+ <property name="icon-name">app-installed-symbolic</property>
+ <property name="child">
+ <object class="GsInstalledPage" id="installed_page">
+ <property name="is-narrow" bind-source="GsShell" bind-property="is-narrow" bind-flags="sync-create"/>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">search</property>
+ <property name="child">
+ <object class="GsSearchPage" id="search_page">
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">updates</property>
+ <property name="title" translatable="yes" comments="Translators: A label for a button to show only updates which are available to install." context="Header bar button for list of apps to be updated">Updates</property>
+ <property name="icon-name">emblem-synchronizing-symbolic</property>
+ <property name="badge-number" bind-source="updates_page" bind-property="counter" bind-flags="sync-create"/>
+ <property name="child">
+ <object class="GsUpdatesPage" id="updates_page">
+ <property name="is-narrow" bind-source="GsShell" bind-property="is-narrow" bind-flags="sync-create"/>
+ <signal name="notify::counter" handler="updates_page_notify_counter_cb"/>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewSwitcherBar" id="sidebar_switcher">
+ <property name="reveal" bind-source="title_switcher" bind-property="title-visible" bind-flags="sync-create"/>
+ <property name="stack">stack_main</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwLeafletPage">
+ <property name="name">sub</property>
+ <property name="child">
+ <object class="GtkBox" id="sub_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwHeaderBar" id="sub_header">
+ <property name="show-end-title-buttons">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkButton" id="button_back">
+ <property name="can_focus">True</property>
+ <signal name="clicked" handler="gs_shell_back_button_cb"/>
+ <accessibility>
+ <property name="label" translatable="yes">Go back</property>
+ </accessibility>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="back_image">
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon-size">normal</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="title">
+ <object class="GtkLabel" id="sub_page_header_title">
+ <property name="selectable">False</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="title"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStack" id="stack_sub">
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hhomogeneous">False</property>
+ <property name="vhomogeneous">False</property>
+ <signal name="notify::visible-child" handler="stack_notify_visible_child_cb"/>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">moderate</property>
+ <property name="child">
+ <object class="GsModeratePage" id="moderate_page">
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">category</property>
+ <property name="child">
+ <object class="GsCategoryPage" id="category_page">
+ <signal name="app-clicked" handler="category_page_app_clicked_cb"/>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">extras</property>
+ <property name="child">
+ <object class="GsExtrasPage" id="extras_page">
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="AdwLeafletPage">
+ <property name="name">details</property>
+ <property name="child">
+ <object class="GtkBox" id="details_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwHeaderBar" id="details_header">
+ <property name="hexpand">True</property>
+ <property name="show-end-title-buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle">
+ <property name="title" bind-source="details_page" bind-property="title" bind-flags="sync-create"/>
+ </object>
+ </property>
+ <child>
+ <object class="GtkButton" id="button_back2">
+ <property name="can_focus">True</property>
+ <signal name="clicked" handler="gs_shell_details_back_button_cb"/>
+ <accessibility>
+ <property name="label" translatable="yes">Go back</property>
+ </accessibility>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon-size">normal</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GsDetailsPage" id="details_page">
+ <property name="is-narrow" bind-source="GsShell" bind-property="is-narrow" bind-flags="sync-create"/>
+ <signal name="metainfo-loaded" handler="gs_shell_details_page_metainfo_loaded_cb"/>
+ <signal name="app-clicked" handler="details_page_app_clicked_cb"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="AdwViewStackPage">
+ <property name="name">loading</property>
+ <property name="child">
+ <object class="GtkOverlay">
+ <child type="overlay">
+ <object class="GtkHeaderBar">
+ <property name="show_title_buttons">True</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkWindowHandle">
+ <child>
+ <object class="GsLoadingPage" id="loading_page">
+ <signal name="refreshed" handler="initial_refresh_done"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-star-image.c b/src/gs-star-image.c
new file mode 100644
index 0000000..f5fb14f
--- /dev/null
+++ b/src/gs-star-image.c
@@ -0,0 +1,254 @@
+/* -*- 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+
+ */
+
+/**
+ * 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 star image can be
+ * drawn as filled only partially or fully or not at all. This is accomplished
+ * by using a `color` style property for the filled part. The unfilled part of
+ * the star currently uses a hardcoded colour.
+ * The `background` style property controls the area outside the star.
+ *
+ * Since: 41
+ */
+
+#include "config.h"
+
+#include "gs-star-image.h"
+
+#include <adwaita.h>
+
+struct _GsStarImage
+{
+ GtkWidget parent_instance;
+
+ gdouble fraction;
+};
+
+G_DEFINE_TYPE (GsStarImage, gs_star_image, GTK_TYPE_WIDGET)
+
+enum {
+ PROP_FRACTION = 1
+};
+
+static void
+gs_star_image_outline_star (cairo_t *cr,
+ gint x,
+ gint y,
+ gint radius,
+ gint *out_min_x,
+ gint *out_max_x)
+{
+ /* Coordinates of the vertices of the star,
+ * where (0, 0) is the centre of the star.
+ * These range from -1 to +1 in both dimensions,
+ * and will be scaled to @radius when drawn. */
+ const struct _points {
+ gdouble x, y;
+ } small_points[] = {
+ { 0.000000, -1.000000 },
+ { -1.000035, -0.424931 },
+ { -0.668055, 0.850680 },
+ { 0.668055, 0.850680 },
+ { 1.000035, -0.424931 }
+ }, large_points[] = {
+ { 0.000000, -1.000000 },
+ { -1.000035, -0.325033 },
+ { -0.618249, 0.850948 },
+ { 0.618249, 0.850948 },
+ { 1.000035, -0.325033 }
+ }, *points;
+ gint ii, nn = G_N_ELEMENTS (small_points), xx, yy;
+
+ /* Safety check */
+ G_STATIC_ASSERT (G_N_ELEMENTS (small_points) == G_N_ELEMENTS (large_points));
+
+ if (radius <= 0)
+ return;
+
+ /* An arbitrary number, since which the math-precise star looks fine,
+ * while it looks odd for lower sizes. */
+ if (radius * 2 > 20)
+ points = large_points;
+ else
+ points = small_points;
+
+ cairo_translate (cr, radius, radius);
+
+ xx = points[0].x * radius;
+ yy = points[0].y * radius;
+
+ if (out_min_x)
+ *out_min_x = xx;
+
+ if (out_max_x)
+ *out_max_x = xx;
+
+ cairo_move_to (cr, xx, yy);
+
+ for (ii = 2; ii <= 2 * nn; ii += 2) {
+ xx = points[ii % nn].x * radius;
+ yy = points[ii % nn].y * radius;
+
+ if (out_min_x && *out_min_x > xx)
+ *out_min_x = xx;
+
+ if (out_max_x && *out_max_x < xx)
+ *out_max_x = xx;
+
+ cairo_line_to (cr, xx, yy);
+ }
+}
+
+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;
+ 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;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+gs_star_image_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ GtkAllocation allocation;
+ cairo_t *cr;
+ gdouble fraction;
+ gint radius;
+
+ fraction = gs_star_image_get_fraction (GS_STAR_IMAGE (widget));
+
+ gtk_widget_get_allocation (widget, &allocation);
+
+ radius = MIN (allocation.width, allocation.height) / 2;
+
+ cr = gtk_snapshot_append_cairo (snapshot,
+ &GRAPHENE_RECT_INIT (0, 0,
+ gtk_widget_get_width (widget),
+ gtk_widget_get_height (widget)));
+
+ if (radius > 0) {
+ GtkStyleContext *style_context;
+ GdkRGBA star_bg = { 1, 1, 1, 1 };
+ GdkRGBA star_fg;
+ gint min_x = -radius, max_x = radius;
+
+ style_context = gtk_widget_get_style_context (widget);
+ gtk_style_context_get_color (style_context, &star_fg);
+
+ gtk_style_context_lookup_color (style_context, "card_fg_color", &star_bg);
+ if (adw_style_manager_get_high_contrast (adw_style_manager_get_default ()))
+ star_bg.alpha *= 0.4;
+ else
+ star_bg.alpha *= 0.2;
+
+ cairo_save (cr);
+ gs_star_image_outline_star (cr, allocation.x, allocation.y, radius, &min_x, &max_x);
+ cairo_clip (cr);
+ gdk_cairo_set_source_rgba (cr, &star_bg);
+ cairo_rectangle (cr, -radius, -radius, 2 * radius, 2 * radius);
+ cairo_fill (cr);
+
+ gdk_cairo_set_source_rgba (cr, &star_fg);
+ if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
+ cairo_rectangle (cr, max_x - (max_x - min_x) * fraction, -radius, (max_x - min_x) * fraction, 2 * radius);
+ else
+ cairo_rectangle (cr, min_x, -radius, (max_x - min_x) * fraction, 2 * radius);
+ cairo_fill (cr);
+ cairo_restore (cr);
+ }
+
+ cairo_destroy (cr);
+}
+
+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;
+
+ 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));
+
+ gtk_widget_class_set_css_name (widget_class, "star-image");
+}
+
+static void
+gs_star_image_init (GsStarImage *self)
+{
+ self->fraction = 1.0;
+
+ gtk_widget_set_size_request (GTK_WIDGET (self), 16, 16);
+}
+
+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;
+
+ 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;
+}
diff --git a/src/gs-star-image.h b/src/gs-star-image.h
new file mode 100644
index 0000000..f1f99fe
--- /dev/null
+++ b/src/gs-star-image.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:
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+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);
+
+G_END_DECLS
diff --git a/src/gs-star-widget.c b/src/gs-star-widget.c
new file mode 100644
index 0000000..1d41705
--- /dev/null
+++ b/src/gs-star-widget.c
@@ -0,0 +1,337 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <math.h>
+
+#include "gs-common.h"
+#include "gs-star-image.h"
+#include "gs-star-widget.h"
+
+typedef struct
+{
+ gboolean interactive;
+ 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);
+}
+
+/* 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 ();
+ gtk_widget_set_size_request (im, (gint) priv->icon_size, (gint) priv->icon_size);
+
+ priv->images[i] = im;
+
+ /* create button */
+ if (priv->interactive) {
+ 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);
+ } else {
+ w = im;
+ }
+ gtk_widget_set_sensitive (w, priv->interactive);
+ gtk_style_context_add_class (gtk_widget_get_style_context (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..cea1557
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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..d738e30
--- /dev/null
+++ b/src/gs-star-widget.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsStarWidget" parent="GtkWidget">
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="spacing">2</property>
+ <style>
+ <class name="star"/>
+ </style>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-storage-context-dialog.c b/src/gs-storage-context-dialog.c
new file mode 100644
index 0000000..e0ca377
--- /dev/null
+++ b/src/gs-storage-context-dialog.c
@@ -0,0 +1,412 @@
+/* -*- 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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/**
+ * 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 <adwaita.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <locale.h>
+
+#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 application 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,
+ _("Application Data"),
+ _("Data needed for the application 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 application"));
+ 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 application 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 application"));
+ 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)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+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..e1ff22b
--- /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 <pwithnall@endlessos.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#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..de2f589
--- /dev/null
+++ b/src/gs-storage-context-dialog.ui
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsStorageContextDialog" parent="GsInfoWindow">
+ <property name="title" translatable="yes" comments="Translators: This is the title of the dialog which contains information about the storage or download size needed for an app">Storage</property>
+ <child>
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">16</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+
+ <child>
+ <object class="GsLozenge" id="lozenge">
+ <property name="circular">False</property>
+ <style>
+ <class name="large"/>
+ <class name="grey"/>
+ </style>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="justify">center</property>
+ <!-- this is a placeholder: the text is actually set in code -->
+ <property name="label">Shortwave works on this device</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0.5</property>
+ <style>
+ <class name="title-2"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkListBox" id="sizes_list">
+ <property name="selection_mode">none</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ <!-- Rows are added in code -->
+ <placeholder/>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkLabel" id="manage_storage_label">
+ <!-- The ‘dummy’ URI is ignored in the activate-link handler, but needs to be specified as otherwise GTK complains that no href is set -->
+ <property name="label" translatable="yes" comments="Translators: Please do not translate the markup or link href">Cached data can be cleared from the &lt;a href="dummy"&gt;_application settings&lt;/a&gt;.</property>
+ <property name="margin-top">16</property>
+ <property name="use-markup">True</property>
+ <property name="use-underline">True</property>
+ <signal name="activate-link" handler="manage_storage_activate_link_cb"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+
+ <object class="GtkSizeGroup" id="lozenge_size_group">
+ <property name="mode">horizontal</property>
+ </object>
+</interface>
diff --git a/src/gs-summary-tile.c b/src/gs-summary-tile.c
new file mode 100644
index 0000000..dcd977b
--- /dev/null
+++ b/src/gs-summary-tile.c
@@ -0,0 +1,253 @@
+/* -*- 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 <mclasen@redhat.com>
+ * Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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 *name;
+ GtkWidget *summary;
+ GtkWidget *bin;
+ GtkWidget *stack;
+ gint preferred_width;
+};
+
+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);
+ GsApp *app = gs_app_tile_get_app (self);
+ g_autoptr(GIcon) icon = NULL;
+ 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]);
+
+ icon = gs_app_get_icon_for_size (app,
+ gtk_image_get_pixel_size (GTK_IMAGE (tile->image)),
+ gtk_widget_get_scale_factor (tile->image),
+ "system-component-application");
+ gtk_image_set_from_gicon (GTK_IMAGE (tile->image), icon);
+
+ 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_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->preferred_width = -1;
+ gtk_widget_init_template (GTK_WIDGET (tile));
+}
+
+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;
+
+ 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,
+ 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..c9c16ef
--- /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 <mclasen@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..b7016d1
--- /dev/null
+++ b/src/gs-summary-tile.ui
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsSummaryTile" parent="GsAppTile">
+ <property name="hexpand">True</property>
+ <!-- This is the minimum (sic!) width of a tile when the GtkFlowBox parent container switches to 3 columns -->
+ <property name="preferred-width">270</property>
+ <style>
+ <class name="card"/>
+ <class name="activatable"/>
+ </style>
+ <child>
+ <object class="GtkStack" id="stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">waiting</property>
+ <property name="child">
+ <object class="GtkImage" id="waiting">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="pixel-size">16</property>
+ <property name="icon-name">content-loading-symbolic</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">content</property>
+ <property name="child">
+ <object class="GtkOverlay" id="overlay">
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <child type="overlay">
+ <object class="AdwBin" id="bin">
+ <property name="visible">False</property>
+ <property name="halign">end</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkImage" id="installed-icon">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="pixel-size">16</property>
+ <property name="margin-top">9</property>
+ <property name="margin-end">9</property>
+ <property name="icon-name">app-installed-symbolic</property>
+ <style>
+ <class name="success"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid">
+ <property name="margin-top">17</property>
+ <property name="margin-bottom">17</property>
+ <property name="margin-start">17</property>
+ <property name="margin-end">17</property>
+ <property name="row-spacing">1</property>
+ <property name="column-spacing">14</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="pixel-size">64</property>
+ <style>
+ <class name="icon-dropshadow"/>
+ </style>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="name">
+ <property name="ellipsize">end</property>
+ <property name="xalign">0.0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ <style>
+ <class name="app-tile-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="summary">
+ <property name="ellipsize">end</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">0.0</property>
+ <property name="lines">2</property>
+ <property name="vexpand">True</property>
+ <property name="single-line-mode">True</property>
+ <property name="wrap">True</property>
+ <style>
+ <class name="app-tile-label"/>
+ </style>
+ </object>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">1</property>
+ <property name="row-span">1</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c
new file mode 100644
index 0000000..fc14f2b
--- /dev/null
+++ b/src/gs-update-dialog.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) 2013-2016 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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
+{
+ AdwWindow parent_instance;
+
+ GCancellable *cancellable;
+ GsPluginLoader *plugin_loader;
+ GsApp *app;
+ GtkWidget *leaflet;
+ GtkWidget *list_box_installed_updates;
+ GtkWidget *spinner;
+ GtkWidget *stack;
+ AdwWindowTitle *window_title;
+ gboolean showing_installed_updates;
+};
+
+G_DEFINE_TYPE (GsUpdateDialog, gs_update_dialog, ADW_TYPE_WINDOW)
+
+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
+leaflet_child_transition_cb (AdwLeaflet *leaflet, GParamSpec *pspec, GsUpdateDialog *dialog)
+{
+ GtkWidget *child;
+
+ if (adw_leaflet_get_child_transition_running (leaflet))
+ return;
+
+ while ((child = adw_leaflet_get_adjacent_child (leaflet, ADW_NAVIGATION_DIRECTION_FORWARD)))
+ adw_leaflet_remove (leaflet, child);
+
+ child = adw_leaflet_get_visible_child (leaflet);
+ if (child != NULL && g_object_class_find_property (G_OBJECT_CLASS (GTK_WIDGET_GET_CLASS (child)), "title") != NULL) {
+ g_autofree gchar *title = NULL;
+ g_object_get (G_OBJECT (child), "title", &title, NULL);
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ } else if (dialog->showing_installed_updates) {
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Installed Updates"));
+ } else {
+ gtk_window_set_title (GTK_WINDOW (dialog), "");
+ }
+}
+
+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;
+ }
+
+ gtk_spinner_stop (GTK_SPINNER (dialog->spinner));
+
+ /* 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 applications */
+ 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(GsPluginJob) plugin_job = NULL;
+
+ dialog->showing_installed_updates = TRUE;
+
+ /* TRANSLATORS: this is the title of the installed updates dialog window */
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Installed Updates"));
+
+ gtk_spinner_start (GTK_SPINNER (dialog->spinner));
+ gtk_stack_set_visible_child_name (GTK_STACK (dialog->stack), "spinner");
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION,
+ NULL);
+ 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 = gtk_window_get_focus (GTK_WINDOW (widget));
+ if (GTK_IS_LABEL (focus))
+ gtk_label_select_region (GTK_LABEL (focus), 0, 0);
+}
+
+static void
+back_clicked_cb (GtkWidget *widget, GsUpdateDialog *dialog)
+{
+ adw_leaflet_navigate (ADW_LEAFLET (dialog->leaflet), ADW_NAVIGATION_DIRECTION_BACK);
+}
+
+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);
+ gs_os_update_page_set_show_back_button (GS_OS_UPDATE_PAGE (page), dialog->showing_installed_updates);
+ } else {
+ page = gs_app_details_page_new ();
+ gs_app_details_page_set_app (GS_APP_DETAILS_PAGE (page), app);
+ }
+
+ g_signal_connect (page, "back-clicked",
+ G_CALLBACK (back_clicked_cb), dialog);
+
+ gtk_widget_show (page);
+
+ adw_leaflet_append (ADW_LEAFLET (dialog->leaflet), page);
+ adw_leaflet_set_visible_child (ADW_LEAFLET (dialog->leaflet), 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) {
+ GtkWidget *child;
+
+ child = adw_leaflet_get_visible_child (ADW_LEAFLET (dialog->leaflet));
+ adw_leaflet_remove (ADW_LEAFLET (dialog->leaflet), child);
+
+ gs_update_dialog_show_update_details (dialog, dialog->app);
+
+ child = adw_leaflet_get_visible_child (ADW_LEAFLET (dialog->leaflet));
+ /* It can be either the app details page or the OS update page */
+ if (GS_IS_APP_DETAILS_PAGE (child))
+ gs_app_details_page_set_show_back_button (GS_APP_DETAILS_PAGE (child), FALSE);
+ } 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)
+{
+ 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, leaflet);
+ 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_callback (widget_class, leaflet_child_transition_cb);
+
+ gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL);
+}
+
+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..5e177eb
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2014-2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+#include <gtk/gtk.h>
+
+#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, AdwWindow)
+
+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..9dc9f21
--- /dev/null
+++ b/src/gs-update-dialog.ui
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsUpdateDialog" parent="AdwWindow">
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="icon_name">dialog-information</property>
+ <property name="title"></property>
+ <property name="default-width">640</property>
+ <property name="default-height">576</property>
+
+ <child>
+ <object class="AdwLeaflet" id="leaflet">
+ <property name="can-navigate-back">True</property>
+ <property name="can-unfold">False</property>
+ <!-- We need both signals to support the animations being disabled, as
+ notify::child-transition-running isn't emitted in that case. -->
+ <signal name="notify::visible-child" handler="leaflet_child_transition_cb" swapped="no"/>
+ <signal name="notify::child-transition-running" handler="leaflet_child_transition_cb" swapped="no"/>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="AdwHeaderBar">
+ <property name="valign">start</property>
+ <property name="show_start_title_buttons">True</property>
+ <property name="show_end_title_buttons">True</property>
+ <property name="title-widget">
+ <object class="AdwWindowTitle" id="window_title">
+ <property name="title" bind-source="GsUpdateDialog" bind-property="title" bind-flags="sync-create"/>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="transition_duration">300</property>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="GtkBox" id="box_spinner">
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ <child>
+ <object class="GtkSpinner" id="spinner">
+ <property name="width_request">32</property>
+ <property name="height_request">32</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="fade-in"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">empty</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="icon_name">org.gnome.Software-symbolic</property>
+ <property name="title" translatable="yes">No Updates Installed</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">installed-updates-list</property>
+ <property name="child">
+ <object class="AdwPreferencesPage">
+ <child>
+ <object class="AdwPreferencesGroup">
+ <child>
+ <object class="GsUpdateList" id="list_box_installed_updates">
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-update-list.c b/src/gs-update-list.c
new file mode 100644
index 0000000..5e9562c
--- /dev/null
+++ b/src/gs-update-list.c
@@ -0,0 +1,150 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#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_show (app_row);
+}
+
+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 g_strcmp0 (gs_app_get_name (a1), gs_app_get_name (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_style_context_add_class (gtk_widget_get_style_context (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..eda8c49
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2014-2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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..d46f6d0
--- /dev/null
+++ b/src/gs-update-monitor.c
@@ -0,0 +1,1476 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2013 Matthias Clasen <mclasen@redhat.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gsettings-desktop-schemas/gdesktop-enums.h>
+#include <locale.h>
+
+#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 */
+};
+
+G_DEFINE_TYPE (GsUpdateMonitor, gs_update_monitor, G_TYPE_OBJECT)
+
+typedef struct {
+ GsUpdateMonitor *monitor;
+} 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, &timestamp_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://wiki.gnome.org/Design/Apps/Software/Updates#Tentative_Design */
+static gboolean
+should_notify_about_pending_updates (GsUpdateMonitor *monitor,
+ GsAppList *apps,
+ 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", &timestamp_days)) {
+ /* Large-enough number to succeed for the initial test */
+ timestamp_days = 365;
+ }
+
+ should_download = should_download_updates (monitor);
+ check_updates_kind (apps, &has_important, &all_downloaded, &any_downloaded);
+
+ if (!gs_app_list_length (apps)) {
+ /* Notify only when the download is disabled and it's the 4th day or it's more than 7 days */
+ if (!should_download && (timestamp_days >= 7 || timestamp_days == 4)) {
+ *out_title = _("Software Updates Are Out of Date");
+ *out_body = _("Please check for software updates.");
+ res = TRUE;
+ }
+ } else if (has_important) {
+ if (timestamp_days >= 1) {
+ if (all_downloaded) {
+ *out_title = _("Critical Software Update Ready to Install");
+ *out_body = _("An important software update is ready to be installed.");
+ res = TRUE;
+ } else if (!should_download) {
+ *out_title = _("Critical Software Updates Available to Download");
+ *out_body = _("Important: critical software updates are waiting.");
+ res = TRUE;
+ }
+ }
+ } else if (all_downloaded) {
+ if (timestamp_days >= 3) {
+ *out_title = _("Software Updates Ready to Install");
+ *out_body = _("Software updates are waiting and ready to be installed.");
+ 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 = _("Software Updates Available to Download");
+ *out_body = _("Please download waiting software updates.");
+ res = TRUE;
+ }
+
+ g_debug ("%s: last_test_days:%" G_GINT64_FORMAT " n-apps:%u should_download:%d has_important:%d "
+ "all_downloaded:%d any_downloaded:%d res:%d%s%s%s%s", G_STRFUNC,
+ timestamp_days, gs_app_list_length (apps), should_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)
+{
+ 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, &title, &body)) {
+ g_debug ("No update notification needed");
+ return;
+ }
+
+ /* 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 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 (gs_app_list_length (apps) ||
+ 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 applications 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 Application Updated — Restart Required",
+ "%u Applications 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 Application Updated",
+ "%u Applications 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 application 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 application."));
+ }
+
+ /* 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 application 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 application needs restarting */
+ g_string_append_printf (body, ngettext ("%u application requires a restart.",
+ "%u applications 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 application 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 application needs restarting */
+ g_string_append_printf (body, ngettext ("%u application requires a restart.",
+ "%u applications 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);
+}
+
+static void
+update_finished_cb (GObject *object, GAsyncResult *res, gpointer data)
+{
+ GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (data);
+ 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_error (plugin_loader,
+ NULL,
+ GS_PLUGIN_ACTION_UPDATE,
+ NULL,
+ TRUE,
+ 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 data)
+{
+ GsUpdateMonitor *monitor = GS_UPDATE_MONITOR (data);
+ 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;
+
+ /* get result */
+ list = gs_plugin_loader_job_process_finish (plugin_loader, res, &error);
+ if (list == NULL) {
+ gs_plugin_loader_claim_error (plugin_loader,
+ NULL,
+ GS_PLUGIN_ACTION_DOWNLOAD,
+ NULL,
+ TRUE,
+ error);
+ return;
+ }
+
+ update_online = gs_app_list_new ();
+ update_offline = gs_app_list_new ();
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, 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_newv (GS_PLUGIN_ACTION_UPDATE,
+ "list", update_online,
+ "propagate-error", TRUE,
+ NULL);
+ gs_plugin_loader_job_process_async (monitor->plugin_loader,
+ plugin_job,
+ monitor->update_cancellable,
+ update_finished_cb,
+ monitor);
+ }
+
+ /* show a notification for offline updates */
+ if (gs_app_list_length (update_offline) > 0)
+ notify_about_pending_updates (monitor, update_offline);
+}
+
+static void
+get_updates_finished_cb (GObject *object, GAsyncResult *res, gpointer data)
+{
+ g_autoptr(DownloadUpdatesData) download_updates_data = (DownloadUpdatesData *) data;
+ GsUpdateMonitor *monitor = download_updates_data->monitor;
+ guint64 security_timestamp = 0;
+ guint64 security_timestamp_old = 0;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GsAppList) apps = NULL;
+ 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);
+ return;
+ }
+
+ /* 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, or clear timestamp if there are now none */
+ g_settings_get (monitor->settings,
+ "security-timestamp", "x", &security_timestamp_old);
+ 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_monotonic_time ();
+ break;
+ }
+ }
+ if (security_timestamp_old != security_timestamp) {
+ 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);
+
+ if (should_download &&
+ (security_timestamp_old != security_timestamp ||
+ check_if_timestamp_more_than_days_ago (monitor, "install-timestamp", 14))) {
+ g_autoptr(GsPluginJob) plugin_job = 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_newv (GS_PLUGIN_ACTION_DOWNLOAD,
+ "list", apps,
+ "propagate-error", TRUE,
+ NULL);
+ g_debug ("Getting updates");
+ gs_plugin_loader_job_process_async (monitor->plugin_loader,
+ plugin_job,
+ monitor->refresh_cancellable,
+ download_finished_cb,
+ monitor);
+ } 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;
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_DOWNLOAD,
+ "list", update_online,
+ "propagate-error", TRUE,
+ NULL);
+ 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,
+ monitor);
+ }
+
+ if (should_download)
+ notify_list = update_offline;
+ else
+ notify_list = apps;
+
+ notify_about_pending_updates (monitor, notify_list);
+ }
+}
+
+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 (_("Operating System Updates Unavailable"));
+ /* TRANSLATORS: this is the message dialog for the distro EOL notice */
+ g_notification_set_body (n, _("Upgrade to continue receiving security 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)
+{
+ 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);
+
+ /* NOTE: this doesn't actually do any network access */
+ g_debug ("Getting updates");
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_SEVERITY,
+ NULL);
+ 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);
+}
+
+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;
+ }
+
+ /* 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_autoptr(GsApp) app = NULL;
+
+ 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 ();
+ g_settings_set (monitor->settings, "check-timestamp", "x",
+ g_date_time_to_unix (now));
+
+ get_updates (monitor);
+}
+
+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
+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_newv (GS_PLUGIN_ACTION_INSTALL,
+ "app", app,
+ NULL);
+ 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);
+}
+
+static void
+check_updates (GsUpdateMonitor *monitor)
+{
+ gint64 tmp;
+ gboolean refresh_on_metered;
+ g_autoptr(GDateTime) last_refreshed = NULL;
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ /* never check for updates when offline */
+ if (!gs_plugin_loader_get_network_available (monitor->plugin_loader))
+ return;
+
+ /* check for language pack */
+ check_language_pack (monitor);
+
+#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))
+ 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 updates on low power");
+ return;
+ }
+ }
+ } else {
+ g_debug ("no UPower support, so not doing power level checks");
+ }
+
+#if GLIB_CHECK_VERSION(2, 69, 1)
+ /* never refresh when in power saver mode */
+ if (monitor->power_profile_monitor != NULL) {
+ if (g_power_profile_monitor_get_power_saver_enabled (monitor->power_profile_monitor)) {
+ g_debug ("Not getting updates with power saver enabled");
+ return;
+ }
+ } else {
+ g_debug ("No power profile monitor support, so not doing power profile checks");
+ }
+#endif
+
+ 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_year, now_month, now_day, now_hour;
+ gint year, month, day;
+ g_autoptr(GDateTime) now = NULL;
+
+ now = g_date_time_new_now_local ();
+
+ g_date_time_get_ymd (now, &now_year, &now_month, &now_day);
+ now_hour = g_date_time_get_hour (now);
+
+ g_date_time_get_ymd (last_refreshed, &year, &month, &day);
+
+ /* check that it is the next day */
+ if (!((now_year > year) ||
+ (now_year == year && now_month > month) ||
+ (now_year == year && now_month == month && now_day > day)))
+ return;
+
+ /* ...and past 6am */
+ if (!(now_hour >= 6))
+ return;
+ }
+
+ if (!should_download_updates (monitor)) {
+ get_updates (monitor);
+ return;
+ }
+
+ g_debug ("Daily update check due");
+ 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 *app;
+ const gchar *message;
+ const gchar *title;
+ guint64 time_last_notified;
+ 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, _("An important operating system update failed to be 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, "updates-available");
+ return;
+ }
+
+ /* have we notified about this before */
+ app = gs_app_list_index (apps, 0);
+ g_settings_get (monitor->settings,
+ "install-timestamp", "x", &time_last_notified);
+ if (time_last_notified >= gs_app_get_install_date (app))
+ return;
+
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_OPERATING_SYSTEM) {
+ /* 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 (app),
+ gs_app_get_version (app));
+ g_notification_set_body (notification, message);
+ } else {
+ /* 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 application 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", gs_app_get_install_date (app));
+
+ reset_update_notification_timestamp (monitor);
+}
+
+static gboolean
+cleanup_notifications_cb (gpointer user_data)
+{
+ GsUpdateMonitor *monitor = user_data;
+ 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");
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES_HISTORICAL,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION,
+ NULL);
+ 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, "updates-available");
+
+ 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 (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);
+
+ /* 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..0d39f52
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#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..4456ddd
--- /dev/null
+++ b/src/gs-updates-page.c
@@ -0,0 +1,1467 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#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"
+
+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_download;
+ 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;
+ GtkWidget *scrolledwindow_updates;
+ GtkWidget *spinner_updates;
+ GtkWidget *stack_updates;
+ GtkWidget *upgrade_banner;
+ GtkWidget *infobar_end_of_life;
+ GtkWidget *label_end_of_life;
+
+ 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;
+};
+
+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_state (app) == GS_APP_STATE_UPDATABLE_LIVE ||
+ gs_app_get_state (app) == GS_APP_STATE_INSTALLING) {
+ 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)
+ ++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_string (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);
+ gtk_label_set_label (self->uptodate_description, last_checked);
+ gtk_widget_set_visible (GTK_WIDGET (self->uptodate_description), 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);
+ }
+}
+
+static void
+gs_updates_page_update_ui_state (GsUpdatesPage *self)
+{
+ 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:
+ case GS_UPDATES_PAGE_STATE_ACTION_REFRESH:
+ gtk_spinner_start (GTK_SPINNER (self->spinner_updates));
+ break;
+ default:
+ gtk_spinner_stop (GTK_SPINNER (self->spinner_updates));
+ gtk_spinner_stop (GTK_SPINNER (self->header_spinner_start));
+ gtk_widget_hide (self->header_spinner_start);
+ 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_show (self->button_refresh);
+ break;
+ case GS_UPDATES_PAGE_STATE_STARTUP:
+ case GS_UPDATES_PAGE_STATE_MANAGED:
+ gtk_widget_hide (self->button_refresh);
+ break;
+ case GS_UPDATES_PAGE_STATE_IDLE:
+ gtk_button_set_icon_name (GTK_BUTTON (self->button_refresh), "view-refresh-symbolic");
+ if (self->result_flags != GS_UPDATES_PAGE_FLAG_NONE) {
+ gtk_widget_show (self->button_refresh);
+ } 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_show (self->button_refresh);
+ 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:
+ gtk_stack_set_visible_child_name (GTK_STACK (self->stack_updates),
+ "spinner");
+ break;
+ 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 */
+ if (g_strcmp0 (gtk_stack_get_visible_child_name (GTK_STACK (self->stack_updates)), "uptodate") == 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) {
+ 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);
+ adw_status_page_set_description (ADW_STATUS_PAGE (self->updates_failed_page),
+ error->message);
+ gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_FAILED);
+ refresh_headerbar_updates_counter (self);
+ return;
+ }
+
+ /* 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) */
+} GsPageHelper;
+
+static GsPageHelper *
+gs_page_helper_new (GsUpdatesPage *self,
+ GsApp *app)
+{
+ GsPageHelper *helper;
+ helper = g_slice_new0 (GsPageHelper);
+ helper->self = g_object_ref (self);
+ helper->app = g_object_ref (app);
+ return helper;
+}
+
+static void
+gs_page_helper_free (GsPageHelper *helper)
+{
+ g_clear_object (&helper->app);
+ 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_autoptr(GError) error = NULL;
+ g_autoptr(GString) str = g_string_new (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) {
+ gtk_info_bar_set_revealed (GTK_INFO_BAR (self->infobar_end_of_life), FALSE);
+ return;
+ }
+
+ /* construct a sufficiently scary message */
+ if (gs_app_get_name (app) != NULL && gs_app_get_version (app) != NULL) {
+ /* TRANSLATORS: the first %s is the distro name, e.g. 'Fedora'
+ * and the second %s is the distro version, e.g. '25' */
+ g_string_append_printf (str, _("%s %s is no longer supported."),
+ gs_app_get_name (app),
+ gs_app_get_version (app));
+ } else {
+ g_string_append (str, _("Your operating system is no longer supported."));
+ }
+ g_string_append (str, " ");
+
+ /* TRANSLATORS: EOL distros do not get important updates */
+ g_string_append (str, _("This means that it does not receive security updates."));
+ g_string_append (str, " ");
+
+ /* TRANSLATORS: upgrade refers to a major update, e.g. Fedora 25 to 26 */
+ g_string_append (str, _("It is recommended that you upgrade to a more recent version."));
+
+ gtk_label_set_label (GTK_LABEL (self->label_end_of_life), str->str);
+ gtk_info_bar_set_revealed (GTK_INFO_BAR (self->infobar_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_DETAILS |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION;
+
+ helper = gs_page_helper_new (self, app);
+ plugin_job = gs_plugin_job_refine_new_for_app (app, refine_flags);
+ gs_plugin_job_set_interactive (plugin_job, TRUE);
+ 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(GsApp) app = 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_DETAILS |
+ GS_PLUGIN_REFINE_FLAGS_REQUIRE_VERSION;
+ gs_updates_page_set_state (self, GS_UPDATES_PAGE_STATE_ACTION_GET_UPDATES);
+ self->action_cnt++;
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_UPDATES,
+ "interactive", TRUE,
+ "refine-flags", refine_flags,
+ "dedupe-flags", GS_APP_LIST_FILTER_FLAG_NONE,
+ NULL);
+ 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) {
+ /* 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);
+ adw_status_page_set_description (ADW_STATUS_PAGE (self->updates_failed_page),
+ error->message);
+ 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_confirm_cb (GtkDialog *dialog,
+ GtkResponseType response_type,
+ GsUpdatesPage *self)
+{
+ /* unmap the dialog */
+ gtk_window_destroy (GTK_WINDOW (dialog));
+
+ switch (response_type) {
+ case GTK_RESPONSE_REJECT:
+ /* open the control center */
+ gs_updates_page_show_network_settings (self);
+ break;
+ case GTK_RESPONSE_ACCEPT:
+ self->has_agreed_to_mobile_data = TRUE;
+ gs_updates_page_get_new_updates (self);
+ break;
+ case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_DELETE_EVENT:
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+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)
+{
+ GtkWidget *dialog;
+ GtkWindow *parent_window = GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_WINDOW));
+
+ /* 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;
+ }
+ dialog = gtk_message_dialog_new (parent_window,
+ GTK_DIALOG_MODAL |
+ GTK_DIALOG_USE_HEADER_BAR |
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CANCEL,
+ /* TRANSLATORS: this is to explain that downloading updates may cost money */
+ _("Charges May Apply"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ /* TRANSLATORS: we need network
+ * to do the updates check */
+ _("Checking for updates while using mobile broadband could cause you to incur charges."));
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: this is a link to the
+ * control-center network panel */
+ _("Check _Anyway"),
+ GTK_RESPONSE_ACCEPT);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_updates_page_refresh_confirm_cb),
+ self);
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (dialog));
+
+ /* no network connection */
+ } else {
+ dialog = gtk_message_dialog_new (parent_window,
+ GTK_DIALOG_MODAL |
+ GTK_DIALOG_USE_HEADER_BAR |
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CANCEL,
+ /* TRANSLATORS: can't do updates check */
+ _("No Network"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ /* TRANSLATORS: we need network
+ * to do the updates check */
+ _("Internet access is required to check for updates."));
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ /* TRANSLATORS: this is a link to the
+ * control-center network panel */
+ _("Network Settings"),
+ GTK_RESPONSE_REJECT);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (gs_updates_page_refresh_confirm_cb),
+ self);
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (dialog));
+ }
+}
+
+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;
+
+ 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;
+ g_warning ("failed to upgrade-download: %s", error->message);
+ }
+}
+
+static void
+gs_updates_page_upgrade_download_cb (GsUpgradeBanner *upgrade_banner,
+ GsUpdatesPage *self)
+{
+ GsApp *app;
+ GsPageHelper *helper;
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ app = gs_upgrade_banner_get_app (upgrade_banner);
+ if (app == NULL) {
+ g_warning ("no upgrade available to download");
+ return;
+ }
+
+ helper = gs_page_helper_new (self, app);
+
+ if (self->cancellable_upgrade_download != NULL)
+ g_object_unref (self->cancellable_upgrade_download);
+ self->cancellable_upgrade_download = g_cancellable_new ();
+ g_debug ("Starting upgrade download with cancellable %p", self->cancellable_upgrade_download);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD,
+ "interactive", TRUE,
+ "app", app,
+ NULL);
+ gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job,
+ self->cancellable_upgrade_download,
+ 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_newv (GS_PLUGIN_ACTION_UPDATE_CANCEL,
+ "app", app,
+ NULL);
+ 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;
+
+ /* 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;
+ }
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPGRADE_TRIGGER,
+ "interactive", TRUE,
+ "app", upgrade,
+ NULL);
+ gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job,
+ self->cancellable,
+ 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);
+ gs_shell_modal_dialog_present (self->shell, GTK_WINDOW (dialog));
+}
+
+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:
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static void
+gs_updates_page_changed_cb (GsPluginLoader *plugin_loader,
+ GsUpdatesPage *self)
+{
+ /* 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 ("ignoring updates-changed as updates in progress");
+ 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)
+{
+ switch (status) {
+ case GS_PLUGIN_STATUS_INSTALLING:
+ case GS_PLUGIN_STATUS_REMOVING:
+ if (app == NULL ||
+ (gs_app_get_kind (app) != AS_COMPONENT_KIND_OPERATING_SYSTEM &&
+ gs_app_get_id (app) != NULL)) {
+ /* if we do a install or remove then make sure all new
+ * packages are downloaded */
+ gs_updates_page_invalidate_downloaded_upgrade (self);
+ }
+ break;
+ default:
+ break;
+ }
+
+ 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 download with %p", self->cancellable_upgrade_download);
+ g_cancellable_cancel (self->cancellable_upgrade_download);
+}
+
+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_download);
+ g_clear_object (&self->cancellable_upgrade_download);
+
+ 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_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;
+
+ 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, scrolledwindow_updates);
+ gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, spinner_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, infobar_end_of_life);
+ gtk_widget_class_bind_template_child (widget_class, GsUpdatesPage, label_end_of_life);
+}
+
+static void
+gs_updates_page_init (GsUpdatesPage *self)
+{
+ 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;
+ 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..05038eb
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..654cbdb
--- /dev/null
+++ b/src/gs-updates-page.ui
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="GsUpdatesPage" parent="GsPage">
+ <accessibility>
+ <property name="label" translatable="yes">Updates page</property>
+ </accessibility>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkInfoBar" id="infobar_end_of_life">
+ <property name="revealed">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Operating System Updates Unavailable</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_end_of_life">
+ <property name="label">Your operating system is no longer supported. This means that it does not receive security updates. It is recommended that you upgrade to a more recent version.</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack_updates">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">spinner</property>
+ <property name="child">
+ <object class="AdwClamp">
+ <property name="valign">center</property>
+ <!-- We explicitly want to use the default AdwClamp sizes here,
+ as does AdwStatusPage. -->
+ <style>
+ <class name="status-page"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <property name="halign">center</property>
+ <style>
+ <class name="iconbox"/>
+ </style>
+ <child>
+ <object class="GtkSpinner" id="spinner_updates">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="icon"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_updates_spinner">
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="justify">center</property>
+ <property name="label" translatable="yes" comments="TRANSLATORS: the updates panel is starting up.">Loading Updates…</property>
+ <style>
+ <class name="title"/>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="justify">center</property>
+ <property name="use-markup">True</property>
+ <property name="label" translatable="yes" comments="TRANSLATORS: the updates panel is starting up.">This could take a while.</property>
+ <style>
+ <class name="body"/>
+ <class name="description"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">view</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="scrolledwindow_updates">
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <style>
+ <class name="list-page"/>
+ </style>
+ <child>
+ <object class="AdwClamp">
+ <property name="maximum-size">600</property>
+ <property name="tightening-threshold">400</property>
+ <child>
+ <object class="GtkBox" id="list_box_updates_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GsUpgradeBanner" id="upgrade_banner">
+ <property name="visible">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">False</property>
+ <property name="margin-top">12</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="updates_box">
+ <property name="orientation">vertical</property>
+ <property name="spacing">24</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">uptodate</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">48</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GsUpgradeBanner" id="upgrade_banner_uptodate">
+ <property name="visible">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ <child>
+
+ <!-- FIXME: This should be a AdwStatusPage but it doesn’t
+ currently support non-icon images
+ See https://gitlab.gnome.org/GNOME/libhandy/-/issues/448 -->
+ <object class="GtkScrolledWindow">
+ <property name="hscrollbar-policy">never</property>
+ <property name="propagate-natural-height">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="fake-adw-status-page"/>
+ </style>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="AdwClamp">
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="pixel-size">300</property>
+ <property name="resource">/org/gnome/Software/up-to-date.svg</property>
+ <style>
+ <class name="icon"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="justify">center</property>
+ <property name="label" translatable="yes" comments="TRANSLATORS: This means all software (plural) installed on this system is up to date.">Up to Date</property>
+ <style>
+ <class name="title"/>
+ <class name="title-1"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="uptodate_description">
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="justify">center</property>
+ <property name="use-markup">True</property>
+ <property name="label">Last checked: HH:MM</property>
+ <style>
+ <class name="body"/>
+ <class name="description"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">mobile</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="icon_name">dialog-warning-symbolic</property>
+ <property name="title" translatable="yes">Use Mobile Data?</property>
+ <property name="description" translatable="yes">Checking for updates when using mobile broadband could cause you to incur charges.</property>
+ <child>
+ <object class="GtkButton" id="button_updates_mobile">
+ <property name="label" translatable="yes">_Check Anyway</property>
+ <property name="use_underline">True</property>
+ <property name="halign">center</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">offline</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="icon_name">network-offline-symbolic</property>
+ <property name="title" translatable="yes">No Connection</property>
+ <property name="description" translatable="yes">Go online to check for updates.</property>
+ <child>
+ <object class="GtkButton" id="button_updates_offline">
+ <property name="label" translatable="yes">_Network Settings</property>
+ <property name="use_underline">True</property>
+ <property name="halign">center</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">failed</property>
+ <property name="child">
+ <object class="AdwStatusPage" id="updates_failed_page">
+ <property name="icon_name">action-unavailable-symbolic</property>
+ <property name="title" translatable="No">Error</property>
+ <property name="description" translatable="No">Failed to get updates.</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">managed</property>
+ <property name="child">
+ <object class="AdwStatusPage">
+ <property name="icon_name">action-unavailable-symbolic</property>
+ <property name="title" translatable="yes">Error</property>
+ <property name="description" translatable="yes">Updates are automatically managed.</property>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-updates-section.c b/src/gs-updates-section.c
new file mode 100644
index 0000000..68d818a
--- /dev/null
+++ b/src/gs-updates-section.c
@@ -0,0 +1,733 @@
+/* -*- 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 <richard@hughsie.com>
+ * Copyright (C) 2014-2018 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include "gs-app-list-private.h"
+#include "gs-app-row.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
+_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;
+ 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_hide (widget);
+}
+
+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_show (GTK_WIDGET (self));
+}
+
+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_hide (GTK_WIDGET (self));
+}
+
+typedef struct {
+ GsUpdatesSection *self;
+ gboolean do_reboot;
+ gboolean do_reboot_notification;
+} GsUpdatesSectionUpdateHelper;
+
+static gchar *
+_get_app_sort_key (GsApp *app)
+{
+ GString *key;
+ g_autofree gchar *sort_name = NULL;
+
+ key = g_string_sized_new (64);
+
+ /* 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;
+ }
+
+ /* 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
+_update_helper_free (GsUpdatesSectionUpdateHelper *helper)
+{
+ 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)
+{
+ GsUpdatesSection *self = GS_UPDATES_SECTION (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)
+{
+ GsUpdatesSection *self = GS_UPDATES_SECTION (user_data);
+ g_autoptr(GError) error = NULL;
+ GsApp *app = 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 */
+ app = gs_app_list_index (self->list, 0);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE_CANCEL,
+ "app", app,
+ NULL);
+ gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job,
+ gs_app_get_cancellable (app),
+ _cancel_trigger_failed_cb,
+ self);
+}
+
+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 void
+_update_buttons (GsUpdatesSection *self)
+{
+ /* operation in progress */
+ if (self->cancellable != NULL) {
+ gtk_widget_set_sensitive (self->button_cancel,
+ !g_cancellable_is_cancelled (self->cancellable));
+ gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "cancel");
+ gtk_widget_show (GTK_WIDGET (self->button_stack));
+ return;
+ }
+
+ if (self->kind == GS_UPDATES_SECTION_KIND_OFFLINE_FIRMWARE ||
+ self->kind == GS_UPDATES_SECTION_KIND_OFFLINE) {
+ if (_all_offline_updates_downloaded (self))
+ gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "update");
+ else
+ gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "download");
+
+ gtk_widget_show (GTK_WIDGET (self->button_stack));
+ /* 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) {
+ gtk_stack_set_visible_child_name (GTK_STACK (self->button_stack), "update");
+ gtk_widget_show (GTK_WIDGET (self->button_stack));
+ /* TRANSLATORS: This is the button for upgrading all
+ * online-updatable applications */
+ gs_progress_button_set_label (GS_PROGRESS_BUTTON (self->button_update), _("Update All"));
+ } else {
+ gtk_widget_hide (GTK_WIDGET (self->button_stack));
+ }
+
+}
+
+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)) {
+ GsApp *app = NULL;
+
+ if (gs_app_list_length (self->list) == 1)
+ app = gs_app_list_index (self->list, 0);
+
+ gs_plugin_loader_claim_error (plugin_loader,
+ NULL,
+ GS_PLUGIN_ACTION_UPDATE,
+ app,
+ TRUE,
+ error);
+ }
+ goto out;
+ }
+
+ /* trigger reboot if any application was not updatable live */
+ if (helper->do_reboot) {
+ gs_utils_invoke_reboot_async (NULL, _reboot_failed_cb, self);
+
+ /* when we are not doing an offline update, show a notification
+ * if any application 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);
+ _update_buttons (self);
+}
+
+static void
+_download_finished_cb (GObject *object, GAsyncResult *res, gpointer user_data)
+{
+ g_autoptr(GsUpdatesSection) self = (GsUpdatesSection *) user_data;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GsAppList) list = NULL;
+
+ /* get result */
+ list = gs_plugin_loader_job_process_finish (GS_PLUGIN_LOADER (object), 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 download updates: %s", error->message);
+ }
+
+ g_clear_object (&self->cancellable);
+ _update_buttons (self);
+}
+
+static void
+_button_download_clicked_cb (GsUpdatesSection *self)
+{
+ g_autoptr(GCancellable) cancellable = g_cancellable_new ();
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ g_set_object (&self->cancellable, cancellable);
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_DOWNLOAD,
+ "list", self->list,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_SIZE,
+ "interactive", TRUE,
+ NULL);
+ gs_plugin_loader_job_process_async (self->plugin_loader, plugin_job,
+ self->cancellable,
+ (GAsyncReadyCallback) _download_finished_cb,
+ g_object_ref (self));
+ _update_buttons (self);
+}
+
+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);
+
+ /* look at each app in turn */
+ for (guint i = 0; i < gs_app_list_length (self->list); i++) {
+ GsApp *app = gs_app_list_index (self->list, i);
+ if (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE)
+ helper->do_reboot = TRUE;
+ if (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_newv (GS_PLUGIN_ACTION_UPDATE,
+ "list", self->list,
+ "interactive", TRUE,
+ "propagate-error", TRUE,
+ NULL);
+ 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), _("Application 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);
+ gs_shell_modal_dialog_present (gs_page_get_shell (self->page), GTK_WINDOW (dialog));
+}
+
+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 ii, len, busy = 0;
+
+ len = gs_app_list_length (list);
+
+ for (ii = 0; ii < len; ii++) {
+ GsApp *app = gs_app_list_index (list, ii);
+ GsAppState state = gs_app_get_state (app);
+
+ if (state == GS_APP_STATE_INSTALLING ||
+ state == GS_APP_STATE_REMOVING) {
+ busy++;
+ }
+ }
+
+ gtk_widget_set_sensitive (self->button_update, busy < len);
+}
+
+static void
+gs_updates_section_init (GsUpdatesSection *self)
+{
+ 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..d558960
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015-2017 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#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..3a1eac3
--- /dev/null
+++ b/src/gs-updates-section.ui
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <template class="GsUpdatesSection" parent="GtkBox">
+ <property name="orientation">vertical</property>
+ <style>
+ <class name="section"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="section_header">
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="can_focus">False</property>
+ <property name="ellipsize">end</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="heading"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="button_stack">
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">download</property>
+ <property name="child">
+ <object class="GsProgressButton" id="button_download">
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Download</property>
+ <signal name="clicked" handler="_button_download_clicked_cb" swapped="yes"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">update</property>
+ <property name="child">
+ <object class="GsProgressButton" id="button_update">
+ <signal name="clicked" handler="_button_update_all_clicked_cb" swapped="yes"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkStackPage">
+ <property name="name">cancel</property>
+ <property name="child">
+ <object class="GsProgressButton" id="button_cancel">
+ <property name="label" translatable="yes">Cancel</property>
+ <signal name="clicked" handler="_button_cancel_clicked_cb" swapped="yes"/>
+ <style>
+ <class name="install-progress"/>
+ </style>
+ </object>
+ </property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="description">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="wrap">True</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="xalign">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="listbox_box">
+ <property name="orientation">vertical</property>
+ <accessibility>
+ <relation name="labelled-by">title</relation>
+ </accessibility>
+ <child>
+ <object class="GtkListBox" id="listbox">
+ <property name="selection_mode">none</property>
+ <property name="valign">start</property>
+ <signal name="row-activated" handler="_app_row_activated_cb" swapped="yes"/>
+ <signal name="keynav-failed" handler="_listbox_keynav_failed_cb" swapped="yes"/>
+ <style>
+ <class name="boxed-list"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-upgrade-banner.c b/src/gs-upgrade-banner.c
new file mode 100644
index 0000000..8a5e6a2
--- /dev/null
+++ b/src/gs-upgrade-banner.c
@@ -0,0 +1,374 @@
+/* -*- 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 <klember@redhat.com>
+ * Copyright (C) 2016 Richard Hughes <richard@hughsie.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+#include <stdlib.h>
+
+#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 *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)
+ */
+ switch (gs_app_get_state (priv->app)) {
+ case GS_APP_STATE_AVAILABLE:
+ case GS_APP_STATE_QUEUED_FOR_INSTALL:
+ gtk_widget_show (priv->box_upgrades_download);
+ gtk_widget_hide (priv->box_upgrades_downloading);
+ gtk_widget_hide (priv->box_upgrades_install);
+ break;
+ case GS_APP_STATE_INSTALLING:
+ gtk_widget_hide (priv->box_upgrades_download);
+ gtk_widget_show (priv->box_upgrades_downloading);
+ gtk_widget_hide (priv->box_upgrades_install);
+ break;
+ case GS_APP_STATE_UPDATABLE:
+ gtk_widget_hide (priv->box_upgrades_download);
+ gtk_widget_hide (priv->box_upgrades_downloading);
+ gtk_widget_show (priv->box_upgrades_install);
+ 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 ("<a href=\"%s\">%s</a>", uri, _("Learn about the new version"));
+ gtk_label_set_markup (GTK_LABEL (priv->label_download_info), link);
+ gtk_widget_show (priv->label_download_info);
+ } 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_show (priv->label_download_info);
+ } else {
+ gtk_widget_hide (priv->label_download_info);
+ }
+
+ /* do a fill bar for the current progress */
+ switch (gs_app_get_state (priv->app)) {
+ case GS_APP_STATE_INSTALLING:
+ 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
+app_state_changed (GsApp *app, GParamSpec *pspec, GsUpgradeBanner *self)
+{
+ g_idle_add (app_refresh_idle, g_object_ref (self));
+}
+
+static void
+app_progress_changed (GsApp *app, GParamSpec *pspec, GsUpgradeBanner *self)
+{
+ g_idle_add (app_refresh_idle, g_object_ref (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, "upgrade-banner-custom", 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_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);
+}
+
+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;
+
+ 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, 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..7aff12b
--- /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 <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <adwaita.h>
+
+#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..3ea236b
--- /dev/null
+++ b/src/gs-upgrade-banner.ui
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GsUpgradeBanner" parent="AdwBin">
+ <child>
+ <object class="GtkBox" id="vbox">
+ <property name="orientation">vertical</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">center</property>
+ <property name="margin-top">12</property>
+ <property name="overflow">hidden</property>
+ <style>
+ <class name="card"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="box_upgrades_info">
+ <property name="orientation">vertical</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="upgrade-banner-background"/>
+ </style>
+ <child>
+ <object class="GtkLabel" id="label_upgrades_title">
+ <property name="margin-top">32</property>
+ <property name="margin_bottom">6</property>
+ <property name="wrap">True</property>
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ <!-- Just a placeholder; actual label text is set in code -->
+ <property name="label">GNOME 3.20 Now Available</property>
+ <attributes>
+ <attribute name="scale" value="2.0"/>
+ <attribute name="weight" value="ultrabold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgrades_summary">
+ <property name="label" translatable="yes">A major upgrade, with new features and added polish.</property>
+ <property name="wrap">True</property>
+ <property name="width-chars">40</property>
+ <property name="max-width-chars">48</property>
+ <property name="margin-bottom">32</property>
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+
+ <child>
+ <object class="GtkBox" id="box_upgrades_download">
+ <property name="orientation">vertical</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="spacing">12</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+
+ <child>
+ <object class="GtkButton" id="button_upgrades_download">
+ <property name="label" translatable="yes">_Download</property>
+ <property name="width_request">150</property>
+ <property name="can_focus">True</property>
+ <property name="use_underline">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="circular"/>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_download_info">
+ <property name="label"></property> <!-- set in the code -->
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_upgrades_downloading">
+ <property name="orientation">horizontal</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="valign">end</property>
+ <property name="spacing">12</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrades_downloading_spacer">
+ <property name="label"></property> <!-- space-taker -->
+ <property name="halign">start</property>
+ <property name="margin-start">2</property>
+ <property name="margin-end">2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox_upgrades_downloading">
+ <property name="orientation">vertical</property>
+ <property name="halign">fill</property>
+ <property name="hexpand">True</property>
+ <property name="valign">center</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrades_downloading">
+ <property name="label"></property> <!-- set in the code -->
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ <attribute name="font-features" value="tnum=1"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="fraction">0.3</property>
+ <property name="width-request">340</property>
+ <style>
+ <class name="upgrade-progressbar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkButton" id="button_upgrades_cancel">
+ <property name="can_focus">True</property>
+ <property name="use_underline">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">2</property>
+ <property name="margin-end">2</property>
+ <style>
+ <class name="circular"/>
+ </style>
+ <child>
+ <object class="GtkImage" id="button_upgrades_cancel_image">
+ <property name="icon-name">window-close-symbolic</property>
+ <property name="icon-size">normal</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_upgrades_install">
+ <property name="orientation">vertical</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="spacing">12</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+ <style>
+ <class name="upgrade-buttons"/>
+ </style>
+ <child>
+ <object class="GtkButton" id="button_upgrades_install">
+ <property name="label" translatable="yes">_Restart &amp; Upgrade</property>
+ <property name="name">button_upgrades_install</property>
+ <property name="can_focus">True</property>
+ <property name="use_underline">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="circular"/>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_warning">
+ <property name="label" translatable="yes">Remember to back up data and files before upgrading.</property>
+ <property name="halign">center</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup">
+ <property name="mode">horizontal</property>
+ <widgets>
+ <widget name="label_upgrades_downloading_spacer"/>
+ <widget name="button_upgrades_cancel"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/src/gs-vendor.c b/src/gs-vendor.c
new file mode 100644
index 0000000..bc4bc27
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#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..68c2521
--- /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 <richard@hughsie.com>
+ * Copyright (C) 2015 Kalev Lember <klember@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+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..e7f5c48
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,312 @@
+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'
+)
+
+enums = gnome.mkenums_simple('gs-enums',
+ sources : [
+ 'gs-context-dialog-row.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-bar.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-metered-data-dialog.c',
+ 'gs-moderate-page.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-update-dialog.c',
+ 'gs-update-list.c',
+ 'gs-update-monitor.c',
+ 'gs-updates-page.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('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'
+ )
+ gnome_software_sources += gnome.gdbus_codegen(
+ 'gs-packagekit-modify2-generated',
+ 'org.freedesktop.PackageKit.Modify2.xml',
+ interface_prefix : 'org.freedesktop.',
+ namespace : 'Gs'
+ )
+ gnome_software_dependencies += [packagekit]
+endif
+
+if gsettings_desktop_schemas.found()
+ gnome_software_dependencies += [gsettings_desktop_schemas]
+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
+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')
+ 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,
+ gsettings_desktop_schemas,
+ gtk,
+ json_glib,
+ 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..1e8fb7d
--- /dev/null
+++ b/src/org.freedesktop.PackageKit.Modify2.xml
@@ -0,0 +1,560 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" [
+ <!ENTITY ERROR_GENERAL "org.freedesktop.PackageKit.Denied">
+]>
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+
+ <interface name="org.freedesktop.PackageKit.Modify2">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The interface used for modifying the package database (version 2).
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallPackageFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs local package files or service packs.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An interaction mode that specifies which UI elements should be shown
+ or hidden different from the user default, e.g.
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress</doc:tt>.
+ The show options are:
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>.
+ The hide options are:
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning</doc:tt>.
+ Convenience options such as:
+ <doc:tt>never</doc:tt>, <doc:tt>defaults</doc:tt> or <doc:tt>always</doc:tt>.
+ are also available.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallProvideFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs packages to provide files.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallPackageNames">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs packages from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="packages" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of package names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallMimeTypes">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs mimetype handlers from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="mime_types" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of mime types, e.g. <doc:tt>text/plain</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallFontconfigResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs fontconfig resources (usually fonts) from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of font descriptors from fontconfig, e.g. <doc:tt>:lang=mn</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallGStreamerResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs GStreamer fontconfig resources (usually codecs) from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of codecs descriptors from <doc:tt>pk-gstreamer-install</doc:tt>, e.g.
+ <doc:tt>Advanced Streaming Format (ASF) demuxer|decoder-video/x-ms-asf</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs resources of a given type from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="s" name="type" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The type of resource to request, e.g. <doc:tt>plasma-service</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of resource descriptors
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="RemovePackageByFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Removes packages that provide the given local files.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An interaction mode that specifies which UI elements should be shown
+ or hidden different from the user default, e.g.
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress</doc:tt>.
+ The show options are:
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>.
+ The hide options are:
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning</doc:tt>.
+ Convenience options such as:
+ <doc:tt>never</doc:tt>, <doc:tt>defaults</doc:tt> or <doc:tt>always</doc:tt>.
+ are also available.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <method name="InstallPrinterDrivers">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs printer drivers from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of printer model descriptors in IEEE 1284
+ Device ID format,
+ e.g. <doc:tt>MFG:Hewlett-Packard;MDL:HP LaserJet
+ 6MP;</doc:tt>.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="desktop_id" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The desktop file ID of the calling application.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="a{sv}" name="platform_data" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ 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:
+ <doc:tt>desktop-startup-id</doc:tt>: startup notification
+ identifier that is used to transfer focus to the software installer application;
+ 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.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <property name="DisplayName" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Translated, human readable name of the program implementing the interface, e.g. 'Software' for gnome-software.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ </interface>
+</node>
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 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" [
+ <!ENTITY ERROR_GENERAL "org.freedesktop.PackageKit.Denied">
+]>
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+
+ <interface name="org.freedesktop.PackageKit.Query">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The interface used for querying the package database.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+
+ <!--*****************************************************************************************-->
+ <method name="IsInstalled">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Finds out if the package is installed.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="s" name="package_name" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ A package name, e.g. <doc:tt>hal-info</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>timeout=10</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="b" name="installed" direction="out">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ If the package is installed.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="SearchFile">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Finds the package name for an installed or available file
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="s" name="file_name" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ A package name, e.g. <doc:tt>/usr/share/help/gimp/index.html</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>timeout=10</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="b" name="installed" direction="out">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ If the package is installed.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="package_name" direction="out">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The package name of the file, e.g. <doc:tt>hal-info</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+ </interface>
+
+ <!-- ######################################################################################### -->
+ <interface name="org.freedesktop.PackageKit.Modify">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The interface used for modifying the package database.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallPackageFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs local package files or service packs.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An interaction mode that specifies which UI elements should be shown
+ or hidden different from the user default, e.g.
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress</doc:tt>.
+ The show options are:
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>.
+ The hide options are:
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning</doc:tt>.
+ Convenience options such as:
+ <doc:tt>never</doc:tt>, <doc:tt>defaults</doc:tt> or <doc:tt>always</doc:tt>.
+ are also available.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallProvideFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs packages to provide files.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallPackageNames">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs packages from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="packages" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of package names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallMimeTypes">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs mimetype handlers from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="mime_types" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of mime types, e.g. <doc:tt>text/plain</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallFontconfigResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs fontconfig resources (usually fonts) from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of font descriptors from fontconfig, e.g. <doc:tt>:lang=mn</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallGStreamerResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs GStreamer fontconfig resources (usually codecs) from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of codecs descriptors from <doc:tt>pk-gstreamer-install</doc:tt>, e.g.
+ <doc:tt>Advanced Streaming Format (ASF) demuxer|decoder-video/x-ms-asf</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="InstallResources">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs resources of a given type from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="type" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The type of resource to request, e.g. <doc:tt>plasma-service</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of resource descriptors
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <!--*****************************************************************************************-->
+ <method name="RemovePackageByFiles">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Removes packages that provide the given local files.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="files" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of file names.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An interaction mode that specifies which UI elements should be shown
+ or hidden different from the user default, e.g.
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,show-progress</doc:tt>.
+ The show options are:
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>.
+ The hide options are:
+ <doc:tt>hide-confirm-search,hide-confirm-deps,hide-confirm-install,hide-progress,hide-finished,hide-warning</doc:tt>.
+ Convenience options such as:
+ <doc:tt>never</doc:tt>, <doc:tt>defaults</doc:tt> or <doc:tt>always</doc:tt>.
+ are also available.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+
+ <method name="InstallPrinterDrivers">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Installs printer drivers from a configured software source.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ <arg type="u" name="xid" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ The X window handle ID, used for focus stealing prevention and setting modality.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="as" name="resources" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An array of printer model descriptors in IEEE 1284
+ Device ID format,
+ e.g. <doc:tt>MFG:Hewlett-Packard;MDL:HP LaserJet
+ 6MP;</doc:tt>.
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg type="s" name="interaction" direction="in">
+ <doc:doc>
+ <doc:summary>
+ <doc:para>
+ An optional interaction mode, e.g.
+ <doc:tt>show-confirm-search,show-confirm-deps,show-confirm-install,show-progress,show-finished,show-warning</doc:tt>
+ </doc:para>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ </method>
+ </interface>
+</node>
+
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..ff5802a
--- /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 application. 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@
+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 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<!--
+ 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 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, see <http://www.gnu.org/licenses/>.
+-->
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name='org.gnome.Shell.SearchProvider2'>
+ <method name='GetInitialResultSet'>
+ <arg type='as' name='Terms' direction='in' />
+ <arg type='as' name='Results' direction='out' />
+ </method>
+ <method name = 'GetSubsearchResultSet'>
+ <arg type='as' name='PreviousResults' direction='in' />
+ <arg type='as' name='Terms' direction='in' />
+ <arg type='as' name='Results' direction='out' />
+ </method>
+ <method name = 'GetResultMetas'>
+ <arg type='as' name='Results' direction='in' />
+ <arg type='aa{sv}' name='Metas' direction='out' />
+ </method>
+ <method name = 'ActivateResult'>
+ <arg type='s' name='Result' direction='in' />
+ <arg type='as' name='Terms' direction='in' />
+ <arg type='u' name='Timestamp' direction='in' />
+ </method>
+ <method name = 'LaunchSearch'>
+ <arg type='as' name='Terms' direction='in' />
+ <arg type='u' name='Timestamp' direction='in' />
+ </method>
+ </interface>
+</node>
diff --git a/src/style-dark.css b/src/style-dark.css
new file mode 100644
index 0000000..4c9ba8c
--- /dev/null
+++ b/src/style-dark.css
@@ -0,0 +1,114 @@
+.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.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..767cbe8
--- /dev/null
+++ b/src/style-hc.css
@@ -0,0 +1,38 @@
+.installed-overlay-box {
+ text-shadow: none;
+}
+
+.category-tile:not(.category-tile-iconless) {
+ box-shadow: inset 0 0 0 1px alpha(@card_fg_color, .5);
+}
+
+.application-details-infobar.info {
+ background-color: #d3d7cf;
+ border-color: darker(#d3d7cf);
+}
+
+.application-details-infobar.warning {
+ color: @theme_fg_color;
+}
+
+review-bar,
+.review-histogram star-image {
+ color: alpha(@theme_fg_color, .8);
+}
+
+star-image {
+ color: inherit;
+}
+
+.origin-rounded-box {
+ box-shadow: inset 0 0 0 1px currentColor;
+}
+
+.context-tile-lozenge {
+ box-shadow: inset 0 0 0 2px 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..b366208
--- /dev/null
+++ b/src/style.css
@@ -0,0 +1,580 @@
+.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;
+}
+
+.screenshot-image-main .image1, .screenshot-image-main .image2 {
+ margin-top: 6px;
+ margin-bottom: 12px;
+ margin-left: 6px;
+ margin-right: 6px;
+}
+
+.app-tile-label {
+ font-size: 105%;
+}
+
+.review-textbox {
+ padding: 6px;
+}
+
+.origin-rounded-box {
+ background-color: alpha(currentColor, .15);
+ border-radius: 999px;
+ padding: 4px;
+}
+
+.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 */
+}
+
+.application-details-infobar.info {
+ background-color: shade(@theme_bg_color, 0.9);
+ color: @theme_fg_color;
+ border-color: darker(shade(@theme_bg_color, 0.9));
+ border-style: solid;
+ border-width: 1px;
+}
+
+.application-details-infobar {
+ background-color: shade(@theme_bg_color, 0.9);
+ color: @theme_fg_color;
+ border-color: darker(shade(@theme_bg_color, 0.9));
+ border-style: solid;
+ border-width: 1px;
+}
+
+.application-details-infobar.warning {
+ background-color: #fcaf3e;
+ color: #2e3436;
+ border-color: darker(#fcaf3e);
+ border-style: solid;
+ border-width: 1px;
+}
+
+@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 {
+ color: @yellow_5;
+}
+
+.dimmer-label {
+ opacity: 0.25;
+}
+
+.update-failed-details {
+ font-family: Monospace;
+ font-size: smaller;
+ padding: 16px;
+}
+
+.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 {
+ 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;
+}
+
+/* Increase the spacing in the Update Preferences window between the label and
+ * the listbox. */
+
+.update-preferences preferencesgroup > box > box {
+ margin-top: 18px;
+}
+
+/* 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; }
+
+/* The following style is taken from libhandy's AdwStatusPage style.
+ * FIXME: Drop this style if AdwStatusPage or its GTK 4 successor allows setting
+ * a spinner and the updates spinner page can be ported to it. */
+
+clamp.status-page {
+ margin: 36px 12px;
+}
+
+clamp.status-page .iconbox {
+ min-height: 128px;
+ min-width: 128px;
+}
+
+clamp.status-page .icon {
+ color: alpha(@theme_fg_color, 0.5);
+ min-height: 32px;
+ min-width: 32px;
+}
+
+clamp.status-page .icon:not(:last-child) {
+ margin-bottom: 36px;
+}
+
+clamp.status-page .title:not(:last-child) {
+ margin-bottom: 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.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);
+}
+
+.eol-red {
+ font-weight: bold;
+ color: #ab3342;
+}
+
+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;
+}
+
+/************
+ * 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..6f0beb0
--- /dev/null
+++ b/subprojects/appstream.wrap
@@ -0,0 +1,5 @@
+[wrap-git]
+directory = appstream
+url = https://github.com/ximion/appstream.git
+revision = v0.14.1
+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 @@
+<?xml version='1.0' encoding='utf-8'?>
+<components version="0.15">
+ <component type="web-application">
+ <launchable type="url">https://app.diagrams.net/</launchable>
+ <url type="homepage">https://app.diagrams.net/</url>
+ <project_license>Apache-2.0</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Diagrams</name>
+ <id>org.gnome.Software.WebApp_527a2dd6729c3574227c145bbc447997f0048537.desktop</id>
+ <icon type="remote" width="512" height="512">https://app.diagrams.net/images/android-chrome-512x512.png</icon>
+ <categories>
+ <category>Graphics</category>
+ <category>Office</category>
+ <category>FlowChart</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">mild</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>diagrams.net is a completely free diagram editor</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://pinafore.social/</launchable>
+ <url type="homepage">https://pinafore.social/</url>
+ <project_license>AGPL-3.0-only</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Pinafore</name>
+ <id>org.gnome.Software.WebApp_e636aa5f2069f6e9c02deccc7b65f43da7985e32.desktop</id>
+ <icon type="remote" width="48" height="48">https://pinafore.social/icon-48.png</icon>
+ <icon type="remote" width="72" height="72">https://pinafore.social/icon-72.png</icon>
+ <icon type="remote" width="96" height="96">https://pinafore.social/icon-96.png</icon>
+ <icon type="remote" width="144" height="144">https://pinafore.social/icon-144.png</icon>
+ <icon type="remote" width="192" height="192">https://pinafore.social/icon-192.png</icon>
+ <icon type="remote" width="512" height="512">https://pinafore.social/icon-512.png</icon>
+ <icon type="remote" width="44" height="44">https://pinafore.social/icon-44.png</icon>
+ <icon type="remote" width="50" height="50">https://pinafore.social/icon-50.png</icon>
+ <icon type="remote" width="150" height="150">https://pinafore.social/icon-150.png</icon>
+ <screenshots>
+ <screenshot type="default">
+ <image width="540" height="720">https://pinafore.social/screenshot-540-720-1.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="540" height="720">https://pinafore.social/screenshot-540-720-2.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="540" height="720">https://pinafore.social/screenshot-540-720-3.png</image>
+ </screenshot>
+ </screenshots>
+ <categories>
+ <category>Chat</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-audio">intense</content_attribute>
+ <content_attribute id="social-info">none</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>An alternative web client for Mastodon, focused on speed and simplicity</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://snapdrop.net/</launchable>
+ <url type="homepage">https://snapdrop.net/</url>
+ <project_license>GPL-3.0-only</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Snapdrop</name>
+ <id>org.gnome.Software.WebApp_4dda9043da5b2d2aa57c6064c907c1ae3fe58941.desktop</id>
+ <icon type="remote" width="192" height="192">https://snapdrop.net/images/android-chrome-192x192.png</icon>
+ <icon type="remote" width="512" height="512">https://snapdrop.net/images/android-chrome-512x512.png</icon>
+ <icon type="remote" width="96" height="96">https://snapdrop.net/images/favicon-96x96.png</icon>
+ <categories>
+ <category>FileTransfer</category>
+ <category>Utility</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">mild</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Local network file sharing in your browser</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://stackedit.io/app</launchable>
+ <url type="homepage">https://stackedit.io/app</url>
+ <project_license>Apache-2.0</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>StackEdit</name>
+ <id>org.gnome.Software.WebApp_e7aada0261449b5239c5c458c48fe92717950d1a.desktop</id>
+ <icon type="remote" width="512" height="512">https://stackedit.io/icon_512x512.bc1452c3b77b59eb0d8c449de1c77310.png</icon>
+ <icon type="remote" width="384" height="384">https://stackedit.io/icon_384x384.3f55b77300c8b37b4aa380c8460ee0a2.png</icon>
+ <icon type="remote" width="256" height="256">https://stackedit.io/icon_256x256.f406288343ae34c5c7bd1543700c2ac0.png</icon>
+ <icon type="remote" width="192" height="192">https://stackedit.io/icon_192x192.eec0feaecc5bef1a499b3de11bde6b27.png</icon>
+ <icon type="remote" width="128" height="128">https://stackedit.io/icon_128x128.43ad56ce3535a3ffe333a76a05c13267.png</icon>
+ <icon type="remote" width="96" height="96">https://stackedit.io/icon_96x96.1d93fc90dc62ceec6c921786ddab3f69.png</icon>
+ <categories>
+ <category>TextEditor</category>
+ <category>Utility</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">mild</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Full-featured, open-source Markdown editor</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://squoosh.app/</launchable>
+ <url type="homepage">https://squoosh.app/</url>
+ <project_license>Apache-2.0</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Squoosh</name>
+ <id>org.gnome.Software.WebApp_e41134be0ce95da0832878faa90cf3473b1b52d7.desktop</id>
+ <icon type="remote" width="1024" height="1024">https://squoosh.app/c/icon-large-cb438cac.png</icon>
+ <screenshots>
+ <screenshot type="default">
+ <image width="540" height="720">https://squoosh.app/c/screenshot1-0ff68546.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="540" height="720">https://squoosh.app/c/screenshot2-1f78c4db.jpg</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="540" height="720">https://squoosh.app/c/screenshot3-c1e02216.jpg</image>
+ </screenshot>
+ </screenshots>
+ <categories>
+ <category>FileTools</category>
+ <category>Utility</category>
+ <category>ImageProcessing</category>
+ <category>Photography</category>
+ <category>Office</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">moderate</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Compress and compare images with different codecs, right in your browser</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://excalidraw.com/</launchable>
+ <url type="homepage">https://excalidraw.com/</url>
+ <project_license>MIT</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Excalidraw</name>
+ <id>org.gnome.Software.WebApp_ea52ad18346faac27072cd1654243dfb7c70ef14.desktop</id>
+ <icon type="remote" width="180" height="180">https://excalidraw.com/logo-180x180.png</icon>
+ <icon type="remote" width="256" height="256">https://excalidraw.com/apple-touch-icon.png</icon>
+ <screenshots>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/virtual-whiteboard.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/wireframe.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/illustration.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/shapes.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/collaboration.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="462" height="945">https://excalidraw.com/screenshots/export.png</image>
+ </screenshot>
+ </screenshots>
+ <categories>
+ <category>Office</category>
+ <category>Education</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">moderate</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://discourse.gnome.org/</launchable>
+ <url type="homepage">https://discourse.gnome.org/</url>
+ <project_license>GPL-2.0-or-later</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>GNOME</name>
+ <id>org.gnome.Software.WebApp_dd7b0c5ff0c21c2984f8fc1a05d01c33aee4fe9d.desktop</id>
+ <icon type="remote" width="512" height="512">https://discourse.gnome.org/uploads/default/optimized/1X/d7f8fbabd4cd13f5fdbf7c73bd203723a2ef36ea_2_512x512.png</icon>
+ <categories>
+ <category>Chat</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">moderate</content_attribute>
+ <content_attribute id="social-audio">moderate</content_attribute>
+ <content_attribute id="social-contacts">intense</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>GNOME Project and Community related discussions</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://discourse.flathub.org/</launchable>
+ <url type="homepage">https://discourse.flathub.org/</url>
+ <project_license>GPL-2.0-or-later</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Flathub</name>
+ <id>org.gnome.Software.WebApp_02310f2fd700a63d17ecc2d4b261f6956d8a0193.desktop</id>
+ <icon type="remote" width="512" height="512">https://discourse-flathub-org-uploads.s3.dualstack.us-east-1.amazonaws.com/optimized/1X/be4563846333bda6607c6c3c5b226dff9d213866_2_512x512.png</icon>
+ <categories>
+ <category>Chat</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">moderate</content_attribute>
+ <content_attribute id="social-audio">moderate</content_attribute>
+ <content_attribute id="social-contacts">intense</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>A place for Flathub Contributors and Users</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://devdocs.io/</launchable>
+ <url type="homepage">https://devdocs.io/</url>
+ <project_license>MPL-2.0</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>DevDocs</name>
+ <id>org.gnome.Software.WebApp_962f69328d6450369f25a6fdb6bbd1764d11a3c8.desktop</id>
+ <icon type="remote" width="32" height="32">https://devdocs.io/images/webapp-icon-32.png</icon>
+ <icon type="remote" width="60" height="60">https://devdocs.io/images/webapp-icon-60.png</icon>
+ <icon type="remote" width="80" height="80">https://devdocs.io/images/webapp-icon-80.png</icon>
+ <icon type="remote" width="128" height="128">https://devdocs.io/images/webapp-icon-128.png</icon>
+ <icon type="remote" width="192" height="192">https://devdocs.io/images/webapp-icon-192.png</icon>
+ <icon type="remote" width="256" height="256">https://devdocs.io/images/webapp-icon-256.png</icon>
+ <icon type="remote" width="512" height="512">https://devdocs.io/images/webapp-icon-512.png</icon>
+ <categories>
+ <category>Documentation</category>
+ <category>Development</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">moderate</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>API Documentation Browser</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://web.telegram.org/</launchable>
+ <url type="homepage">https://web.telegram.org/</url>
+ <project_license>GPL-3.0-only</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Telegram</name>
+ <id>org.gnome.Software.WebApp_78977f7aec98d1c072a768b6a366b8d99cde8df4.desktop</id>
+ <icon type="remote" width="16" height="16">https://web.telegram.org/img/icons/icon16.png</icon>
+ <icon type="remote" width="32" height="32">https://web.telegram.org/img/icons/icon32.png</icon>
+ <icon type="remote" width="60" height="60">https://web.telegram.org/img/icons/icon60.png</icon>
+ <icon type="remote" width="64" height="64">https://web.telegram.org/img/icons/icon64.png</icon>
+ <icon type="remote" width="90" height="90">https://web.telegram.org/img/icons/icon90.png</icon>
+ <icon type="remote" width="128" height="128">https://web.telegram.org/img/icons/icon128.png</icon>
+ <icon type="remote" width="192" height="192">https://web.telegram.org/img/icons/icon192.png</icon>
+ <icon type="remote" width="512" height="512">https://web.telegram.org/img/icons/icon512.png</icon>
+ <icon type="remote" width="513" height="513">https://web.telegram.org/img/icons/icon.svg</icon>
+ <categories>
+ <category>Chat</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">mild</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Telegram web app based on the MTProto protocol and Telegram's open API</summary>
+ </component>
+</components>
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 @@
+<?xml version='1.0' encoding='utf-8'?>
+<components version="0.15">
+ <component type="web-application">
+ <launchable type="url">https://twitter.com/</launchable>
+ <url type="homepage">https://twitter.com/</url>
+ <project_license>LicenseRef-proprietary</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Twitter</name>
+ <id>org.gnome.Software.WebApp_5ea0d5a0681e425022d889f3e355de2f19f92070.desktop</id>
+ <icon type="remote" width="192" height="192">https://abs.twimg.com/responsive-web/client-web-legacy/icon-default.ee534d85.png</icon>
+ <icon type="remote" width="512" height="512">https://abs.twimg.com/responsive-web/client-web-legacy/icon-default-large.8e027b65.png</icon>
+ <screenshots>
+ <screenshot type="default">
+ <image width="586" height="1041">https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-data-saver-marketing.68059865.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="586" height="1041">https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-explore-marketing.fd45b025.png</image>
+ </screenshot>
+ <screenshot type="default">
+ <image width="586" height="1041">https://abs.twimg.com/responsive-web/client-web-legacy/twitter-lite-timeline-marketing.befcdb45.png</image>
+ </screenshot>
+ </screenshots>
+ <categories>
+ <category>Chat</category>
+ <category>News</category>
+ <category>News</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">intense</content_attribute>
+ <content_attribute id="social-audio">moderate</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <control>touch</control>
+ <display_length compare="ge">small</display_length>
+ </recommends>
+ <summary>Get breaking news, politics, trending music, world events, sports scores, and the latest global news stories as they unfold - all with less data</summary>
+ </component>
+ <component type="web-application">
+ <launchable type="url">https://www.photopea.com/</launchable>
+ <url type="homepage">https://www.photopea.com/</url>
+ <project_license>LicenseRef-proprietary</project_license>
+ <metadata_license>FSFAP</metadata_license>
+ <name>Photopea</name>
+ <id>org.gnome.Software.WebApp_b38ea26683d13dabcfbbc10824fcd7f3b88af94b.desktop</id>
+ <icon type="remote" width="512" height="512">https://www.photopea.com/promo/icon512.png</icon>
+ <categories>
+ <category>Photography</category>
+ <category>ImageProcessing</category>
+ </categories>
+ <content_rating type="oars-1.1">
+ <content_attribute id="social-info">intense</content_attribute>
+ </content_rating>
+ <recommends>
+ <control>pointing</control>
+ <control>keyboard</control>
+ <display_length compare="ge">medium</display_length>
+ </recommends>
+ <summary>Photopea is an advanced photo editor supporting PSD, XCF, Sketch, XD, and CDR formats</summary>
+ </component>
+</components>
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..38d4770
--- /dev/null
+++ b/subprojects/gtk.wrap
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=gtk
+url=https://gitlab.gnome.org/GNOME/gtk.git
+revision=4.6.0
+depth=1
diff --git a/subprojects/libadwaita.wrap b/subprojects/libadwaita.wrap
new file mode 100644
index 0000000..6831248
--- /dev/null
+++ b/subprojects/libadwaita.wrap
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=libadwaita
+url=https://gitlab.gnome.org/GNOME/libadwaita.git
+revision=1.0.1
+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("<Esc>")
+ 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")